使用 Veo 生成视频

Veo 是 Google 的高保真视频生成模型,能够生成各种电影和视觉风格的视频。Veo 可以捕捉提示的细微差别,从而在各个帧中呈现复杂的细节。

本指南将介绍如何使用 Veo 生成视频。如需获取有关如何编写视频提示的提示,请参阅 Veo 提示指南

Veo 版本

Gemini API 提供两种视频生成模型:Veo 3 和 Veo 2。 我们建议使用最新模型 Veo 3,因为它在质量和音频生成方面表现出色。

Veo 3 目前处于预览版阶段,可能无法大规模用于生产环境。 Veo 2 处于稳定状态,可提供更好的制作体验。

如需详细了解各型号之间的主要功能差异,请查看型号版本比较部分。

根据文本生成视频

本部分中的代码示例使用 Veo 3 生成包含集成音频的视频。

Python

import time
from google import genai
from google.genai import types

client = genai.Client()

operation = client.models.generate_videos(
    model="veo-3.0-generate-preview",
    prompt="Panning wide shot of a purring kitten sleeping in the sunshine",
    config=types.GenerateVideosConfig(
        person_generation="allow_all",  # "allow_adult" and "dont_allow" for Veo 2 only
        aspect_ratio="16:9",  # "16:9", and "9:16" for Veo 2 only
    ),
)

while not operation.done:
    time.sleep(20)
    operation = client.operations.get(operation)

for n, generated_video in enumerate(operation.response.generated_videos):
    client.files.download(file=generated_video.video)
    generated_video.video.save(f"video{n}.mp4")

JavaScript

import { GoogleGenAI } from "@google/genai";
import { createWriteStream } from "fs";
import { Readable } from "stream";

const ai = new GoogleGenAI({});

async function main() {
  let operation = await ai.models.generateVideos({
    model: "veo-3.0-generate-preview",
    prompt: "Panning wide shot of a purring kitten sleeping in the sunshine",
    config: {
      personGeneration: "allow_all",
      aspectRatio: "16:9",
    },
  });

  while (!operation.done) {
    await new Promise((resolve) => setTimeout(resolve, 10000));
    operation = await ai.operations.getVideosOperation({
      operation: operation,
    });
  }

  operation.response?.generatedVideos?.forEach(async (generatedVideo, n) => {
    const resp = await fetch(`${generatedVideo.video?.uri}&key=GEMINI_API_KEY`); // append your API key
    const writer = createWriteStream(`video${n}.mp4`);
    Readable.fromWeb(resp.body).pipe(writer);
  });
}

main();

Go

package main

import (
  "context"
  "fmt"
  "os"
  "time"
  "google.golang.org/genai"
)

func main() {

  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  videoConfig := &genai.GenerateVideosConfig{
      AspectRatio:      "16:9",
      PersonGeneration: "allow_all",
  }

  operation, _ := client.Models.GenerateVideos(
      ctx,
      "veo-3.0-generate-preview",
      "Panning wide shot of a purring kitten sleeping in the sunshine",
      nil,
      videoConfig,
  )

  for !operation.Done {
      time.Sleep(20 * time.Second)
      operation, _ = client.Operations.GetVideosOperation(ctx, operation, nil)
  }

  for n, video := range operation.Response.GeneratedVideos {
      client.Files.Download(ctx, video.Video, nil)
      fname := fmt.Sprintf("video_%d.mp4", n)
      _ = os.WriteFile(fname, video.Video.VideoBytes, 0644)
  }
}

REST

# Use curl to send a POST request to the predictLongRunning endpoint.
# The request body includes the prompt for video generation.
curl "${BASE_URL}/models/veo-3.0-generate-preview:predictLongRunning" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -X "POST" \
  -d '{
    "instances": [{
        "prompt": "Panning wide shot of a purring kitten sleeping in the sunshine"
      }
    ],
    "parameters": {
      "aspectRatio": "16:9",
      "personGeneration": "allow_all",
    }
  }' | tee result.json | jq .name | sed 's/"//g' > op_name

