Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from youtube_transcript_api import YouTubeTranscriptApi | |
| import re | |
| from dotenv import load_dotenv | |
| import os | |
| import openai | |
| import tempfile | |
| from pydub import AudioSegment | |
| import io | |
| # Load environment variables | |
| load_dotenv() | |
| # Set up OpenAI API key | |
| openai.api_key = os.getenv('OPENAI_API_KEY') | |
| if not openai.api_key: | |
| raise ValueError("API key is not set. Please check your .env file and ensure OPENAI_API_KEY is set.") | |
| def convert_to_supported_format(file): | |
| audio = AudioSegment.from_file(file) | |
| buffer = io.BytesIO() | |
| audio.export(buffer, format="mp3") | |
| buffer.seek(0) | |
| return buffer | |
| 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 transcribe_audio(file): | |
| file = convert_to_supported_format(file) | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_file: | |
| temp_file.write(file.getvalue()) | |
| temp_file_path = temp_file.name | |
| try: | |
| with open(temp_file_path, "rb") as audio_file: | |
| transcript = openai.Audio.transcribe("whisper-1", audio_file) | |
| return transcript["text"] | |
| except Exception as e: | |
| return f"Error in transcription: {str(e)}" | |
| finally: | |
| os.remove(temp_file_path) | |
| def answer_question(transcript, question): | |
| try: | |
| response = openai.ChatCompletion.create( | |
| model="gpt-3.5-turbo", | |
| messages=[ | |
| {"role": "system", "content": "You are a helpful assistant."}, | |
| {"role": "user", "content": f"Using the following transcript as context, please answer the question:\n\nTranscript:\n{transcript}\n\nQuestion:\n{question}"} | |
| ], | |
| max_tokens=150 | |
| ) | |
| if response.choices and response.choices[0].message: | |
| answer = response.choices[0].message.content.strip() | |
| return answer | |
| else: | |
| return "No answer available." | |
| except Exception as e: | |
| return f"Error in answering question: {str(e)}" | |
| def handle_query(transcript, question): | |
| if "Error" in transcript: | |
| return transcript | |
| answer = answer_question(transcript, question) | |
| return answer | |
| st.title("Video/Audio Doubt Bot") | |
| 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 youtube_url: | |
| transcript = get_transcript(youtube_url) | |
| if "Error" in transcript: | |
| st.write(transcript) | |
| else: | |
| st.write("Transcript successfully loaded.") | |
| question = st.text_input("Ask a question about the video") | |
| if st.button("Get Answer"): | |
| answer = handle_query(transcript, question) | |
| st.write("### Answer") | |
| st.write(answer) | |
| elif option == "Upload audio/video file": | |
| uploaded_file = st.file_uploader("Choose an audio or video file", type=["mp3", "mp4", "wav"]) | |
| if uploaded_file is not None: | |
| with st.spinner('Transcribing audio...'): | |
| transcript = transcribe_audio(uploaded_file) | |
| if "Error" in transcript: | |
| st.write(transcript) | |
| else: | |
| st.write("File successfully transcribed.") | |
| question = st.text_input("Ask a question about the audio/video") | |
| if st.button("Get Answer"): | |
| answer = handle_query(transcript, question) | |
| st.write("### Answer") | |
| st.write(answer) |