shreyasiv's picture
Update app.py
1025165
raw
history blame
3.36 kB
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.")