# Obtain operation name to download video.
op_name=$(cat op_name)

# Check against status of operation.
while true; do
  is_done=$(curl -H "x-goog-api-key: $GEMINI_API_KEY" "${BASE_URL}/${op_name}" | tee op_check.json | jq .done)

  if [ "${is_done}" = "true" ]; then
    cat op_check.json
    echo "** Attach API_KEY to download video, or examine error message."
    break
  fi

  echo "** Video ${op_name} has not downloaded yet!  Check again after 5 seconds..."

  # Wait for 5 seoncds to check again.
  sleep 5

done

小猫在阳光下睡觉。

此代码大约需要一分钟才能运行完毕,但如果资源受限,可能需要更长时间。运行完毕后,您应该会看到一段小猫睡觉的视频,就像我们这里展示的这段视频一样。

如果您看到的是错误消息而不是视频,则表示资源受限,无法完成您的请求。在这种情况下,请再次运行代码。

生成的视频会在服务器上存储 2 天,之后会被移除。如果您想保存生成的视频的本地副本,必须在生成后的 2 天内运行 result()save()

根据图片生成视频

以下代码使用 Imagen 生成图片,然后将生成的图片用作所生成视频的起始帧。

首先,使用 Imagen 生成图片:

Python

prompt="Panning wide shot of a calico kitten sleeping in the sunshine",

imagen = client.models.generate_images(
    model="imagen-3.0-generate-002",
    prompt=prompt,
    config=types.GenerateImagesConfig(
      aspect_ratio="16:9",
      number_of_images=1
    )
)

imagen.generated_images[0].image

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});
const response = await ai.models.generateImages({
  model: "imagen-3.0-generate-002",
  prompt: "Panning wide shot of a calico kitten sleeping in the sunshine",
  config: {
    numberOfImages: 1,
  },
});

// you'll pass response.generatedImages[0].image.imageBytes to Veo

Go

package main

import (
    "context"
    "fmt"
    "os"
    "time"
    "google.golang.org/genai"
)

func main() {

    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

    config := &genai.GenerateImagesConfig{
        AspectRatio:    "16:9",
        NumberOfImages: 1,
    }

    response, _ := client.Models.GenerateImages(
        ctx,
        "imagen-3.0-generate-002",
        "Panning wide shot of a calico kitten sleeping in the sunshine",
        config,
    )

    // you'll pass response.GeneratedImages[0].Image to Veo
}

然后,使用生成的图片作为第一帧来生成视频:

Python

operation = client.models.generate_videos(
    model="veo-2.0-generate-001",
    prompt=prompt,
    image = imagen.generated_images[0].image,
    config=types.GenerateVideosConfig(
      person_generation="dont_allow",  # "dont_allow" or "allow_adult"
      aspect_ratio="16:9",  # "16:9" or "9:16"
      number_of_videos=2
    ),
)

# Wait for videos to generate
 while not operation.done:
  time.sleep(20)
  operation = client.operations.get(operation)

for n, video in enumerate(operation.response.generated_videos):
    fname = f'with_image_input{n}.mp4'
    print(fname)
    client.files.download(file=video.video)
    video.video.save(fname)

JavaScript

import { GoogleGenAI } from "@google/genai";
import { createWriteStream } from "fs";
import { Readable } from "stream";

const ai = new GoogleGenAI({});

async function main() {
  // get image bytes from Imagen, as shown above

  let operation = await ai.models.generateVideos({
    model: "veo-2.0-generate-001",
    prompt: "Panning wide shot of a calico kitten sleeping in the sunshine",
    image: {
      imageBytes: response.generatedImages[0].image.imageBytes, // response from Imagen
      mimeType: "image/png",
    },
    config: {
      aspectRatio: "16:9",
      numberOfVideos: 2,
    },
  });

  while (!operation.done) {
    await new Promise((resolve) => setTimeout(resolve, 10000));
    operation = await ai.operations.getVideosOperation({
      operation: operation,
    });
  }

  operation.response?.generatedVideos?.forEach(async (generatedVideo, n) => {
    const resp = await fetch(
      `${generatedVideo.video?.uri}&key=GEMINI_API_KEY`, // append your API key
    );
    const writer = createWriteStream(`video${n}.mp4`);
    Readable.fromWeb(resp.body).pipe(writer);
  });
}

