使用 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 卡通風格。 雪豹是致命性

奔跑中的雪豹

這個提示提供更多詳細資料,並示範生成的輸出內容可能較接近你想要的影片畫面

提示 生成的輸出內容
以歡樂的卡通風格製作 3D 動畫短片場景。這隻可愛生物擁有像雪豹般的毛皮,有著壯觀的眼睛,以及親切、圓弧形的圓滑地,穿梭在獨特的冬季森林中。場景應包含圓形的積雪樹木、輕柔飄落的雪花,以及穿過樹枝的溫暖陽光。生物的彈跳動作和廣角的微笑應傳達純粹愉悅的感受。使用明亮、愉悅的色彩和生動有趣的動畫,營造歡樂、溫馨的氛圍。 雪豹執行速度更快。

範例:編寫元素

以下範例說明如何按每個基本元素修正提示。

主旨

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

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

背景資訊

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

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

動作

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

動作 提示 生成的輸出內容
拍攝目標包括走路、跑步或轉動頭部等等 特寫照:一名女性沿著海灘行走、看著內容,並且在日落時放鬆地向地平線放鬆。 日落景色實在太美了。

樣式

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

樣式 提示 生成的輸出內容
您可以新增關鍵字來提升生成品質,並引導影片更接近預期風格,例如淺景深、電影靜止、微弱、超現實、復古、未來或雙重曝光。 黑白電影風格,一對男女在街上散步,神秘、電影、黑白。 黑底影片風格顯得非常漂亮。

攝影機動作

本例說明如何指定相機動作。

相機動作 提示 生成的輸出內容
攝影機動作選項包括第一人稱視角、空拍、追蹤無人機視角或追蹤鏡頭。 一個 POV 是在加拿大雨天,在加拿大雨天拍攝的復古車所拍攝的。 日落景色實在太美了。

樂曲

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

組合 提示 生成的輸出內容
畫面的構圖方式 (廣角鏡頭、特寫鏡頭、低角度)。 特寫眼球,眼球中反射出城市景觀。 日落景色實在太美了。
製作影片,描繪衝浪者在海灘上散步的廣角畫面,並搭配衝浪板和美麗的日落美景。 日落景色實在太美了。

類別

這個範例說明如何指定氣氛。

Ambiance 提示 生成的輸出內容
調色盤在攝影方面扮演重要角色,能影響情緒和傳達預期的情緒。你可以試試「柔和的橘色暖色調」、「自然光」、「日出」或「日落」等指令。例如,溫暖的金色調色盤可能會將浪漫的情感色彩融入相片中。 特寫:公園內的陽光下,一位女孩手上抱著可愛的黃金獵犬幼犬。 一隻小狗穿著年輕女孩的手臂。
電影動態效果特寫照,一位悲傷的女子在雨中搭乘公車,冷藍色調、傷心的心情。 一名女子騎著公車感到悲傷。

使用參考圖片產生影片

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

提示 生成的輸出內容
兔子拿著巧克力糖果棒。 Bunny 即將走路。
兔子跑走了。 Bunny 即將走路。

負面提示

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

  • ❌ 避免使用說明語言或字詞,例如「否」或「不要」。例如「No walls」或「don't show walls」。

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

提示 生成的輸出內容
產生簡短的圖像化動畫,其中有棵孤立的大橡樹,葉子在強風中搖曳。樹狀結構應具有稍微誇張、別出心裁的形式,具有動態且流動的分支。葉子應顯示各種秋天的色彩,並在風中搖動和跳舞。動畫應使用溫馨且引人入勝的調色盤。 用文字樹立樹木。
產生簡短的圖像化動畫,其中有棵孤立的大橡樹,葉子在強風中搖曳。樹狀結構應具有稍微誇張、別出心裁的形式,具有動態且流動的分支。葉子應顯示各種秋天的色彩,並在風中搖動和跳舞。動畫應使用溫暖且引人入勝的調色盤。

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

顯示比例

Gemini Veo 影片產生功能支援以下兩種顯示比例:

顯示比例 說明
寬螢幕或 16:9 最常用的電視、螢幕和手機螢幕 (橫向) 顯示比例。如要拍攝更多背景,例如風景照,請使用此模式。
直向或 9:16 旋轉寬螢幕。這個顯示比例受到 YouTube Shorts 等短篇影片應用程式歡迎。這種模型適用於垂直方向強烈的肖像照或高聳物體,例如建築物、樹木、瀑布或建築物。

寬螢幕

這項提示為寬螢幕長寬比 16:9 的範例。

提示 生成的輸出內容
製作影片,使用追蹤無人機拍攝棕櫚泉的暖色陽光、長影子,以及一名男子在 1970 年代駕駛紅色敞篷車的畫面。 瀑布十分美觀

直向

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

提示 生成的輸出內容
製作影片,呈現蓊鬱雨林中的宏偉夏威夷瀑布流暢動作。著重於真實的水流、精細的樹葉和自然光,以傳達寧靜。透過濃密的樹冠捕捉揮灑水、迷霧大氣和陽光照射濾鏡。使用電影動態效果的相機動作,展示瀑布及周遭環境。請盡量以平靜且寫實的語氣,將觀眾帶到夏威夷雨林的寧靜美景。 瀑布十分美觀

後續步驟