使用 Veo 產生影片

Gemini API 可讓您存取 Veo 2,這是 Google 迄今最強大的影片生成模型。Veo 可產生多種電影和視覺風格的影片,捕捉提示細微差異,以便在各個影格中一致呈現精細細節。本指南可協助您開始使用 Gemini API 的 Veo。

如需影片提示指南,請參閱 Veo 提示指南一節。

事前準備

呼叫 Gemini API 前,請確認您已安裝所選 SDK,並設定好可供使用的 Gemini API 金鑰

如要搭配 Google Gen AI SDK 使用 Veo,請務必安裝下列其中一個版本:

生成影片

本節提供程式碼範例,說明如何使用文字提示使用圖片產生影片。

根據文字生成

您可以使用下列程式碼,透過 Veo 產生影片:

Python

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

JavaScript

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();

Go

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)
  }
}

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-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 生成圖片:

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({ 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

Go

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
}

接著,使用產生的圖片做為第一個影格,產生影片:

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 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)

JavaScript

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();

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""9:16"。預設值為 "16:9"
  • personGeneration:允許模型生成人物影片。支援的值如下:
    • 文字轉影片產生:
      • "dont_allow":不允許包含人物或臉孔。
      • "allow_adult":生成包含成人,但不包含兒童的影片。
    • 圖片轉影片:
      • 不允許;如果使用參數,伺服器會拒絕要求。
  • numberOfVideos:要求輸出影片,可為 12
  • durationSeconds:每部輸出影片的長度,以秒為單位,介於 58 之間。
  • enhance_prompt:啟用或停用提示重寫器。預設為啟用。

規格

模式
  • 文字轉影片生成
  • 圖片轉影片生成
要求延遲
  • 最短:11 秒
  • 上限:6 分鐘 (在尖峰時段)
可變長度產生 5 到 8 秒
解決方法 720p
影格速率 24fps
顯示比例
  • 16:9 - 橫向
  • 9:16 - 直向
輸入語言 (文字轉換成影片) 英文

Veo 製作的影片會使用 SynthID 浮水印,這是我們用來識別 AI 生成內容並加上浮水印的工具,並會經過安全篩選器和記憶檢查程序,有助於降低隱私權、版權和偏見風險。

試試以下功能

如要充分運用 Veo,請在提示中加入影片專屬術語。Veo 可理解下列多種相關詞彙:

  • 拍攝構圖:指定拍攝畫面中的構圖和主體數量 (例如「單鏡頭」、「雙鏡頭」、「肩上鏡頭」)。
  • 攝影機位置和移動:使用「眼睛高度」、「高角度」、「蟲眼視角」、「推軌拍攝」、「縮放拍攝」、「平移拍攝」和「追蹤拍攝」等詞彙,控制攝影機的位置和移動。
  • 焦距和鏡頭效果:使用「淺焦」、「深焦」、「軟焦」、「微距鏡頭」和「廣角鏡頭」等詞彙,以獲得特定視覺效果。
  • 整體風格和主題:指定「科幻片」、「愛情喜劇片」、「動作片」或「動畫片」等風格,引導 Veo 的創意方向。您也可以描述想要的主題和背景,例如「城市景觀」、「自然」、「車輛」或「動物」。

Veo 提示指南

本節的 Veo 指南包含可使用 Veo 製作的影片範例,並說明如何修改提示以產生不同的結果。

安全篩選機制

Veo 會在 Gemini 中套用安全篩選器,確保產生的影片和上傳的相片不含令人反感的內容。違反條款和規範的提示會遭到封鎖。

提示撰寫基本知識

好的提示應具描述性且清楚明瞭。如要讓系統產生的影片盡可能符合您的需求,請先找出核心概念,然後加入關鍵字和修飾符來精進構想。

提示應包含下列元素:

  • 主題:您希望在影片中出現的物件、人物、動物或風景。
  • 背景資訊:主體所在的背景或情境。
  • 動作:主體正在執行的動作 (例如走路跑步轉頭)。
  • 樣式:可以是一般或非常具體的樣式。建議使用特定電影類型的關鍵字,例如恐怖片黑色電影,或是卡通等動畫類型。
  • 攝影機動作:[選用] 攝影機的動作,例如空拍平視自上而下拍攝低角度拍攝
  • 構圖:[選填] 拍攝畫面的構圖方式,例如廣角鏡頭特寫鏡頭特寫鏡頭
  • Ambiance:[選用] 色彩和光線如何影響場景,例如藍色調夜晚暖色調

更多撰寫提示的訣竅