main();

Go

    image := response.GeneratedImages[0].Image

    videoConfig := &genai.GenerateVideosConfig{
      AspectRatio:    "16:9",
      NumberOfVideos: 2,
    }

    operation, _ := client.Models.GenerateVideos(
        ctx,
        "veo-2.0-generate-001",
        "A dramatic scene based on the input image",
        image,
        videoConfig,
    )

    for !operation.Done {
        time.Sleep(20 * time.Second)
        operation, _ = client.Operations.GetVideosOperation(ctx, operation, nil)
    }

    for n, video := range operation.Response.GeneratedVideos {
        client.Files.Download(ctx, video.Video, nil)
        fname := fmt.Sprintf("video_with_image_input_%d.mp4", n)
        _ = os.WriteFile(fname, video.Video.VideoBytes, 0644)
    }

Veo 模型参数

(命名惯例因编程语言而异。)

  • prompt:视频的文本提示。如果存在,image 参数是可选的。
  • image:用作视频第一帧的图片。如果存在,prompt 参数是可选的。
  • negativePrompt:一个文本字符串,用于描述您想要阻止模型生成的内容
  • aspectRatio:更改生成的视频的宽高比。
    • "16:9":Veo 3 和 Veo 2 支持此功能。
    • "9:16":仅在 Veo 2 中受支持(默认为 "16:9")。
  • personGeneration:允许模型生成包含人物的视频。支持以下值:
    • 文本转视频生成:
      • "allow_all":生成包含成人和儿童的视频。 目前,Veo 3 唯一可用的 personGeneration 值。
      • "dont_allow":仅限 Veo 2。不允许包含人物或人脸。
      • "allow_adult":仅限 Veo 2。生成包含成人但不包含儿童的视频。
    • 图片转视频生成:仅限 Veo 2
      • "dont_allow":不允许包含人物或人脸。
      • "allow_adult":生成包含成人但不包含儿童的视频。
    • 请参阅限制
  • numberOfVideos:请求的输出视频
    • 1:Veo 3 和 Veo 2 支持
    • 2:仅在 Veo 2 中受支持。
  • durationSeconds:仅限 Veo 2。每个输出视频的时长(以秒为单位),介于 58 之间。
    • 无法为 Veo 3 配置,默认设置为 8 秒。
  • enhancePrompt:仅限 Veo 2。启用或停用提示重写器。 默认处于启用状态。
    • 无法为 Veo 3 配置,默认提示增强器始终处于开启状态。

如需并排查看 Veo 3 和 Veo 2 之间的参数差异,请参阅模型版本比较表。

规格

模态
  • 文本转视频生成
  • 图片转视频生成(仅限 Veo 2)
请求延迟时间
  • 最短:11 秒
  • 最长:6 分钟(高峰时段)
可变长度生成
  • Veo 2:5-8 秒
  • Veo 3:8 秒
解决方法 720p
帧速率 24 帧/秒
宽高比
  • 16:9 - 横向
  • 9:16 - 纵向(仅限 Veo 2)
输入语言(文字转视频) 英语
限制
  • 欧盟、英国、瑞士、中东和北非地区不允许使用图片转视频功能 personGeneration
  • 文字转视频 personGeneration: "allow_all" 功能在欧盟、英国、瑞士、中东和北非地区不可用

Veo 创建的视频会使用 SynthID(我们的 AI 生成内容水印添加和识别工具)添加水印,并会通过安全过滤和记忆检查流程,以帮助降低隐私权、版权和偏见风险。

Veo 提示指南

