从PDF文章生成幻灯片和演讲视频
和大多数人一样,NotebookLM 及其从一组文档生成播客的能力让我大吃一惊。然后,我开始思考:“他们是如何做到这一点的,我在哪里可以获得这种魔力?”复制起来有多容易?
1、目标:根据文章创建视频演讲
我不想创建播客,但我经常希望能够从我的博客文章中生成幻灯片和视频演讲——有些人喜欢翻阅幻灯片,而另一些人则喜欢观看视频,这将是与他们见面的好方法。在本文中,我将向你展示如何做到这一点。
本文的完整代码位于 GitHub 上——如果你想跟着我一起学习的话。本文的目标是根据这篇文章创建视频,结果视频请访问这里。
2、初始化 LLM
我将使用 Google Gemini Flash,因为 (a) 它是目前最便宜的前沿 LLM,(b) 它是多模式的,因为它也可以读取和理解图像,并且 (c) 它支持受控生成,这意味着我们可以确保 LLM 的输出与所需的结构相匹配。
import pdfkit
import os
import google.generativeai as genai
from dotenv import load_dotenv
load_dotenv("../genai_agents/keys.env")
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
请注意,我使用的是 Google Generative AI,而不是 Google Cloud Vertex AI。这两个包是不同的。Google Generative AI支持 Pydantic 对象进行受控生成;Vertex AI 目前仅支持 JSON。
3、获取文章的 PDF
我使用 Python 下载了文章的 PDF 版本,并将其上传到 Gemini 可以读取的临时存储位置:
ARTICLE_URL = "https://lakshmanok.medium...."
pdfkit.from_url(ARTICLE_URL, "article.pdf")
pdf_file = genai.upload_file("article.pdf")
不幸的是,medium 的某些功能阻止 pdfkit 获取文章中的图像(可能是因为它们是 webm 而不是 png...)。因此,我的幻灯片将仅基于文章的文本,而不是图像。
4、以 JSON 格式创建讲义
在这里,我想要的数据格式是一组幻灯片,每个幻灯片都有标题、要点和一组讲义。整个讲座也有一个标题和归属:
class Slide(BaseModel):
title: str
key_points: List[str]
lecture_notes: str
class Lecture(BaseModel):
slides: List[Slide]
lecture_title: str
based_on_article_by: str
让我们告诉 Gemini 我们想要它做什么:
lecture_prompt = """
You are a university professor who needs to create a lecture to
a class of undergraduate students.
* Create a 10-slide lecture based on the following article.
* Each slide should contain the following information:
- title: a single sentence that summarizes the main point
- key_points: a list of between 2 and 5 bullet points. Use phrases, not full sentences.
- lecture_notes: 3-10 sentences explaining the key points in easy-to-understand language. Expand on the points using other information from the article.
* Also, create a title for the lecture and attribute the original article's author.
"""
提示非常简单 - 询问 Gemini阅读文章、提取要点并创建讲义。
现在,调用模型,传入 PDF 文件并要求其填充所需的结构:
model = genai.GenerativeModel(
"gemini-1.5-flash-001",
system_instruction=[lecture_prompt]
)
generation_config={
"temperature": 0.7,
"response_mime_type": "application/json",
"response_schema": Lecture
}
response = model.generate_content(
[pdf_file],
generation_config=generation_config,
stream=False
)
关于上面的代码需要注意几点:
- 我们将提示作为系统提示传入,这样我们就不需要在输入新内容时继续发送提示。
- 我们将所需的响应类型指定为 JSON,并将模式指定为 Pydantic 对象
我们将 PDF 文件发送给模型并告诉它生成响应。我们将等待它完成(无需流式传输)
结果是 JSON,因此将其提取到 Python 对象中:
lecture = json.loads(response.text)
例如,第 3 张幻灯片如下所示:
{'key_points': [
'Silver layer cleans, structures, and prepares data for self-service analytics.',
'Data is denormalized and organized for easier use.',
'Type 2 slowly changing dimensions are handled in this layer.',
'Governance responsibility lies with the source team.'
],
'lecture_notes': 'The silver layer takes data from the bronze layer and transforms it into a usable format for self-service analytics. This involves cleaning, structuring, and organizing the data. Type 2 slowly changing dimensions, which track changes over time, are also handled in this layer. The governance of the silver layer rests with the source team, which is typically the data engineering team responsible for the source system.',
'title': 'The Silver Layer: Data Transformation and Preparation'
}
5、转换为 PowerPoint
我们可以使用 Python 包 pptx 创建带有注释和项目符号的演示文稿。创建幻灯片的代码如下所示:
for slidejson in lecture['slides']:
slide = presentation.slides.add_slide(presentation.slide_layouts[1])
title = slide.shapes.title
title.text = slidejson['title']
# bullets
textframe = slide.placeholders[1].text_frame
for key_point in slidejson['key_points']:
p = textframe.add_paragraph()
p.text = key_point
p.level = 1
# notes
notes_frame = slide.notes_slide.notes_text_frame
notes_frame.text = slidejson['lecture_notes']
结果是一个 PowerPoint 演示文稿,如下所示:
虽然不是很花哨,但如果你要演讲,这绝对是一个很好的编辑起点。
6、大声朗读笔记并保存音频
好吧,我们受到了播客的启发,所以让我们看看如何创建某人总结文章的音频。
我们已经有了讲义,所以让我们为每张幻灯片创建音频文件。
这是获取一些文本并让 AI 语音读出的代码。我们将生成的音频保存到 mp3 文件中:
from google.cloud import texttospeech
def convert_text_audio(text, audio_mp3file):
"""Synthesizes speech from the input string of text."""
tts_client = texttospeech.TextToSpeechClient()
input_text = texttospeech.SynthesisInput(text=text)
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
name="en-US-Standard-C",
ssml_gender=texttospeech.SsmlVoiceGender.FEMALE,
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.MP3
)
response = tts_client.synthesize_speech(
request={"input": input_text, "voice": voice, "audio_config": audio_config}
)
# The response's audio_content is binary.
with open(audio_mp3file, "wb") as out:
out.write(response.audio_content)
print(f"{audio_mp3file} written.")
上面的代码解释如下:
- 我们使用 Google Cloud 的文本转语音 API
- 要求它使用标准的美国口音女性声音。如果你正在制作播客,可以在此处传入“说话人字典”,每个说话人对应一个声音。
- 然后我们在输入文本中给出它,要求它生成音频
- 将音频保存为 mp3 文件。请注意,这必须与音频编码匹配。
现在,通过遍历幻灯片并传入讲义来创建音频:
for slideno, slide in enumerate(lecture['slides']):
text = f"On to {slide['title']} \n"
text += slide['lecture_notes'] + "\n\n"
filename = os.path.join(outdir, f"audio_{slideno+1:02}.mp3")
convert_text_audio(text, filename)
filenames.append(filename)
结果是一堆音频文件。你可以使用 pydub 将它们连接起来:
combined = pydub.AudioSegment.empty()
for audio_file in audio_files:
audio = pydub.AudioSegment.from_file(audio_file)
combined += audio
# pause for 4 seconds
silence = pydub.AudioSegment.silent(duration=4000)
combined += silence
combined.export("lecture.wav", format="wav")
但事实证明我不需要。创建视频需要单独的音频文件(每张幻灯片一个)。当然,对于播客,你需要一个 mp3 或 wav 文件。
7、创建幻灯片图像
令人恼火的是,没有简单的方法可以使用 Python 将 PowerPoint 幻灯片渲染为图像。你需要一台安装了 Office 软件的机器来执行此操作 — 这不是那种可以轻松自动化的操作。也许我应该使用 Google Slides……无论如何,渲染图像的一种简单方法是使用 Python 图像库 (PIL):
def text_to_image(output_path, title, keypoints):
image = Image.new("RGB", (1000, 750), "black")
draw = ImageDraw.Draw(image)
title_font = ImageFont.truetype("Coval-Black.ttf", size=42)
draw.multiline_text((10, 25), wrap(title, 50), font=title_font)
text_font = ImageFont.truetype("Coval-Light.ttf", size=36)
for ptno, keypoint in enumerate(keypoints):
draw.multiline_text((10, (ptno+2)*100), wrap(keypoint, 60), font=text_font)
image.save(output_path)
生成的图像不是很棒,但它是有用的(你可以说没有人再付钱让我写生产代码了):
8、创建视频
现在我们有一组音频文件和一组图像文件,我们可以使用 Python 包 moviepy 来创建视频剪辑:
clips = []
for slide, audio in zip(slide_files, audio_files):
audio_clip = AudioFileClip(f"article_audio/{audio}")
slide_clip = ImageClip(f"article_slides/{slide}").set_duration(audio_clip.duration)
slide_clip = slide_clip.set_audio(audio_clip)
clips.append(slide_clip)
full_video = concatenate_videoclips(clips)
现在我们可以将其写出来:
full_video.write_videofile("lecture.mp4", fps=24, codec="mpeg4",
temp_audiofile='temp-audio.mp4', remove_temp=True)
最终结果?我们有四个文件,都是从 article.pdf 自动创建的:
lecture.json lecture.mp4 lecture.pptx lecture.wav
其中:
- 包含关键点、讲义等的 JSON 文件。
- 你可以修改的 PowerPoint 文件。幻灯片包含关键点,幻灯片的注释部分包含“讲义”
- 由 AI 语音朗读讲义组成的音频文件
- 音频 + 图像的 mp4 电影(我上传到了 YouTube)。这是我打算制作的视频演讲。
很酷,是吧?
9、这对软件的未来意味着什么
作为一个社区,我们都在探索这项非常酷的技术(生成式 AI)的用途。显然,你可以使用它来创建内容,但内容它所创造的模型适合用于集思广益,但不能直接使用。三年的技术改进并没有解决 GenAI 生成无聊内容和尚未准备好使用的代码的问题。
这给我们带来了 GenAI 开放的一些辅助功能。这些功能非常有用。这篇文章说明了 GenAI 的四种功能。
(1) 将非结构化数据转换为结构化数据
Attention 论文是为了解决翻译问题而撰写的,事实证明基于转换器的模型在翻译方面确实很出色。我们不断发现这方面的用例。但不仅仅是日语到英语,还有 Java 11 到 Java 17、文本到 SQL、文本到语音、数据库方言之间……,现在还有文章到音频脚本。事实证明,这是使用 GenAI 创建播客、讲座、视频等的起点。
我所要做的就是提示 LLM 从文章中构建一系列幻灯片内容(关键点、标题等),它做到了。它甚至以结构化格式将数据返回给我,有利于从计算机程序中使用。具体来说,GenAI 非常擅长将非结构化数据转换为结构化数据。
(2) 代码搜索和编码辅助现在有了显著的改善
GenAI 真正擅长的另一件事是动态调整代码示例。我并不是每天都编写代码来创建演示文稿、文本转语音或电影。两年前,我一直在使用 Google 搜索并获取 Stack Overflow 页面并手动调整代码。现在,Google 搜索为我提供了随时可用的代码:
当然,如果我使用的是 Python IDE(而不是 Jupyter 笔记本),我就可以完全避免搜索步骤——我可以写一条注释并让系统为我生成代码。这非常有帮助,并且可以使用通用 API 加快开发速度。
(3) GenAI Web 服务功能强大且易于使用
我们不要忘记我使用 Google Cloud 文本转语音服务将我的音频脚本转换为实际的音频文件。文本转语音本身就是一种生成式 AI 模型(也是翻译超能力的另一个例子)。Google TTS 服务于 2018 年推出(并且从那时起可能有所改进),是首批投入生产的生成式 AI 服务之一,并通过 API 提供。
在本文中,我使用了两个生成式 AI 模型——TTS 和 Gemini——它们以 Web 服务的形式提供。我所要做的就是调用它们的 API。
(4) 提供最终用户可定制性比以往任何时候都容易
我没有这样做,但你可以稍微观察一下,看看事情的发展方向。如果我将演示文稿创建、音频创建和电影创建代码包装在服务中,我本可以让提示创建函数调用来调用这些服务。并放置一个请求处理代理,允许你使用文本来更改幻灯片的外观或阅读视频的人的声音。
为你构建的软件添加开放式可定制性变得非常容易。
10、结束语
受 NotebookLM 播客功能的启发,我开始构建一个将我的文章转换为视频演讲的应用程序。关键步骤是提示 LLM 从文章中生成幻灯片内容,另一个 GenAI 模型将音频脚本转换为音频文件,并使用现有的 Python API 将它们组合成视频。
本文阐述了 GenAI 正在解锁的四种功能:各种翻译、编码辅助、强大的 Web 服务和最终用户可定制性。
我喜欢能够轻松快速地从我的文章中创建视频讲座。但我更兴奋的是,我们不断发现我们手中的这个新工具的潜力。
原文链接:Using Generative AI to Automatically Create a Video Talk from an Article
汇智网翻译整理,转载请标明出处