使用 Veo 生成视频

Gemini API 提供对 Veo 2 的访问权限,这是 Google 迄今为止最强大的视频生成模型。Veo 可生成各种电影和视觉风格的视频,捕捉提示中的细微之处,以便在各个画面中一致呈现精致细节。本指南将帮助您开始使用 Gemini API 与 Veo 集成。

如需了解视频提示指南,请参阅 Veo 提示指南部分。

准备工作

在调用 Gemini API 之前,请确保您已安装所选的 SDK,并已配置好 Gemini API 密钥,可以使用。

如需将 Veo 与 Google Gen AI SDK 搭配使用,请确保您已安装以下某个版本:

生成视频

本部分提供了使用文本提示使用图片生成视频的代码示例。

根据文本生成

您可以使用以下代码通过 Veo 生成视频:

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

client = genai.Client()  # read API key from GOOGLE_API_KEY

operation = client.models.generate_videos(
    model="veo-2.0-generate-001",
    prompt="Panning wide shot of a calico kitten sleeping in the sunshine",
    config=types.GenerateVideosConfig(
        person_generation="dont_allow",  # "dont_allow" or "allow_adult"
        aspect_ratio="16:9",  # "16:9" or "9:16"
    ),
)

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")  # save the video

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

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

async function main() {
  let operation = await ai.models.generateVideos({
    model: "veo-2.0-generate-001",
    prompt: "Panning wide shot of a calico kitten sleeping in the sunshine",
    config: {
      personGeneration: "dont_allow",
      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=GOOGLE_API_KEY`); // append your API key
    const writer = createWriteStream(`video${n}.mp4`);
    Readable.fromWeb(resp.body).pipe(writer);
  });
}

main();
package main

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

func main() {

  ctx := context.Background()
  client, _ := genai.NewClient(ctx, &genai.ClientConfig{
      APIKey:  os.Getenv("GEMINI_API_KEY"),
      Backend: genai.BackendGeminiAPI,
  })

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

  operation, _ := client.Models.GenerateVideos(
      ctx,
      "veo-2.0-generate-001",
      "Panning wide shot of a calico 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)
  }
}
# 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-2.0-generate-001:predictLongRunning?key=${GOOGLE_API_KEY}" \
  -H "Content-Type: application/json" \
  -X "POST" \
  -d '{
    "instances": [{
        "prompt": "Panning wide shot of a calico kitten sleeping in the sunshine"
      }
    ],
    "parameters": {
      "aspectRatio": "16:9",
      "personGeneration": "dont_allow",
    }
  }' | 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 "${BASE_URL}/${op_name}?key=${GOOGLE_API_KEY}" | 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-3 分钟的运行时间,但如果资源受限,则可能需要更长时间。运行完成后,您应该会看到如下视频:

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

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

根据图片生成

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

首先,使用 Imagen 生成图片:

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
import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });
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
package main

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

func main() {

    ctx := context.Background()
    client, _ := genai.NewClient(ctx, &genai.ClientConfig{
        APIKey:  os.Getenv("GEMINI_API_KEY"),
        Backend: genai.BackendGeminiAPI,
    })

    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
}

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

operation = client.models.generate_videos(
    model="veo-2.0-generate-001",
    prompt=prompt,
    image = imagen.generated_images[0].image,
    config=types.GenerateVideosConfig(
      # person_generation is not allowed for image-to-video generation
      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)
import { GoogleGenAI } from "@google/genai";
import { createWriteStream } from "fs";
import { Readable } from "stream";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

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=GOOGLE_API_KEY`, // append your API key
    );
    const writer = createWriteStream(`video${n}.mp4`);
    Readable.fromWeb(resp.body).pipe(writer);
  });
}

main();
    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""9:16"。默认值为 "16:9"
  • personGeneration:允许模型生成人物视频。支持以下值:
    • 生成文本到视频:
      • "dont_allow":不允许包含人物或面孔。
      • "allow_adult":生成包含成人但不包含儿童的视频。
    • 图像到视频生成:
      • 不允许;如果使用了参数,服务器会拒绝该请求。
  • numberOfVideos:请求的输出视频,可以为 12
  • durationSeconds:每个输出视频的时长(以秒为单位),介于 58 之间。
  • enhance_prompt:启用或停用提示重写器。默认处于启用状态。

规格

模态
  • 文本转视频生成
  • 图片转视频生成
请求延迟时间
  • 最短:11 秒
  • 最长:6 分钟(高峰时段)
可变长度生成 5-8 秒
解决方法 720p
帧速率 24 帧/秒
宽高比
  • 16:9 - 横向
  • 9:16 - 纵向
输入语言(文字转视频) 英语

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

可以尝试的操作