Veo 指南的这一部分包含一些示例视频,展示了如何使用 Veo 创作视频,以及如何修改提示以获得不同的效果。

安全过滤器

Veo 会在 Gemini 中应用安全过滤器,以帮助确保生成的视频和上传的照片不包含冒犯性内容。 违反我们条款和准则的提示会被屏蔽。

提示撰写的基础知识

良好的提示应具有描述性且清晰明了。如要充分利用 Veo,请先确定核心创意,然后通过添加关键字和修饰符来完善创意,并在提示中加入视频专用术语。

您的提示应包含以下元素:

  • 正文:您希望在视频中呈现的对象、人物、动物或场景,例如城市景观自然车辆小狗
  • 动作:正文正在执行的动作(例如,走路跑步转头)。
  • 风格:使用特定的电影风格关键字(例如科幻恐怖片黑色电影)或动画风格(例如卡通)来指定创意方向。
  • 相机定位和运动:[可选] 使用航拍平视俯拍轨道拍摄仰拍等术语控制相机的位置和运动。
  • 构图:[可选] 镜头取景方式,例如广角镜头特写镜头单人镜头双人镜头
  • 对焦和镜头效果:[可选] 使用浅景深深景深柔焦微距镜头广角镜头等术语来实现特定的视觉效果。
  • 氛围:[可选] 颜色和光线对场景的贡献,例如蓝色调夜间暖色调
  • 隐式或显式音频提示:[仅限 Veo 3] 使用 Veo 3,您可以提供音效、环境噪音和对话提示。

有关撰写提示的更多技巧

以下提示可帮助您撰写用于生成视频的提示:

  • 使用描述性语言:使用形容词和副词为 Veo 描绘清晰的画面。
  • 提供背景信息:根据需要,添加背景信息以帮助模型理解您的意图。
  • 参考特定艺术风格:如果您有特定的审美观,请参考特定艺术风格或艺术运动。
  • 使用提示工程工具:可考虑探索提示工程工具或资源,以帮助您优化提示并实现最佳结果。如需了解详情,请参阅提示设计简介
  • 增强个人和群组图片中的面部细节:指定面部细节作为照片的焦点,例如在提示中使用“portrait”一词。

提示和输出示例

本部分提供了多个提示,重点介绍了描述性细节如何提升每个视频的最终效果。

集成音频

这些视频演示了如何通过提供越来越详细的提示来让 Veo 3 生成音频。

提示 生成的输出
更多细节
特写镜头:两个人盯着墙上的一幅神秘图画,火光闪烁。“这一定是钥匙,”他一边低声说道,一边描摹着图案。“不过,这是什么意思呢?”她困惑地问道,同时歪了歪头。潮湿的石头、精美的雕刻、隐藏的符号。背景中传来一阵微弱而诡异的嗡嗡声。
洞穴中的寻宝者。
减少细节
露营(定格动画):露营者:“我现在与大自然融为一体了!”熊:“大自然希望有一些个人空间”。
洞穴中的寻宝者。

不妨亲自尝试一下这些提示,听听音频效果! 试用 Veo 3

冰柱

本视频演示了如何在提示中使用提示撰写基础知识中的元素。

提示 生成的输出
特写镜头(构图):冰冻岩壁(背景)上融化的冰柱(正文),冷蓝色调(氛围),放大(镜头运动),保持水滴(动作)的特写细节。 滴水的冰柱,蓝色背景。

一位男士正在手机

这些视频演示了如何通过添加越来越具体的细节来修改提示,让 Veo 按照您的喜好优化输出内容。

提示 生成的输出
细节较少
镜头从远处推近,展现一位身着绿色风衣、神情绝望的男人。他正在用一部转盘式壁挂电话拨打电话,电话上亮着绿色霓虹灯。看起来像电影场景。
男士正在手机。
更多细节
一个电影特写镜头跟随着一位身着破旧绿色风衣、神情绝望的男人,他正在拨打安装在粗糙砖墙上的转盘式电话,周围笼罩着绿色霓虹灯的诡异光芒。镜头缓缓推进,显示出他下巴的紧张感,以及他努力拨打电话时脸上刻着的绝望。浅景深效果将焦点对准了他紧锁的眉头和黑色的拨号手机,模糊了背景,使其变成一片模糊的霓虹色彩和不清晰的阴影,营造出一种紧迫感和孤立感。
一位男士正在打电话

