summary_bot / app.py
deadshot2003's picture
Update app.py
1b7c98d verified
import os
import io
import streamlit as st
from youtube_transcript_api import YouTubeTranscriptApi
import re
import logging
import warnings
from pydub import AudioSegment
import tempfile
from dotenv import load_dotenv
import openai
# Load environment variables
load_dotenv()
# Set up OpenAI API
openai.api_key = os.getenv("OPENAI_API_KEY")
# Set up logging
logging.basicConfig(level=logging.INFO)
def convert_to_supported_format(file):
audio = AudioSegment.from_file(file)
buffer = io.BytesIO()
audio.export(buffer, format="wav")
buffer.seek(0)
return buffer
def transcribe_audio(file):
logging.info("Transcribing audio file")
file = convert_to_supported_format(file)
logging.info("Converted file to WAV format")
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_file:
temp_file.write(file.getvalue())
temp_file_path = temp_file.name
try:
with warnings.catch_warnings():
warnings.simplefilter("ignore")
with open(temp_file_path, "rb") as audio_file:
transcript = openai.Audio.transcribe("whisper-1", audio_file)
return transcript["text"]
except Exception as e:
logging.error(f"Error in transcription: {str(e)}")
return f"Error in transcription: {str(e)}"
finally:
os.remove(temp_file_path)
def get_transcript(url):
try:
match = re.search(r"(?:v=|\/)([0-9A-Za-z_-]{11}).*", url)
if match:
video_id = match.group(1)
transcript = YouTubeTranscriptApi.get_transcript(video_id)
transcript_text = ' '.join([entry['text'] for entry in transcript])
return transcript_text
else:
return "No video ID found in URL."
except Exception as e:
return f"Error: {str(e)}"
def summarize_text(text):
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Please provide a concise summary of the following text:\n\n{text}"}
],
max_tokens=150
)
return response['choices'][0]['message']['content'].strip()
except Exception as e:
return f"Error in summarizing text: {str(e)}"
def handle_summary(transcript_text):
if "Error" in transcript_text:
return transcript_text
summary = summarize_text(transcript_text)
return summary
st.title("YouTube Summary Generator")
option = st.selectbox("Choose input type", ("YouTube URL", "Upload audio/video file"))
if option == "YouTube URL":
youtube_url = st.text_input("YouTube URL", placeholder="Enter YouTube URL here...")
if st.button("Generate Summary"):
transcript = get_transcript(youtube_url)
summary = handle_summary(transcript)
st.text_area("Summary", summary, height=200)
elif option == "Upload audio/video file":
uploaded_file = st.file_uploader("Choose an audio or video file", type=["mp3", "wav", "mp4", "mov"])
if uploaded_file is not None:
if st.button("Generate Summary"):
with st.spinner('Transcribing audio...'):
transcript_text = transcribe_audio(uploaded_file)
summary = handle_summary(transcript_text)
st.text_area("Summary", summary, height=200)