要充分利用 Veo,请在提示中包含视频专用术语。Veo 可以理解与以下内容相关的各种术语:

  • 镜头构图:指定镜头中的取景和正文数量(例如,“单拍”“二拍”“过肩射”)。
  • 相机定位和移动:使用“水平高度”“高角度”“虫眼”“移动摄影”“变焦镜头”“平移”和“跟踪镜头”等术语来控制相机的位置和移动。
  • 聚焦和镜头效果:使用“浅焦”“深焦”“柔焦”“微距镜头”和“广角镜头”等术语来实现特定的视觉效果。
  • 整体风格和主题:通过指定“科幻”“浪漫喜剧”“动作片”或“动画”等风格,引导 Veo 的创意方向。您还可以描述所需的主题和背景,例如“城市景观”、“自然”、“车辆”或“动物”。

Veo 提示指南

Veo 指南的这一部分包含您可以使用 Veo 制作的视频示例,并向您展示了如何修改提示以生成不同的结果。

安全过滤器

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

提示撰写的基础知识

好的提示应具有描述性且清晰。为了让生成的视频尽可能贴近您的预期,请先确定核心创意,然后通过添加关键字和修饰符来优化创意。

问题应包含以下元素:

  • 正文:您希望在视频中呈现的对象、人物、动物或场景。
  • 背景:正文所处的背景或环境。
  • 动作:对象正在做什么(例如步行、跑步或转头)。
  • 风格:可以是常规内容,也可以是非常具体的内容。请考虑使用具体的电影样式关键字(例如“恐怖电影”“黑色电影”或“卡通风格”等动画样式)。
  • 相机移动:[可选] 相机正在执行的操作,例如航拍视图视线水平自上而下拍摄低角度拍摄
  • 构图:[可选] 镜头的取景方式,例如广角特写极度特写
  • Ambiance:[可选] 色彩和光线对场景的影响,例如蓝色调夜晚暖色调

有关撰写提示的更多提示

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

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

提示和输出示例

本部分将介绍几个提示,着重介绍描述性细节如何提升每个视频的成效。

冰柱

此视频演示了如何在提示中使用提示撰写基础知识

提示 生成的输出
冰冻岩壁(背景)上融化的冰柱(拍摄对象)的特写镜头(背景),采用冷蓝色调(氛围),放大(相机移动),同时维持滴水的特写细节(动作)。 蓝色背景下的滴水冰柱。

一位男士正在打电话

这些视频演示了如何通过提供越来越具体的详细信息来修改问题,以便 Veo 根据您的喜好优化输出结果。

提示 生成的输出 分析
摄像机推车拍摄,特写了身穿绿色风衣的绝望男子。他正在使用带有绿色霓虹灯的旋转式壁挂电话拨打电话。它看起来像电影场景。 一位男士正在打电话。 这是根据提示生成的第一个视频。
电影般的特写镜头跟随一位穿着风雨残破的绿色风衣的绝望男子,他拨打着安装在粗糙砖墙上的旋转电话,而绿色霓虹灯的幽光笼罩着他。摄像机推近,显示了他的下巴紧绷,以及他努力拨打电话时脸上刻下的绝望。浅景深聚焦在他皱眉的眉头和黑色的旋转手机中,将背景模糊成一片霓虹色和模糊不清的阴影,营造出一种紧迫感和孤立感。 一位男士正在打电话 提示越详细,视频的画面越聚焦,环境越丰富。
视频中,一台老式旋转电话靠在墙上,墙上散发着诡异的绿色霓虹光芒,身穿绿色风衣的绝望男子正在使用这部电话,镜头以平滑的动作推向男子。摄像头从中距离开始,慢慢靠近男子的脸部,展示他急切拨打电话时的慌张表情和眉上的汗水。画面聚焦于男子的手,他的手指在拨号盘上摸索,拼命尝试连接。绿色的霓虹灯在墙上投下长长的阴影,更增添了紧张的氛围。画面构图旨在强调男子的孤独和绝望,突出霓虹灯的明亮光芒与男子的坚定决心之间的鲜明对比。 一位男士正在打电话。 添加更多细节可以使拍摄对象显得更加逼真,从而营造出一种紧张而鲜明的场景。

雪豹

此示例演示了 Veo 可能会针对简单的问题生成的输出。

提示 生成的输出
一只毛发如雪豹的可爱生物在冬季森林中漫步,采用 3D 卡通风格渲染。 雪豹无精打采。

奔跑的雪豹

此提示更详细,并展示了生成的输出结果,可能更接近您在视频中想要的内容。

提示 生成的输出
以欢快的卡通风格制作短视频 3D 动画场景。一只可爱的生物,毛皮如雪豹,眼睛又大又有神,身形圆润可爱,在奇幻的冬季森林中快乐地蹦跳。场景应包含圆形的白雪覆盖的树木、轻柔飘落的雪花,以及透过树枝的温暖阳光。该生物的弹跳动作和灿烂笑容应传达出纯粹的喜悦。采用明亮、欢快的色彩和俏皮的动画,营造积极向上、温暖人心的氛围。 雪豹跑得更快了。

编写元素的示例

以下示例展示了如何按每个基本元素来优化提示。

