Spaces:
Sleeping
Sleeping
import openai | |
import os | |
from langchain.document_loaders import TextLoader, YoutubeLoader | |
#pytube, gradio, langchain, openai | |
import gradio as gr | |
from youtube_transcript_api import YouTubeTranscriptApi | |
from langchain.indexes import VectorstoreIndexCreator | |
from langchain.llms import OpenAI | |
OPENAI_API_KEY = os.environ['OPENAI_API_KEY'] | |
previous_youtube_url = None | |
index = None | |
def get_video_id(url): | |
video_id = None | |
if 'youtu.be' in url: | |
video_id = url.split('/')[-1] | |
else: | |
video_id = url.split('watch?v=')[-1] | |
return video_id | |
def get_captions(url): | |
try: | |
video_id = get_video_id(url) | |
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id) | |
transcript = transcript_list.find_transcript(['en']) | |
captions = transcript.fetch() | |
formatted_captions = '' | |
for caption in captions: | |
formatted_captions += caption['text'] + ' ' | |
return formatted_captions | |
except Exception as e: | |
print(e) | |
return "Error. Could not fetch captions." | |
def answer_question(youtube_url, user_question): | |
# You can implement your logic here to process the video, transcribe it, and answer the user question. | |
# For now, let's return the user question as output. | |
global previous_youtube_url | |
global index | |
query = ''' | |
You are an expert researcher that can answer any questions from a given text. Here is the question: | |
{} | |
'''.format(str(user_question)) | |
if previous_youtube_url == youtube_url: | |
#index = VectorstoreIndexCreator().from_loaders([loader]) | |
#query = user_question | |
answer = index.query(llm=OpenAI(model="text-davinci-003"), question = query) | |
else: | |
f= open("temp.txt","w+") | |
f.write(get_captions(youtube_url)) | |
f.close() | |
loader = TextLoader("temp.txt") | |
index = VectorstoreIndexCreator().from_loaders([loader]) | |
os.remove("temp.txt") | |
#query = user_question | |
answer = index.query(llm=OpenAI(model="text-davinci-003"), question = query) | |
return answer | |
iface = gr.Interface( | |
fn=answer_question, | |
inputs=[ | |
gr.Textbox(lines=1, placeholder="Enter YouTube URL here..."), | |
gr.Textbox(lines=1, placeholder="Enter your question here...") | |
], | |
outputs=gr.Textbox(), | |
title="YouTube Video Question Answering", | |
description="Enter a YouTube URL and a question related to the video content. The app will return the answer if answer exists in the video." | |
) | |
if __name__ == "__main__": | |
iface.launch() | |