雪豹

此示例展示了 Veo 可能会针对简单提示生成的输出。

提示 生成的输出
一只毛皮像雪豹一样可爱的生物在冬季森林中行走,3D 卡通风格渲染。 雪豹无精打采。

奔跑的雪豹

此提示包含更多细节,并展示了可能更接近您想要的视频效果的生成输出。

提示 生成的输出
创作一段欢快的卡通风格的 3D 动画短片。一只可爱的生物,有着雪豹般的皮毛、富有表现力的大眼睛和圆润友好的身形,在奇幻的冬季森林中欢快地跳跃。场景中应有圆润的雪树、缓缓飘落的雪花,以及透过树枝的温暖阳光。生物活泼的动作和灿烂的笑容应传达出纯粹的喜悦。采用欢快温馨的基调,搭配明亮欢快的色彩和活泼的动画。 雪豹跑得更快了。

按写作要素划分的示例

以下示例展示了如何根据每个基本要素优化提示。

主题

此示例展示了如何指定拍摄对象描述。说明可以包含一个主题,也可以包含多个主题和操作。在此示例中,我们的主题是“白色混凝土公寓楼”。

提示 生成的输出
一栋白色混凝土公寓楼的建筑效果图,具有流畅的有机形状,与茂盛的绿色植物和未来派元素无缝融合 占位符。

上下文

此示例展示了如何指定上下文。正文所处的背景或环境非常重要。尝试将正文置于各种背景下,例如繁忙的街道或外太空。

提示 生成的输出
一颗卫星在太空中漂浮,背景是月球和一些星星。 漂浮在大气层中的卫星。

操作

此示例展示了如何指定动作:被拍摄对象正在做什么,例如走路、跑步或转头。

提示 生成的输出
广角镜头:一位女性在海滩上行走,在日落时分面朝地平线,看起来很满足和放松。 日落美景令人惊叹。

样式

此示例展示了如何指定风格。您可以添加关键字来提高生成质量,并使生成结果更贴近预期风格,例如浅景深、电影剧照、极简主义、超现实主义、复古、未来主义或双重曝光。

提示 生成的输出
黑色电影风格,一男一女走在街上,神秘、电影感、黑白。 黑色电影风格绝对美轮美奂。

相机运动

此示例展示了如何指定相机运动。拍摄运动画面的选项包括第一人称视角拍摄、航拍、跟踪无人机视角拍摄或跟踪拍摄。

提示 生成的输出
第一人称视角镜头:一辆复古汽车在雨中行驶,加拿大夜景,电影风格。 日落美景令人惊叹。

乐曲

此示例展示了如何指定构图:拍摄的画面如何取景(广角镜头、特写镜头、低角度等)。

提示 生成的输出
眼睛的超近特写,眼睛中映出城市。 日落美景令人惊叹。
制作一段视频,内容为:一位冲浪者拿着冲浪板走在海滩上,美丽的日落,电影风格的广角镜头。 日落美景令人惊叹。

气氛

此示例展示了如何指定氛围。调色板在摄影中发挥着至关重要的作用,可影响照片的氛围并传达预期的情感。您可以尝试“柔和的橙色暖色调”“自然光”“日出”或“日落”等效果。例如,暖色调的金色调色板可以为照片注入浪漫而富有氛围的感觉。

提示 生成的输出
在阳光明媚的公园里,一个女孩抱着可爱的金毛猎犬小狗的特写镜头。 一只小狗在一位年轻女孩的怀里。
电影般的特写镜头:一位悲伤的女性在雨中乘坐公交车,画面采用冷色调蓝色,营造出悲伤的氛围。 一位女士坐在公交车上,看起来很伤心。

