Insightly/transcript-generator
0
1import streamlit as st2import openai3from pytube import YouTube4import os5from pathlib import Path6import shutil7import whisper8from dotenv import load_dotenv9from zipfile import ZipFile10 11load_dotenv()12 13# Load OpenAI API key from .env14openai.api_key = os.getenv("OPENAI_API_KEY")15 16@st.cache_data17def load_model():18 model = whisper.load_model("base")19 return model20 21def save_audio(url):22 yt = YouTube(url)23 video = yt.streams.filter(only_audio=True).first()24 out_file = video.download()25 base, ext = os.path.splitext(out_file)26 file_name = base + '.mp3'27 try:28 os.rename(out_file, file_name)29 except WindowsError:30 os.remove(file_name)31 os.rename(out_file, file_name)32 audio_filename = Path(file_name).stem+'.mp3'33 print(yt.title + " Has been successfully downloaded")34 print(file_name)35 return yt.title, audio_filename36 37def audio_to_transcript(audio_file):38 model = load_model()39 result = model.transcribe(audio_file)40 transcript = result["text"]41 return transcript42 43def text_to_news_article(text):44 response = openai.Completion.create(45 model="text-davinci-003",46 prompt="Write a news article in 500 words from the below text:\n" + text,47 temperature=0.7,48 max_tokens=600,49 top_p=1,50 frequency_penalty=0,51 presence_penalty=052 )53 return response['choices'][0]['text']54 55def answer_question(question, context):56 response = openai.Completion.create(57 engine="text-davinci-003",58 prompt=f"Q: {question}\nContext: {context}\nAnswer:",59 temperature=0.7,60 max_tokens=150,61 top_p=1,62 frequency_penalty=0,63 presence_penalty=0,64 )65 answer = response.choices[0].text66 return answer67 68st.markdown('# Generate and Chat with Transcripts')69 70st.header('Input the Video URL')71 72url_link = st.text_input('Enter URL of YouTube video:')73 74if st.checkbox('Start Analysis'):75 video_title, audio_filename = save_audio(url_link)76 st.audio(audio_filename)77 transcript = audio_to_transcript(audio_filename)78 if not transcript:79 st.error("Transcript generation failed. Please try another video or check the input.")80 else:81 st.header("Transcript")82 st.success(transcript)83 st.header("News Article")84 result = text_to_news_article(transcript)85 st.success(result)86 87 # Save the files88 transcript_txt = open('transcript.txt', 'w')89 transcript_txt.write(transcript)90 transcript_txt.close()91 92 article_txt = open('article.txt', 'w')93 article_txt.write(result)94 article_txt.close()95 96 zip_file = ZipFile('output.zip', 'w')97 zip_file.write('transcript.txt')98 zip_file.write('article.txt')99 zip_file.close()100 101 with open("output.zip", "rb") as zip_download:102 btn = st.download_button(103 label="Download ZIP",104 data=zip_download,105 file_name="output.zip",106 mime="application/zip"107 )108 109st.header("Ask Questions")110user_question = st.text_input("Ask a question:")111if st.button("Get Answer"):112 if transcript:113 answer = answer_question(user_question, transcript)114 st.success("Answer: " + answer)115 else:116 st.error("No transcript available. Please analyze a video first.")117 