字节笔记本字节笔记本

如何将 YouTube 视频中的音频内容转换为文本,以及如何基于这些文本构建一个聊天:问答应用程序?

2023-06-21

本文介绍了如何使用 `yt_dlp`、`pydub` 和 OpenAI Whisper API 将 YouTube 视频的音频转换为文本,并利用这些文本构建一个基于 OpenAI 模型的聊天问答应用程序。

我们将使用 OpenAIWhisperParser,该解析器将使用 OpenAI Whisper API 将音频转录为文本。

注意:你需要提供一个 OPENAI_API_KEY。

我们首先使用 yt_dlppydub 来从 YouTube URL 下载并切分音频文件。

然后我们使用 YoutubeAudioLoader 和 OpenAIWhisperParser 将音频文件转录为文本。

以 Andrej Karpathy 的 YouTube 课程的第一讲为例:

# 两个 Karpathy 的讲座视频
urls = ["https://youtu.be/kCc8FmEb1nY", "https://youtu.be/VMj-3S1tku0"]

# 保存音频文件的目录
save_dir = "~/Downloads/YouTube"

# 将视频转录为文本
loader = GenericLoader(YoutubeAudioLoader(urls, save_dir), OpenAIWhisperParser())
docs = loader.load()

然后,我们将得到的文档(音频转录)合并成一个文本字符串,将其切分成小块,用 OpenAIEmbeddings 构建一个索引,然后使用这个索引和 ChatOpenAI 模型构建一个问答链。

# 将文档合并
combined_docs = [doc.page_content for doc in docs]
text = " ".join(combined_docs)

# 切分文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
splits = text_splitter.split_text(text)

# 构建索引
embeddings = OpenAIEmbeddings()
vectordb = FAISS.from_texts(splits, embeddings)

# 构建一个 QA 链
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0),
    chain_type="stuff",
    retriever=vectordb.as_retriever(),
)

现在你可以通过 QA 链提问问题了:

query = "我们为什么需要在每一步的反向传播之前将梯度归零?"
qa_chain.run(query)
# 返回: "我们需要在每一步的反向传播之前将梯度归零,因为反向传播会在每个参数的 grad 属性中积累梯度。如果我们不在每次反向传播之前将 grad 归零,梯度就会积累并增加,导致更新不正确和收敛速度变慢。通过在每次反向传播之前将 grad 归零,我们可以确保梯度被正确计算,优化过程能够按预期进行。"

以上就是从 YouTube 视频到文本,再到聊天/问答应用的整个过程。