主题

以下示例展示了如何指定主题说明。

主题说明 提示 生成的输出
此说明可以包含一个主题,也可以包含多个主题和操作。在这里,我们的主题是“白色混凝土公寓楼”。 白色混凝土公寓楼的建筑呈现,有流动的有机形状,与郁郁葱葱的绿色植物和未来主义元素无缝融合 占位符。

上下文

以下示例展示了如何指定上下文。

上下文 提示 生成的输出
主体所处的背景或环境非常重要。尝试将正文置于各种背景下,例如繁忙的街道、外太空。 一颗卫星在外太空中漂浮,背景是月亮和一些星星。 在地球大气层中漂浮的卫星。

操作

此示例展示了如何指定操作。

操作 提示 生成的输出
拍摄对象在做什么,例如走路、跑步或转头。 一张广角照片,显示一位女士沿着海滩散步,看着内容,在日落时向地平线放松。 日落绝对美景。

样式

此示例展示了如何指定样式。

样式 提示 生成的输出
您可以添加关键字以提高生成质量并使其更接近预期风格,例如浅景深、电影静止、极简、超现实、复古、未来主义或双重曝光。 黑色电影风格、一男一女在街上散步、神秘、电影感、黑白。 黑色电影风格非常漂亮。

相机移动

此示例展示了如何指定相机运动。

相机移动 提示 生成的输出
摄像头动作选项包括第一人称视角拍摄、航拍、跟踪无人机视图或跟踪拍摄。 在加拿大夜晚下雨时,从一辆老式汽车的车内拍摄的 POV 镜头,具有电影质感。 日落绝对美景。

构图

此示例展示了如何指定构图。

构图 提示 生成的输出
镜头取景方式(广角、特写、低角度)。 一只眼睛的特写,其中倒映着城市。 日落绝对美景。
制作一个视频,其中包含广角镜头拍摄的冲浪者手持冲浪板在沙滩上行走的画面,以及美丽的日落,采用电影般的效果。 日落绝对美景。

氛围

此示例展示了如何指定氛围。

氛围 提示 生成的输出
调色板在摄影中发挥着重要作用,它会影响情绪和传达意图的情感。你可以试试“柔和的橙色暖色调”、“自然光”、“日出”或“日落”等。例如,温暖的金色调色板可以为照片增添浪漫气息。 在阳光明媚的公园里,一个女孩抱着可爱的金毛猎犬小狗的特写镜头。 小女孩怀中抱着一只小狗。
电影般的特写镜头,画面中一名伤心的女人在雨中乘坐公交车,冷色调蓝色,伤感氛围。 一位乘坐公交车的女士表情忧伤。

使用参考图片生成视频

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

提示 生成的输出
手持巧克力棒的兔子。 兔子正在逃跑。
兔子逃跑了。 兔子正在逃跑。

否定提示

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

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

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

提示 生成的输出
生成一个简短的样式化动画,其中显示一棵孤独的大橡树,叶子在强风中剧烈摇摆。树应采用略微夸张、不拘一格的形式,并具有动态流畅的树枝。叶子应该呈现各种秋色,在风中旋转舞动。该动画应使用温暖、吸引人的调色板。 使用字词的树。
生成一个简短的样式化动画,其中显示一棵孤独的大橡树,叶子在强风中剧烈摇摆。树应采用略微夸张、不拘一格的形式,并具有动态流畅的树枝。叶子应该呈现各种秋色,在风中旋转舞动。该动画应使用温暖、吸引人的调色板。

包含负面提示 - 城市背景、人工建筑、黑暗、暴风或威胁气氛。
不含否定字词的树。

宽高比

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

宽高比 说明
宽屏或 16:9 电视、显示器和手机屏幕(横向)最常用的宽高比。如果您想拍摄更多背景(例如风景),请使用这种宽高比。
纵向或 9:16 已旋转宽屏。这种宽高比在 YouTube Shorts 短视频等短视频应用中得到广泛应用。此模式适用于垂直方向较强的竖屏或高体对象,例如建筑物、树木、瀑布或建筑物。

宽屏

此提示是宽屏宽高比 16:9 的示例。

提示 生成的输出
制作视频,通过无人机跟踪视图,拍摄 20 世纪 70 年代棕榈泉,一个男人驾驶一辆红色敞篷车,阳光温暖,阴影长长。 瀑布非常美丽。

纵向

此提示是纵向宽高比为 9:16 的示例。

提示 生成的输出
制作一段视频,重点展示郁郁葱葱的热带雨林中雄伟的夏威夷瀑布平稳的运动。重点呈现逼真的水流、细致的叶子和自然光线,营造宁静氛围。拍摄奔腾的河水、迷雾般的氛围以及透过茂密树冠洒落的阳光。使用流畅的电影镜头运镜来展示瀑布及其周围环境。力求营造宁静、真实的色调,将观看者带入夏威夷热带雨林的宁静美景。 瀑布非常美丽。

后续步骤