使用参考图片生成视频

您可以使用 Veo 的图像转视频功能让图片栩栩如生。 您可以使用现有素材资源,也可以尝试使用 Imagen 生成新内容。

提示 生成的输出
拿着巧克力棒的兔子。 兔子正在逃跑。
兔子跑开了。 兔子正在逃跑。

否定提示

否定提示是一种强大的工具,有助于指定您希望出现在视频中的元素。在“否定提示”一词后,描述您想要阻止模型生成的内容。请按照以下提示操作。

  • ❌ 请勿使用指令性语言或“没有”或“不”等字词。例如,“没有墙壁”或“不显示墙壁”。

  • ✅ 请描述您不想看到的内容。例如,“墙、框架”,表示您不希望视频中出现墙或框架。

提示 生成的输出
生成一段简短的风格化动画,内容是一棵巨大的孤零零的橡树,树叶在强风中剧烈摇摆。树的形状应略显夸张、奇特,树枝应呈现出动态的流动感。树叶应呈现出各种秋季色彩,在风中旋转飞舞。动画应使用暖色调的调色板,营造出温馨的氛围。 使用文字的树。
生成一段简短的风格化动画,内容是一棵巨大的孤零零的橡树,树叶在强风中剧烈摇摆。树的形状应略显夸张、奇特,树枝应呈现出动态的流动感。树叶应呈现出各种秋季色彩,在风中旋转飞舞。动画应使用暖色调的调色板,营造出温馨的氛围。

使用负面提示 - 城市背景、人造结构、黑暗、暴风雨或威胁性氛围。
不含否定词的树。

宽高比

Gemini Veo 视频生成支持以下两种宽高比:

宽高比 说明
宽屏或 16:9 电视、显示器和手机屏幕(横向)最常用的宽高比。如果您想拍摄更多背景(例如风景),请使用这种宽高比。
纵向或 9:16
(仅限 Veo 2)
旋转的宽屏。这种宽高比深受短视频应用(例如 YouTube Shorts)的欢迎。可将这种宽高比用于具有强烈垂直方向的肖像或较高对象,例如建筑物、树或瀑布。

宽屏

此提示的宽高比为 16:9,属于宽屏。

提示 生成的输出
制作一段视频,内容为:在 20 世纪 70 年代的棕榈泉,一名男子驾驶一辆红色敞篷车,无人机跟拍视角,阳光温暖,阴影拉长。 瀑布非常漂亮。

纵向

此提示是纵向宽高比 9:16 的示例。此比例仅适用于 Veo 2。

提示 生成的输出
制作一段视频,突出展示茂密热带雨林中壮丽的夏威夷瀑布的流畅动态。重点呈现逼真的水流、细致的树叶和自然光照,以传达宁静感。捕捉湍急的水流、雾气弥漫的氛围以及透过茂密树冠的斑驳阳光。使用流畅的电影级镜头移动来展示瀑布及其周围环境。力求营造宁静而真实的氛围,让观看者仿佛置身于夏威夷热带雨林的宁静美景之中。 瀑布非常漂亮。

模型版本比较

我们建议使用 Veo 3,以获得最佳性能、保真度和画质。

下表介绍了 Veo 2 与当前 Veo 3 预览版在功能、规格和参数方面的差异:

型号 Veo 3 Veo 2
适用的国家/地区 预览 稳定版
音频 带音频的视频(始终开启) 无音频
生成 文本转视频 文字和图片转视频
每个请求的视频数量 1 1 或 2
aspectRatio 16:9 16:919:6
personGeneration allow_all(无法配置) allow_adultdont_allowallow_all(仅限文字转视频)
durationSeconds 无法配置,只能设置为 8 秒 5-8 秒
enhancePrompt 不可配置,始终处于开启状态 启用(默认)或停用

您只需将模型名称更新为使用 Veo 3 模型代码,并对参数进行少量更改,即可从 Veo 2 迁移到 Veo 3。

后续步骤