以下提示可協助你撰寫提示,以便產生影片:

  • 使用描述性語言:使用形容詞和副詞,向 Veo 提供明確的資訊。
  • 提供背景資訊:視需要提供背景資訊,協助模型瞭解您想要的結果。
  • 參考特定藝術風格:如果您有特定美學概念,請參考特定藝術風格或藝術流派。
  • 善用提示工程工具:建議您探索提示工程工具或資源,協助您修正提示並取得最佳結果。如需更多資訊,請參閱「提示設計簡介」。
  • 強化個人和團體相片中的臉部細節:指定臉部細節做為相片的焦點,例如在提示中使用「肖像」一詞。

提示和輸出內容範例

本節提供幾個提示,說明描述性細節如何提升每部影片的成效。

冰柱

這部影片示範如何在提示中使用提示撰寫基本要素

提示 生成的輸出內容
在冰凍的岩壁上,以冷色調 (氛圍) 拍攝融化的冰柱 (主題) 特寫鏡頭 (構圖),並以縮放 (相機動作) 維持水滴 (動作) 的特寫細節。 藍色背景的滴水冰柱。

男子在講電話

這些影片將示範如何修改提示,加入越來越具體的詳細資料,讓 Veo 根據您的喜好調整輸出內容。

提示 生成的輸出內容 分析
鏡頭以平移方式,呈現一名身穿綠色風衣的絕望男子特寫畫面。他正在使用旋轉撥號式壁掛式電話撥打電話,電話上有綠色霓虹燈。看起來就像電影場景。 男子在講電話。 這是根據提示產生的第一部影片。
特寫鏡頭拍攝一名絕望的男子,他穿著褪色的綠色風衣,撥打掛在粗糙磚牆上的旋轉撥號電話,綠色霓虹燈招牌發出詭異的光芒,攝影機鏡頭拉近,顯示他下巴的緊繃表情,以及他努力打電話時臉上顯露的絕望。淺景深的效果將焦點放在他皺起的眉頭和黑色旋轉式電話上,背景則模糊處理成霓虹色調和模糊陰影,營造出緊急和孤立的氛圍。 男子講電話 詳細提示可讓影片更聚焦,並提供更豐富的環境。
影片以流暢的動作,拉近鏡頭,拍攝一名身穿綠色風衣的絕望男子,在牆上使用古老的旋轉撥號電話,並沐浴在詭異的綠色霓虹燈光中。鏡頭從中距離開始,慢慢靠近男子的臉,揭露他焦慮的表情和額頭上的汗水,同時他急忙撥打電話。焦點放在男子的手上,他的手指在撥盤上笨拙地撥動,試圖連線。綠色霓虹燈投射在牆上的長影,營造出緊張的氣氛。這場景的構圖強調了男子的孤立和絕望,突顯出霓虹燈的鮮豔光芒與男子嚴肅的決心之間的強烈對比。 男子在講電話。 加入更多細節,可讓主體呈現逼真的表情,並營造出強烈而生動的場景。

雪豹

以下範例說明 Veo 可能為簡單提示產生的輸出內容。

提示 生成的輸出內容
毛色如雪豹的可愛生物在冬季森林中漫步,3D 卡通風格渲染。 雪豹昏昏欲睡。

奔跑中的雪豹

這則提示會提供更多詳細資訊,並示範產生的輸出內容,這些內容可能更接近您在影片中想要的內容。

提示 生成的輸出內容
以歡樂的卡通風格製作 3D 動畫短片場景。這隻可愛的生物有著雪豹般的毛皮、大而有表情的眼睛,以及友善圓潤的外型,在奇幻的冬季森林中快樂地奔跑。場景應包含圓形的積雪樹木、輕柔飄落的雪花,以及穿過樹枝的溫暖陽光。生物的彈跳動作和燦爛笑容,應傳達純粹的喜悅。使用明亮、愉悅的色彩和生動有趣的動畫,營造歡樂、溫馨的氛圍。 雪豹執行速度更快。

依書寫元素分類的範例

這些範例說明如何根據每個基本元素調整提示。

主旨

這個範例說明如何指定主題說明。

主旨說明 提示 生成的輸出內容
說明可以包含主題,或多個主題和動作。這裡的主題是「白色混凝土公寓大樓」。 建築外觀算繪圖:白色混凝土公寓大樓,流暢的自然形狀與鬱鬱蔥蔥的綠意和未來主義元素完美融合 預留位置。

背景資訊

這個範例說明如何指定情境。

背景資訊 提示 生成的輸出內容
主體的背景或情境非常重要。試著將拍攝對象置於各種背景中,例如繁忙的街道或外太空。 一顆衛星在外太空漂浮,背景有月亮和一些星星。 在氣氛中漂浮的衛星。

動作

這個範例說明如何指定動作。

動作 提示 生成的輸出內容
拍攝對象正在做什麼,例如走路、跑步或轉頭。 廣角鏡頭拍攝一名女子沿著海灘散步,她看起來很滿足且放鬆,望向日落時分的地平線。 日落景色實在太美了。

樣式

這個範例說明如何指定樣式。

