开始之前:三个模型 ID,一项付费功能
Veo 是 Google 的视频模型。你通过 Gemini API 使用它:这是让你自己的代码向 Google 的服务器发请求、再取回视频的接口。一个叫 google-genai 的软件包(SDK)把这些请求包装好。Google 的 Veo 笔记本把 Veo 标为付费功能,所以它的示例代码默认是关着的,要你自己把开关打开。
你需要一个来自 Google AI Studio 的 Gemini API 密钥,以及 2.9.0 或更新版本的 SDK。Veo 3 及之后的版本会同时生成声音,Veo 2 还会保留一段时间,但生成的是无声视频。如果不想写代码,Mindket 的用 Gemini 和 Flow 做 AI 视频一课讲了 Google 的应用和它们的菜单。
Google 自家的频道 Google Cloud Tech 在 2025 年 11 月发布了一段不到 5 分钟的 Veo 入门介绍。它的章节列表包括提示词优化、可配置参数和图生视频,和下面几节讲的是同一块内容。它的说明里写的是 Google Cloud 的 Veo 模型,并附有 Vertex AI Studio 的链接,所以看到的会是 Google Cloud 的画面,而不是这一课用的 Gemini API 代码。代码还是看笔记本。
| 模型 ID | 笔记本怎么说 |
|---|---|
| veo-3.1-generate-preview | 完整的 Veo 3.1,笔记本里做参考图用的就是它 |
| veo-3.1-fast-generate-preview | 更快、更容易用的版本,适合广告、A/B 测试和社交媒体内容 |
| veo-3.1-lite-generate-preview | 笔记本的默认选项,说它性价比高,为大批量的 720p 和 1080p 优化 |

