Gemini API で Veo 3.1 による動画を生成
動画理解については、動画理解ガイドをご覧ください。
Veo 3.1 は、Google の最先端のモデルで、高い臨場感を備えた 8 秒、720p、1080p、または 4K の動画(ネイティブ生成の音声付き)を生成します。このモデルは Gemini API を使ってプログラムから利用できます。利用可能な Veo モデルのバリエーションについては、モデルのバージョン セクションをご覧ください。
Veo 3.1 は幅広い視覚的・シネマティックなスタイルに優れており、いくつかの新しい機能を導入しています:
- ポートレート動画:横長(
16:9)と縦長(9:16)の動画から選べます。 - 動画の拡張:以前に Veo で生成した動画を拡張できます。
- フレーム指定の生成:最初のフレームおよび/または最後のフレームを指定して動画を生成します。
- 画像ベースのディレクション:最大 3 枚の参照画像を使用して、生成する動画の内容を導くことができます。
動画生成のための効果的なテキストプロンプトの書き方については、Veo プロンプトガイド をご覧ください
テキストから動画を生成
会話、シネマティックなリアリズム、または創造的なアニメーションで動画を生成する方法を確認するには、例を選択してください:
会話 & 効果音 シネマティックなリアリズム 創造的なアニメーション
Python
import time
from google import genai
from google.genai import types
client = genai.Client()
prompt = """壁に描かれた暗号めいた絵を見つめる 2 人の人物のドアップ。松明の灯りがちらちらと揺れている。
男性がつぶやく「これに違いない。これは秘密の暗号だ。」女性は彼の方を見て、興奮した様子でささやく「あなたは何を見つけたの?」"""
operation = client.models.generate_videos(
model="veo-3.1-generate-preview",
prompt=prompt,
)
# 動画が準備できるまで、操作(operation)の状態をポーリングします。
while not operation.done:
print("動画生成が完了するのを待っています...")
time.sleep(10)
operation = client.operations.get(operation)
返却形式: {"translated": "翻訳されたHTML"}# 生成された動画をダウンロードします。
generated_video = operation.response.generated_videos[0]
client.files.download(file=generated_video.video)
generated_video.video.save("dialogue_example.mp4")
print("生成された動画は dialogue_example.mp4 に保存されました")
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
const prompt = `壁の上の暗号めいた絵を二人がじっと見つめる、クローズアップです。松明の灯りがちらちらと揺れます。
男性がつぶやきます。「これがきっとそうだ。これが秘密のコードだ。」女性は彼を見て、興奮した様子でひそひそと聞き返します。「あなたは何を見つけたの?」`;
let operation = await ai.models.generateVideos({
model: "veo-3.1-generate-preview",
prompt: prompt,
});
// 動画が準備できるまで、操作状況をポーリングします。
while (!operation.done) {
console.log("動画生成が完了するまで待機しています...")
await new Promise((resolve) => setTimeout(resolve, 10000));
operation = await ai.operations.getVideosOperation({
operation: operation,
});
}
返却形式: {"translated": "翻訳されたHTML"}// 生成された動画をダウンロードします。
ai.files.download({
file: operation.response.generatedVideos[0].video,
downloadPath: "dialogue_example.mp4",
});
console.log(`生成された動画は dialogue_example.mp4 に保存されました`);
Go
package main
import (
"context"
"log"
"os"
"time"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := `壁に描かれた謎めいた絵を見つめる二人の人物のクローズアップ。松明の灯りがちらちらと揺れている。
ある男がつぶやく「これに違いない。あの秘密の合図だよ」。女性は彼を見つめて、興奮した様子でささやく「あなたは何を見つけたの?」`
operation, _ := client.Models.GenerateVideos(
ctx,
"veo-3.1-generate-preview",
prompt,
nil,
nil,
) // 動画が準備できるまで操作の状態をポーリングします。
for !operation.Done {
log.Println("動画の生成が完了するのを待っています...")
time.Sleep(10 * time.Second)
operation, _ = client.Operations.GetVideosOperation(ctx, operation, nil)
}
// 生成された動画をダウンロードします。
video := operation.Response.GeneratedVideos[0]
client.Files.Download(ctx, video.Video, nil)
fname := "dialogue_example.mp4"
_ = os.WriteFile(fname, video.Video.VideoBytes, 0644)
log.Printf("生成された動画を %s に保存しました
", fname)
}
Java
import com.google.genai.Client;
import com.google.genai.types.GenerateVideosOperation;
import com.google.genai.types.Video;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;class GenerateVideoFromText {
public static void main(String[] args) throws Exception {
Client client = new Client();
String prompt = "壁に描かれた不可解な絵を、2人が見つめているアップ。松明の灯りが揺らめいている。
" +
"男がつぶやく。『これが違いない。これが秘密のコードだ。』女は彼を見て、興奮した様子でささやく。『あなたは何を見つけたの?』";
GenerateVideosOperation operation =
client.models.generateVideos("veo-3.1-generate-preview", prompt, null, null);
// ビデオの生成が完了するまで、操作のステータスを確認します。
while (!operation.done().isPresent() || !operation.done().get()) {
System.out.println("ビデオ生成の完了を待っています...");
Thread.sleep(10000);
operation = client.operations.getVideosOperation(operation, null);
}
// 生成されたビデオをダウンロードします。
Video video = operation.response().get().generatedVideos().get().get(0).video().get();
Path path = Paths.get("dialogue_example.mp4");
client.files.download(video, path.toString(), null);
if (video.videoBytes().isPresent()) {
Files.write(path, video.videoBytes().get());
System.out.println("生成された動画が dialogue_example.mp4 に保存されました");
}
}
}
REST
# 注: このスクリプトは jq を使用して JSON レスポンスを解析します。
# GEMINI API のベース URL
BASE_URL="https://generativelanguage.googleapis.com/v1beta"
# 動画を生成するリクエストを送信し、操作名を変数に格納します。
operation_name=$(curl -s "${BASE_URL}/models/veo-3.1-generate-preview:predictLongRunning" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-X "POST" \
-d '{
"instances": [{
"prompt": "壁に描かれた暗号めいた絵をじっと見つめる 2 人の人物のクローズアップ。松明の灯りがちらちらと揺れる。男性がつぶやく、\"これはきっとあれだ。あの人が言っていた隠しコードは…\"\"。女性は男性を見て、興奮しながらささやく、\"あなたは何を見つけたの?\""
}
]
}' | jq -r .name)
# 動画の準備ができるまで、操作のステータスをポーリングします
while true; do
# 変数に格納された JSON の完全なステータスを取得します。
status_response=$(curl -s -H "x-goog-api-key: $GEMINI_API_KEY" "${BASE_URL}/${operation_name}")
# 変数に格納された JSON から「done」フィールドを確認します。
is_done=$(echo "${status_response}" | jq .done) if [ "${is_done}" = "true" ]; then
# 最終レスポンスからダウンロードURIを抽出します。
video_uri=$(echo "${status_response}" | jq -r '.response.generateVideoResponse.generatedSamples[0].video.uri')
echo "Downloading video from: ${video_uri}"
# URIとAPIキーを使って動画をダウンロードし、リダイレクトに従います。
curl -L -o dialogue_example.mp4 -H "x-goog-api-key: $GEMINI_API_KEY" "${video_uri}"
break
fi
# 確認する前に5秒待ちます。
sleep 10
done
縦横比を制御する
Veo 3.1 では、横長(16:9、デフォルト設定)または縦長
(9:16)の動画を作成できます。aspect_ratio パラメータを使って、希望する方をモデルに指定できます。
Python
import time
from google import genai
from google.genai import types
client = genai.Client()
prompt = """ピザ作りのモンタージュ:シェフが小麦粉まみれの生地を投げて伸ばし、濃厚な赤いトマトソースを渦を描くように注ぎ、モッツァレラチーズとペパロニを振りかけ、最後に沸き立つ黄金色に焼けたピザのカット。明るいアップビートのエレクトロニック音楽がリズミカルなビートで流れていて、高エネルギーでプロ品質の動画です。"""
operation = client.models.generate_videos(
model="veo-3.1-generate-preview",
prompt=prompt,
config=types.GenerateVideosConfig(
aspect_ratio="9:16",
),
)
# 動画の準備ができるまで、処理状況をポーリングします。
while not operation.done:
print("動画生成が完了するのを待っています...")
time.sleep(10)
operation = client.operations.get(operation)# 生成された動画をダウンロードします。
generated_video = operation.response.generated_videos[0]
client.files.download(file=generated_video.video)
generated_video.video.save("pizza_making.mp4")
print("Generated video saved to pizza_making.mp4")
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
const prompt = `ピザ作りのモンタージュ:シェフが小麦粉の付いた生地を投げてのばし、濃厚な赤いトマトソースを渦を描くようにお玉ですくい、モッツァレラチーズとペパロニを振りかけ、最後にぷくぷくと沸き立つ黄金色の焼き上がりピザのショットで締めくくります。アップビートなエレクトロニックミュージックが、リズミカルなビートに合わせて流れています。高エネルギーのプロフェッショナルな動画。`;
let operation = await ai.models.generateVideos({
model: "veo-3.1-generate-preview",
prompt: prompt,
config: {
aspectRatio: "9:16",
},
});
// ビデオが準備できるまで、操作のステータスをポーリングします。
while (!operation.done) {
console.log("動画の生成が完了するのを待っています...")
await new Promise((resolve) => setTimeout(resolve, 10000));
operation = await ai.operations.getVideosOperation({
operation: operation,
});
}
返却形式: {"translated": "翻訳されたHTML"}// 生成された動画をダウンロードします。
ai.files.download({
file: operation.response.generatedVideos[0].video,
downloadPath: "pizza_making.mp4",
});
console.log(`生成された動画を pizza_making.mp4 に保存しました`);
Go
package main
import (
"context"
"log"
"os"
"time"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := `ピザ作りのモンタージュ:シェフが小麦粉まみれの生地を投げて伸ばし、濃厚な赤いトマトソースを渦を描くようにすくい入れ、モッツァレラチーズとペパロニを振りかけ、最後に湧き立つ黄金色の茶色に焼けたピザのショット。元気なアップビートのエレクトロニック・ミュージックが、リズミカルなビートで流れており、高エネルギーでプロフェッショナルな動画です。`
videoConfig := &genai.GenerateVideosConfig{
AspectRatio: "9:16",
}
operation, _ := client.Models.GenerateVideos(
ctx,
"veo-3.1-generate-preview",
prompt,
nil,
videoConfig,
)
// 動画が準備できるまで操作の状態をポーリングします。
for !operation.Done {
log.Println("動画の生成が完了するまで待機しています…")
time.Sleep(10 * time.Second)
operation, _ = client.Operations.GetVideosOperation(ctx, operation, nil)
}
// 生成された動画をダウンロードします。
video := operation.Response.GeneratedVideos[0]
client.Files.Download(ctx, video.Video, nil)
fname := "pizza_making.mp4"
_ = os.WriteFile(fname, video.Video.VideoBytes, 0644)
log.Printf("生成した動画を %s に保存しました
", fname)
}
REST
# 注: このスクリプトでは、JSONレスポンスを解析するために jq を使用します。
# GEMINI API のベース URL
BASE_URL="https://generativelanguage.googleapis.com/v1beta"
# 動画を生成するリクエストを送信し、操作名を変数に格納します。
operation_name=$(curl -s "${BASE_URL}/models/veo-3.1-generate-preview:predictLongRunning" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-X "POST" \
-d '{
"instances": [{
"prompt": "ピザ作りのモンタージュ:シェフが小麦粉まみれの生地を投げて伸ばし、濃厚な赤いトマトソースを渦を描くようにすくい入れ、モッツァレラチーズとペパロニをふりかけ、最後にぷくぷくと沸き立つ黄金色に焼き上がったピザのカット。陽気なエレクトロニック音楽がリズミカルなビートで流れている、高エネルギーのプロ仕様の動画。"
}
],
返却形式: {"translated": "翻訳されたHTML"} "parameters": {
"aspectRatio": "9:16"
}
}' | jq -r .name)
# 動画が準備できるまで処理のステータスをポーリングします
while true; do
# 完全なJSONステータスを取得して変数に保存します。
status_response=$(curl -s -H "x-goog-api-key: $GEMINI_API_KEY" "${BASE_URL}/${operation_name}")
# 変数に保存されたJSONから「done」フィールドを確認します。
is_done=$(echo "${status_response}" | jq .done)
if [ "${is_done}" = "true" ]; then
# 最終レスポンスからダウンロードURIを抽出します。
video_uri=$(echo "${status_response}" | jq -r '.response.generateVideoResponse.generatedSamples[0].video.uri')
echo "Downloading video from: ${video_uri}"
# URIとAPIキーを使って動画をダウンロードし、リダイレクトに従います。
curl -L -o pizza_making.mp4 -H "x-goog-api-key: $GEMINI_API_KEY" "${video_uri}"
break
fi
# 次に確認する前に5秒待機します。
sleep 10
done
解像度を制御する
Veo 3.1は、720p、1080p、または4kの動画も直接生成できます。
解像度が高いほどレイテンシも高くなる点に注意してください。4k動画はまた、費用も高くなります(料金参照)。
動画の拡張も720p動画に制限されています。
Python
import time
from google import genai
from google.genai import types
client = genai.Client()
返却形式: {"translated": "翻訳されたHTML"}prompt = """カラフルな渓谷の色彩が際立つ、派手な夕日に照らされたグランドキャニオンの見事なドローン空撮です。ドローンはゆっくりと太陽に向かって飛び、その後加速し、急降下して渓谷の中を飛行します。"""
operation = client.models.generate_videos(
model="veo-3.1-generate-preview",
prompt=prompt,
config=types.GenerateVideosConfig(
resolution="4k",
),
)
# 動画が準備できるまで操作状況をポーリングします。
while not operation.done:
print("動画生成が完了するのを待っています...")
time.sleep(10)
operation = client.operations.get(operation)
# 生成された動画をダウンロードします。
generated_video = operation.response.generated_videos[0]
client.files.download(file=generated_video.video)
generated_video.video.save("4k_grand_canyon.mp4")
print("生成された動画は 4k_grand_canyon.mp4 に保存されました")
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
const prompt = `カラフルな渓谷の色彩が際立つ、派手な夕日に照らされたグランドキャニオンの見事なドローン空撮です。ドローンはゆっくりと太陽に向かって飛び、その後加速し、急降下して渓谷の中を飛行します。`;
let operation = await ai.models.generateVideos({
model: "veo-3.1-generate-preview",
prompt: prompt,
config: {
resolution: "4k",
},
});
返却形式: {"translated": "翻訳されたHTML"}// ビデオが準備できるまで操作のステータスをポーリングします。
while (!operation.done) {
console.log("ビデオ生成が完了するまで待機しています...")
await new Promise((resolve) => setTimeout(resolve, 10000));
operation = await ai.operations.getVideosOperation({
operation: operation,
});
}
// 生成されたビデオをダウンロードします。
ai.files.download({
file: operation.response.generatedVideos[0].video,
downloadPath: "4k_grand_canyon.mp4",
});
console.log(`生成されたビデオを 4k_grand_canyon.mp4 に保存しました`);
Go
package main
import (
"context"
"log"
"os"
"time"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
prompt := `グランドキャニオンを、陽気な夕焼けの間に、キャニオンの色を引き立てる見事なドローン視点で。ドローンはゆっくりと太陽へ飛び、その後加速し、急降下して、キャニオンの中を飛行します。`
videoConfig := &genai.GenerateVideosConfig{
Resolution: "4k",
}
operation, _ := client.Models.GenerateVideos(
ctx,
"veo-3.1-generate-preview",
prompt,
nil,
videoConfig,
)
// 動画が準備できるまで操作ステータスをポーリングします。
for !operation.Done {
log.Println("動画生成の完了を待っています...")
time.Sleep(10 * time.Second)
operation, _ = client.Dev



