shreyasiv's picture
Update app.py
1025165
import streamlit as st
import openai
from pytube import YouTube
import os
from pathlib import Path
import shutil
import whisper
from dotenv import load_dotenv
from zipfile import ZipFile
load_dotenv()
# Load OpenAI API key from .env
openai.api_key = os.getenv("OPENAI_API_KEY")
@st.cache_data
def load_model():
model = whisper.load_model("base")
return model
def save_audio(url):
yt = YouTube(url)
video = yt.streams.filter(only_audio=True).first()
out_file = video.download()
base, ext = os.path.splitext(out_file)
file_name = base + '.mp3'
try:
os.rename(out_file, file_name)
except WindowsError:
os.remove(file_name)
os.rename(out_file, file_name)
audio_filename = Path(file_name).stem+'.mp3'
print(yt.title + " Has been successfully downloaded")
print(file_name)
return yt.title, audio_filename
def audio_to_transcript(audio_file):
model = load_model()
result = model.transcribe(audio_file)
transcript = result["text"]
return transcript
def text_to_news_article(text):
response = openai.Completion.create(
model="text-davinci-003",
prompt="Write a news article in 500 words from the below text:\n" + text,
temperature=0.7,
max_tokens=600,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response['choices'][0]['text']
def answer_question(question, context):
response = openai.Completion.create(
engine="text-davinci-003",
prompt=f"Q: {question}\nContext: {context}\nAnswer:",
temperature=0.7,
max_tokens=150,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
answer = response.choices[0].text
return answer
st.markdown('# Generate and Chat with Transcripts')
st.header('Input the Video URL')
url_link = st.text_input('Enter URL of YouTube video:')
if st.checkbox('Start Analysis'):
video_title, audio_filename = save_audio(url_link)
st.audio(audio_filename)
transcript = audio_to_transcript(audio_filename)
if not transcript:
st.error("Transcript generation failed. Please try another video or check the input.")
else:
st.header("Transcript")
st.success(transcript)
st.header("News Article")
result = text_to_news_article(transcript)
st.success(result)
# Save the files
transcript_txt = open('transcript.txt', 'w')
transcript_txt.write(transcript)
transcript_txt.close()
article_txt = open('article.txt', 'w')
article_txt.write(result)
article_txt.close()
zip_file = ZipFile('output.zip', 'w')
zip_file.write('transcript.txt')
zip_file.write('article.txt')
zip_file.close()
with open("output.zip", "rb") as zip_download:
btn = st.download_button(
label="Download ZIP",
data=zip_download,
file_name="output.zip",
mime="application/zip"
)
st.header("Ask Questions")
user_question = st.text_input("Ask a question:")
if st.button("Get Answer"):
if transcript:
answer = answer_question(user_question, transcript)
st.success("Answer: " + answer)
else:
st.error("No transcript available. Please analyze a video first.")