生成第一段视频
按笔记本的说法,一段视频大约要一分钟才能做好,所以 SDK 里用来请求生成的函数 generate_videos 不会直接返回成品。它返回的是一个 operation,也就是一个还在运行的任务。你每隔 20 秒问一次它的状态,等它报告完成,再下载文件保存。
下面的代码就是笔记本里的文生视频单元,只改了密钥的读法:笔记本从名为 GEMINI_API_KEY 的 Colab 密钥里读,这个版本改成读同名的环境变量。
import os
import time
from google import genai
from google.genai import types
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
VEO_MODEL_ID = "veo-3.1-lite-generate-preview"
operation = client.models.generate_videos(
model=VEO_MODEL_ID,
prompt="a close-up shot of a golden retriever playing in a field of sunflowers",
config=types.GenerateVideosConfig(
aspect_ratio="16:9",
resolution="1080p",
),
)
while not operation.done:
time.sleep(20)
operation = client.operations.get(operation)
for n, generated_video in enumerate(operation.result.generated_videos):
client.files.download(file=generated_video.video)
generated_video.video.save(f"video{n}.mp4")- 用
pip install -U "google-genai>=2.9.0"安装 SDK。 - 在 Google AI Studio 里创建 Gemini API 密钥,别写进代码,放在名为 GEMINI_API_KEY 的环境变量里。
- 选一个模型 ID。笔记本从 veo-3.1-lite-generate-preview 开始。
- 带着提示词和 config 调用 generate_videos。aspect_ratio 取 "16:9" 或 "9:16",resolution 取 "720p" 或 "1080p"。
- 按定时器反复调用 client.operations.get,直到 operation.done 为 true。
- 下载每一段生成的视频,保存成 MP4。
笔记本只有在顶部的开关设为 True 时才会执行付费调用。如果要对很多条提示词循环调用,请先加上你自己的保护。
可以加上的设置
提示词是唯一必填的参数,其余都是可选的,写在 config 对象里。反向提示词,是一小段写明你不想看到什么的文字,比如笔记本独角兽例子里的“airplanes”。
关于提示词的写法,笔记本提到了镜头构图(“single shot”“over-the-shoulder shot”)、机位和运镜(“eye level”“dolly shot”“tracking shot”),还有对焦和镜头效果(“shallow focus”“macro lens”)以及整体风格。
| 设置 | 取值 |
|---|---|
| negative_prompt | 描述你不想在视频里看到什么的文字 |
| person_generation | 是否允许出现成年人。儿童一律被拦截 |
| duration_seconds | Veo 3.1 可取 4、6 或 8。Veo 3 固定为 8,续写时为 7 |
| aspect_ratio | "16:9" 为横屏,"9:16" 为竖屏 |
| resolution | "720p" 或 "1080p" |
在提示词里描述声音
Veo 3 用同一条提示词生成音频,所以声音和别的细节一样,写进句子里就行。下面是笔记本的音频例子,它把看到的和听到的写在一起,还交代了听者站在哪里。
对于人物说话,笔记本把每一句台词放进引号写在提示词里,再在调用里加上反向提示词“texts, captions, subtitles”。两种情况用的都是前面那段 generate_videos 代码。
fireworks at a beautiful city skyline scene with many different fireworks colors and sounds. sounds from excited people enjoying the show surrounding the camera POV can be heard too.从一张图开始,再固定结尾
image 参数会让这张图成为第一帧,提示词说明哪些东西会动,提示词甚至可以留空。笔记本说,没有提示词时,模型会根据图片自己决定生成什么。
想控制片段怎么结尾,就在 config 里加上 last_frame。笔记本说得很明确:尾帧图不能单独使用,必须同时给一张首帧图。下面的单元里,gemini_image 和 ending_image 是笔记本先前用 Gemini 图像模型生成的图片,你也可以换成自己的。做这些图的方法见图片编辑一课。
operation = client.models.generate_videos(
model=VEO_MODEL_ID,
prompt="",
image=gemini_image,
config=types.GenerateVideosConfig(
aspect_ratio="16:9",
resolution="1080p",
negative_prompt="ugly, low quality, static, weird physics",
last_frame=ending_image,
),
)参考图,以及把片段变长
参考图用来在整段视频里保持某个角色、道具或风格,又不会把它们当作第一帧。每张图作为一张标明为 asset 的参考图传入。笔记本规定,这只适用于 Veo 3.1,不含 Fast 模型,分辨率 720p,横屏。
续写是另一个参数。你把先前的 Veo 视频作为 video 传入,可以再配一条提示词,Veo 会再加 7 秒。
backpack_reference = types.VideoGenerationReferenceImage(
image=backpack_image,
reference_type="asset",
)
actor_reference = types.VideoGenerationReferenceImage(
image=actor_image,
reference_type="asset",
)
operation = client.models.generate_videos(
model="veo-3.1-generate-preview",
prompt="A caricatural commercial video for this backpack. The actor puts on the backpack, jumps on his motorbike and starts off with a bang and an epic music",
config=types.GenerateVideosConfig(
aspect_ratio="16:9",
resolution="720p",
reference_images=[backpack_reference, actor_reference],
),
)- 要续写的片段必须由 Veo 生成,分辨率 720p,长度不到 141 秒。
- 成片最长可达 148 秒,笔记本算下来,是在一段 8 秒的片段上续写大约 20 次。
- 续写用的调用和前面一样,只是传 video,不传 image。
Gemini Omni,cookbook 里的另一个视频模型
Google 的 Omni 笔记本讲的是 Gemini Omni 1.2 Flash,它用另一种调用,也就是 Interactions API,需要 google-genai 2.21.0 或更新版本。一次交互是有状态的:你用 previous_interaction_id 指定先前的一次交互,模型就会修改或续写那个片段。
下面是笔记本里的多轮单元。第一轮用带时间码的提示词生成片段,第二轮只改车的颜色。Google 建议修改的提示词要简短、精准,它的例子以“Keep everything else the same.”结尾。
笔记本自己的建议是:对话式编辑、复杂提示词和大量参考图,优先用 Omni,独立的批量任务用 Veo。下表把两者放在一起对比。
turn1 = client.interactions.create(
model="gemini-omni-1.2-flash",
input="[0-10s] Single unbroken continuous camera shot from a locked perspective gliding forward along a scenic coastal road at sunset. A sleek silver sports car cruises smoothly in front of the camera. Completely continuous unbroken take.",
response_format={"type": "video"},
)
turn2 = client.interactions.create(
model="gemini-omni-1.2-flash",
previous_interaction_id=turn1.id,
input="Change the car color to metallic blue. Keep everything else the same.",
)| Veo 3.1 | Gemini Omni 1.2 Flash | |
|---|---|---|
| 调用 | client.models.generate_videos | client.interactions.create |
| 片段时长 | 4、6 或 8 秒 | 3 到 15 秒,默认 10 秒 |
| 分辨率 | 720p 或 1080p | 360p 草稿、720p、1080p 或 4k |
| 编辑 | 没有,每次调用各自独立 | 用 previous_interaction_id 进行后续轮次 |
| 参考图 | 最多 3 张,限 Veo 3.1,不含 Fast | 最多 6 张,最长的片段也可用 |
| 续写 | 每步 7 秒 | 每轮 3 到 10 秒,生成的片段总长最多 30 秒 |
| SDK | google-genai 2.9.0 或更新 | google-genai 2.21.0 或更新 |
常见错误
- 在没有付费方案的情况下跑示例。笔记本里每个付费单元都先检查一个开关,原因就在这里。
- 只固定尾帧。笔记本说,它必须搭配一张首帧图。
- 用 Fast 模型、1080p 或竖屏去传参考图。笔记本只允许它们用在 Veo 3.1(不含 Fast 模型)、720p 和横屏里。
- 续写不是由 Veo 生成的片段,或者长度超过上面所说上限的片段。
- 轮询时不间隔。笔记本每次检查之间会等待,并指向 webhook,用它来接收任务结束的通知。
- 把 API 密钥直接粘贴进脚本。把它放进密钥管理或环境变量里。
动手试试
- 用小狗的提示词跑第一段视频,再把 aspect_ratio 换成竖屏的取值,得到竖屏视频。
- 给一个天空场景加上笔记本里的反向提示词“airplanes”,对比两段视频。
- 做一张图,作为 image 传入,再加一张表现下一个瞬间的尾帧。
- 用 Lite 和完整的 Veo 3.1 模型在 720p 下各做同一段视频,比较细节。
- 对很多条提示词循环调用之前,先看看一次调用要花多少钱。
按你的要求来评判一段视频:主体的样子保持不变,镜头照你写的运动,台词和文字一致。
下一课:写出更好的视频提示词
调用的效果取决于提示词,OpenAI、Google、Lightricks 和腾讯各自公布了写提示词的建议。写出更好的视频提示词一课把这些建议并排放在一起,再讲怎样让同一个角色在镜头之间保持不变。
自测一下
你的 generate_videos 调用立刻返回了,却没有视频。笔记本接下来怎么做?
查看答案
B. 每隔 20 秒调用 client.operations.get,直到 operation.done 为 true generate_videos 返回的是 operation,也就是还在运行的任务,所以代码要轮询它,完成后再下载文件。
你想让片段以某一张图结尾,还必须传什么?
查看答案
A. 一张首帧图,因为尾帧图不能单独使用 笔记本说,你不能只用尾帧图,必须同时给一张首帧图。
笔记本给 Veo 里的参考图规定了哪些条件?
查看答案
C. Veo 3.1 但不含 Fast、720p、横屏 笔记本把参考图限定在 Veo 3.1,不含 Fast 模型,分辨率 720p,横屏。
哪个调用可以在后续轮次里修改已生成的 Gemini Omni 片段?
查看答案
B. 带 previous_interaction_id 的 client.interactions.create 交互是有状态的,用 previous_interaction_id 指定先前的一次交互,模型就能修改那个片段。
常见问题
Veo 可以免费使用吗?
不行。Google 的笔记本说,Veo 在免费额度上跑不了,所以要从付费账号开始。
Veo 生成的视频有水印吗?
有。按笔记本的说法,每段生成的视频都带有 Google DeepMind 的 SynthID 数字水印。
不装 Python 能试 Veo 的代码吗?
能。笔记本顶部有一个按钮,点开就在 Google Colab 里运行,密钥从名为 GEMINI_API_KEY 的 Colab Secret 里读。付费单元默认关着,等你把开关打开。
Veo 能生成竖屏视频吗?
能,要竖着的 9:16 画幅就行。参考图是例外,笔记本只允许它用在横屏画幅。
能续写我自己拍的片段吗?
Veo 不行,按笔记本的说法,它只续写自己生成的视频。Gemini Omni 接受 10 秒或更短的上传片段,欧洲经济区、瑞士和英国的用户除外。
资料来源
- GitHub: google-gemini/cookbook, Get started with Veo notebook https://github.com/google-gemini/cookbook/blob/main/quickstarts/Get_started_Veo.ipynb
- GitHub: google-gemini/cookbook, Gemini Omni notebook https://github.com/google-gemini/cookbook/blob/main/quickstarts/Get_started_Omni.ipynb
- YouTube (Google Cloud Tech): Bringing ideas to life: An intro to AI video generation https://www.youtube.com/watch?v=5NlXA7A8IKg
