LangGraph 和 Veo 2 集成使早间新闻视频完全 AI
发表于
起先
背景和目的
在上一篇文章中,我们研究了使用 AI 代理 (LangGraph) 自动生成语音新闻。 为了进一步“视频化”结果,我尝试使用 Google 的 Veo 2 生成一个视频,并将其与 LangGraph 生成的音频相结合,使其成为视频内容。
实现
使用 LangGraph 和 GPT 制作的声音 (previous review)
如上一篇文章中详细描述的,我们在 LangGraph 上构建了一系列流程,从收集、总结和生成新闻文章的手稿到文本转语音。
新闻的主题可以每天选择,这次除了天气和日经平均指数等日期和时间信息外,它还基于政治和报纸等最新新闻。
此外,生成的新闻手稿是使用 OpenAI TTS(型号:tts-1)生成的,以生成音频(MP3 文件),并每天早上通过 Dropbox 和 iPhone 自动更新和播放。
使用 Veo2 生成视频
在本文中,您将使用 Google Generative AI (Gemini) SDK 从静止图像生成视频。
首先,我们准备了一个与新闻内容相关的本地图片文件,如果它很小,我们就放大它。 使用此图像作为输入,请求 Veo 2 生成视频。
SDK 的 genai. 您可以使用客户端生成短视频剪辑,方法是为模型名称“veo-2.0-generate-001”(Veo 2)提供提示和目标图像。
在内部,它是一个图像,可以生成一个与给定图像和文本的上下文相匹配的视频,类似于 Google 的大规模图像生成模型 Imagen 系列。 生成的视频剪辑可以获得为每个视频几十 MB 的 MP4 视频。
以下是实际代码的摘录。 我们使用的是 Google 提供的 Python SDK,并且我们提前使用环境变量中设置的 API 密钥初始化客户端(我们已经在有效的项目中获得了 Veo 使用权限)。
加载本地镜像并使用类型。 Image 对象,generate_videos方法向模型发送请求,视频生成将开始(等待几分钟完成)。
video_gen.py
Copied!
import io
import sys
import time
from PIL import Image
from pathlib import Path
from google import genai
from google.genai import types
IMG_PATH = Path("img.jpg") # 任意のパスに変更
# ...(画像の読み込みと1280x720リサイズ処理)...
# ...(SDK 用 Image オブジェクトを作成)...
client = genai.Client() # APIキーは自動で読み込まれる
image_obj = types.Image(
image_bytes=img_bytes,
mime_type="image/jpg",
)
operation = client.models.generate_videos(
model="veo-2.0-generate-001",
prompt="ニュースの風景として動画を作成してください", # プロンプト例
image=image_obj,
config=types.GenerateVideosConfig(
aspect_ratio="16:9",
number_of_videos=2, # 動画の作成数
),
)
# ...(生成完了までポーリングで待機し、エラー処理)...
# ...(成功/失敗チェック)...
# 動画保存
stem = IMG_PATH.stem
for i, v in enumerate(videos):
out_path = f"{stem}_{i}.mp4"
client.files.download(file=v.video)
v.video.save(out_path)
print(f"✅ 保存完了 → {out_path}")
此外,根据图像的大小和提示符,它经常会失败,所以我认为有必要参考文档调整这个区域。
视频和音频集成
Veo 2 输出的视频剪辑目前很短,最多大约 8 秒,因此您需要根据新闻音频的长度(在本例中约为 1~2 分钟)调整视频。 在这里,我使用了 MoviePy 库来匹配视频和音频的长度。
具体来说,它会导入无声 MP4 视频剪辑,并对音频 MP3 的长度执行以下作:
- 循环:如果视频短于音频,则视频将重复播放并拉伸到预定长度(循环)
- 修剪:相反,如果视频比音频长,则只会剪掉第一部分(与音频长度相同)
调整后,MoviePy 会将音频合并成视频剪辑,并将其输出为带有音频的 MP4 文件。
loop_and_mix.py
Copied!
from moviepy import VideoFileClip, AudioFileClip, vfx
# クリップ読み込み
audio_clip = AudioFileClip("news.mp3")
video_clip = VideoFileClip("video.mp4").without_audio() # 無音の動画クリップを読み込む
audio_duration = audio_clip.duration
video_duration = video_clip.duration
# 音声の長さに映像を合わせる(ループまたはカット)
if video_duration
总结
我很惊讶,生成看起来像新闻视频的内容比我想象的要容易。 虽然仍有改进的余地,但我从内容的质量以及它可以自主自动化的事实中学到了。
再次,我在上一篇文章中提到过 AI Agent 的设计很重要,但是在将其转录成视频时,我觉得人类的创造力和聪明才智(提示工程)仍然是必要的,因为视频的氛围受图像和提示的差异影响很大。
此外,虽然“全自动生成”大大降低了创意人员的门槛,但我敏锐地意识到,对产品版权和使用范围的了解比以往任何时候都更加重要。 因为它变得更加方便,我觉得需要适当处理 AI 生成内容的知识和责任感。 我自己也想再次研究这个领域。