樣式 提示 生成的輸出內容
您可以新增關鍵字來改善生成品質,並讓生成內容更接近預期風格,例如淺景深度、電影劇照、極簡、超現實、復古、未來感或雙重曝光。 黑色電影風格、男女在街上散步、神秘、電影風格、黑白。 黑色電影風格非常美麗。

攝影機動作

這個範例說明如何指定攝影機動作。

攝影機動作 提示 生成的輸出內容
攝影機動作選項包括第一人稱視角、空拍、追蹤無人機視角或追蹤鏡頭。 在加拿大夜晚,透過老式汽車的車窗拍攝,呈現雨中行駛的畫面,呈現電影般的視角。 日落景色非常美麗。

樂曲

本範例說明如何指定組合。

組合 提示 生成的輸出內容
拍攝鏡頭的構圖方式 (廣角鏡頭、特寫鏡頭、低角度鏡頭)。 特寫眼球,眼球中反射出城市景象。 日落景色實在太美了。
製作影片,以寬廣鏡頭拍攝衝浪客拿著衝浪板在海灘上行走,搭配美麗的日落,營造電影般的氛圍。 日落景色非常美麗。

類別

這個範例說明如何指定環境光源。

Ambiance 提示 生成的輸出內容
調色盤在攝影中扮演著重要角色,影響情緒並傳達意圖。你可以說「柔和的橘色暖色調」、「自然光」、「日出」或「日落」等。舉例來說,溫暖的金色調色板可為相片增添浪漫氛圍。 特寫:公園內的陽光下,一位女孩手上拿著可愛的黃金獵犬幼犬。 小女孩手臂上的小狗。
電影風格特寫鏡頭:一位傷心的女士在雨中搭乘公車,冷色調藍色調,悲傷的氛圍。 一名女子在公車上感到難過。

使用參考圖片產生影片

您可以使用 Veo 的圖片轉影片功能,讓圖片更生動。您可以使用現有素材資源,或試試 Imagen 產生新素材資源。

提示 生成的輸出內容
兔子拿著巧克力糖果棒。 兔子正在逃跑。
兔子跑走了。 兔子正在逃跑。

負面提示

排除提示是一種強大的工具,可協助您指定影片中不希望出現的元素。說明您希望模型在「負面提示」詞後不產生哪些內容。請遵循下列提示:

  • ❌ 請勿使用「不」或「不要」等指示性用語或字詞。例如「No walls」或「don't show walls」。

  • ✅ 請說明您不想看到的內容。例如「牆、相框」,表示你不希望影片中出現牆或相框。

提示 生成的輸出內容
生成一則短小精緻的動畫,內容是孤立的大橡樹在強風中搖曳,葉子隨風飄動。樹木應具有略為誇張、奇特的形狀,並具有動態的流動樹枝。葉子應呈現各種秋天色彩,在風中旋轉舞動。動畫應使用溫暖、吸引人的色彩組合。 使用單字的樹狀圖。
生成簡短的動畫,以特殊風格呈現一棵孤立的大橡樹,葉子在強風中搖曳。樹木應具有略為誇張、奇特的形狀,並具有動態的流動樹枝。葉子應呈現各種秋天色彩,在風中旋轉舞動。動畫應使用溫暖、吸引人的色彩組合。

含有負面提示 - 都市背景、人造建築物、黑暗、暴風或威脅的氣氛。
沒有負面字詞的樹狀結構。

顯示比例

Gemini Veo 影片生成工具支援下列兩種顯示比例:

顯示比例 說明
寬螢幕或 16:9 電視、螢幕和手機螢幕 (橫向) 最常見的顯示比例。如要拍攝更多背景,例如風景照,請使用此模式。
直向或 9:16 旋轉的寬螢幕。這類長寬比已在短篇影片應用程式 (例如 YouTube Shorts) 中廣為流行。適用於具有明顯垂直方向的肖像或高物體,例如建築物、樹木、瀑布或建築物。

寬螢幕

這個提示是 16:9 寬螢幕顯示比例的範例。

提示 生成的輸出內容
製作影片,使用無人機追蹤拍攝棕櫚泉的景色,並在 1970 年代,拍攝暖色陽光和長影子。 瀑布實在太美了。

直向

這則提示是 9:16 直向顯示比例的範例。

提示 生成的輸出內容
製作影片,突顯茂密雨林中壯麗的夏威夷瀑布流暢的動作。著重於真實的水流、細緻的樹葉和自然光線,營造寧靜氛圍。捕捉湍急的河水、朦朧的氣氛,以及穿過茂密樹冠的斑駁陽光。使用流暢的電影鏡頭移動方式,展示瀑布及其周遭環境。盡量營造平靜、寫實的氛圍,讓觀眾沉浸在夏威夷雨林的寧靜美景中。 瀑布實在太美了。

後續步驟