「動画生成APIは高すぎる」という思い込みを覆すモデルが登場した
AI動画生成をプロダクトに組み込みたいと考えたとき、多くの開発者が最初にぶつかる壁はコストです。Veo 3やSoraクラスのモデルは1本あたり数十円〜数百円かかり、ユーザーが自由に動画を生成できるサービスを作ろうとすると、あっという間に請求額が膨れ上がる。
2026年3月31日にリリースされたVeo 3.1 Liteは、この課題に正面から取り組んだモデルです。Veo 3.1 Fastと同じ生成速度を維持しながら、コストを50%以上削減しています。720pで1秒あたり約$0.05、つまり8秒の動画1本がおよそ$0.40(約60円)で生成できる計算になります。
個人開発者としてこのモデルを試して最初に驚いたのは、コスト削減の代償として画質が大きく落ちるわけではないという点だった。もちろんVeo 3.1の上位モデルと比べれば差はあるが、SNS向けショート動画やプロトタイプ用途なら十分な品質が出る。ここではVeo 3.1 Lite APIの実装方法と、コストを最小限に抑えながら実用的な動画を生成するテクニックを具体的なコードとともに掘り下げていく。
Veoファミリーの中でLiteを選ぶべき場面
Veo 3.1 Liteを正しく使いこなすには、Veoモデルファミリー全体の中での立ち位置を理解しておく必要があります。
- Veo 3.1(フルモデル): 最高品質。4K出力対応、リファレンス画像からの生成やFirst-Last-Image制御が使える。コストは最も高い
- Veo 3.1 Fast: 速度重視。画質を若干落として生成時間を短縮。4K非対応
- Veo 3.1 Lite: コスト重視。Fastと同等の速度で50%以上安い。720p・1080p対応だが4Kには非対応
Liteを選ぶべきユースケースは3つに集約されます。「大量に生成する必要がある」「プロトタイピング段階で方向性を探りたい」「SNSやWebで使うため4Kは不要」。この3つのどれかに当てはまるなら、Liteが最も合理的な選択になります。
逆に、映像制作の最終出力や、リファレンス画像による厳密なスタイル制御が求められるケースではフルモデルに軍配が上がる。重要なのは「全部Lite」でも「全部フル」でもなく、工程に応じて使い分ける視点です。
環境構築 — APIキー取得からSpend Capsまで
Veo 3.1 Lite APIはGemini APIの一部として提供されています。まだAPIキーを持っていない場合は、Google AI Studio でプロジェクトを作成し、キーを発行しよう。
# Python SDK のインストール
pip install google-genai
# 環境変数にAPIキーを設定(実際のキーに置き換える)
export GEMINI_API_KEY="YOUR_GEMINI_API_KEY"ここで見落としがちな注意点があります。Veo 3.1 Liteは有料プレビュー(Paid Preview)段階にあり、無料枠では利用できません。Google AI Studioでの課金設定が必須です。さらに2026年4月以降、Spend Capsの設定が新規アカウントでは強制されるようになりました。月額の上限を設定しておかないと、意図しないループ処理で高額請求につながるリスクがあります。開発段階では月$10〜$20程度に設定しておくのが安全です。
テキストから動画を生成する基本実装
最もシンプルなtext-to-video(テキストから動画生成)の実装から始めよう。
import time
from google import genai
from google.genai import types
# クライアント初期化(GEMINI_API_KEY環境変数を自動読み込み)
client = genai.Client()
# テキストから動画を生成
# generate_videos() はロングランニングオペレーションを返す
operation = client.models.generate_videos(
model="veo-3.1-lite-generate-preview",
prompt="木漏れ日が差し込む森の中を、一匹の鹿がゆっくりと歩いている。"
"朝霧が地面に漂い、光の筋が幻想的な雰囲気を作り出している。"
"スローモーション、シネマティック、浅い被写界深度。",
generate_video_config=types.GenerateVideoConfig(
aspect_ratio="16:9", # 横長(16:9)または縦長(9:16)
output_resolution="720p", # 720p が最もコスト効率が良い
number_of_videos=1, # 1〜4本まで指定可能
duration_seconds=8, # 5〜8秒(Liteの対応範囲)
),
)
# ポーリングで完了を待つ(720p/8秒なら通常2〜4分)
print("動画生成中...")
while not operation.done:
time.sleep(30)
operation = client.operations.get(operation)
print(f" ステータス確認: done={operation.done}")
# 結果を取得して保存
if operation.response and operation.response.generated_videos:
video = operation.response.generated_videos[0]
client.files.download(file=video.video, download_path="output.mp4")
print("✅ 動画を output.mp4 に保存しました")
else:
print("❌ 動画生成に失敗しました")
if operation.error:
print(f"エラー詳細: {operation.error.message}")このコードで押さえておくべきポイントが2つあります。
ポイント1: 非同期のロングランニングオペレーション。generate_videos()は画像生成APIとは違い、即座にレスポンスを返さありません。内部で動画レンダリングが走るため、ポーリングで完了を確認する必要があります。720pで8秒の動画なら通常2〜4分だが、サーバー負荷が高い時間帯は5分を超えることもあります。
ポイント2: output_resolutionがコストに直結する。720pと1080pでは1秒あたりの単価が異なります。用途に応じた使い分けが肝心です。X(旧Twitter)やInstagram Reelsへの投稿なら720pで見た目上の差はほぼありません。
画像から動画へ — Image-to-Videoの実装
静止画を起点にして動きを加えるimage-to-videoも、Veo 3.1 Liteが対応しています。ECサイトの商品画像を回転させたい、イラストに微細なアニメーションを付けたいといった用途で威力を発揮します。
from google import genai
from google.genai import types
import time
import pathlib
client = genai.Client()
# 入力画像をFiles APIでアップロード
image_path = pathlib.Path("product_photo.jpg")
uploaded_image = client.files.upload(file=image_path)
# 画像を起点に動画を生成
operation = client.models.generate_videos(
model="veo-3.1-lite-generate-preview",
prompt="商品がゆっくりと360度回転し、異なる角度から質感が見える。"
"白い背景、スタジオ照明、プロフェッショナルな商品撮影風。",
image=uploaded_image, # アップロード済み画像を入力として指定
generate_video_config=types.GenerateVideoConfig(
aspect_ratio="16:9",
output_resolution="720p",
number_of_videos=1,
duration_seconds=5, # 商品回転なら5秒で十分
),
)
print("画像→動画 変換中...")
while not operation.done:
time.sleep(30)
operation = client.operations.get(operation)
if operation.response and operation.response.generated_videos:
video = operation.response.generated_videos[0]
client.files.download(file=video.video, download_path="product_video.mp4")
print("✅ 商品動画を product_video.mp4 に保存しました")
else:
print("❌ 変換に失敗しました")
if operation.error:
print(f"エラー詳細: {operation.error.message}")image-to-videoで陥りがちなミスは、入力画像の品質を軽視することです。解像度の低い画像やノイズが乗った画像を入力すると、生成される動画にもそのアーティファクトが引き継がれます。最低でも1280×720以上の解像度で、ピントの合った明瞭な画像を使うのが鉄則です。
コストを半分以下にする5つの実践テクニック
Veo 3.1 Liteは元々安価だが、1日に数百本生成するようなサービスではさらなる最適化が必要になります。実際に試して効果が確認できたテクニックを紹介します。
720pをデフォルトに固定する
前述の通り、解像度はコストに直結します。プレビュー生成、A/Bテスト用の候補作成、社内レビュー用素材など、最終出力以外の用途では必ず720pを指定します。1080pが必要になるのは、YouTube本編やプレゼン資料の最終書き出しくらいです。
尺を必要最小限に絞る
課金は秒単位で計算されます。8秒の動画が不要なら5秒に抑えるだけで37.5%のコスト削減になります。ループ再生を前提としたSNS向け動画なら、5秒で十分なケースが大半です。
まず1本生成してから本番に進む
number_of_videosを2〜4に設定すると複数候補が同時に生成されるが、コストも比例して増える。まず1本生成してプロンプトの方向性を検証し、OKなら本番用に複数本を回す2段階ワークフローが無駄を減らす。
プロンプトにカメラワークを明示する
「スローズーム」「トラッキングショット」「固定ワイドアングル」「ドリーフォワード」のようなカメラ指示を含めると、モデルが意図を正確に汲み取りやすくなります。曖昧なプロンプトは「思ったのと違う」再生成の原因になり、結果的にコストが跳ね上がる。
Spend Capsで安全弁を確保する
Google AI Studioのプロジェクト設定でSpend Capsを必ず有効にしておく。開発中に無限ループが走った場合の保険になります。私は開発環境では月$10、本番では想定利用量の120%を上限に設定しています。
本番で使うためのエラーハンドリング
プロダクションで動画生成APIを使う場合、適切なエラーハンドリングは省略できません。Veo 3.1 Liteで遭遇しやすい3種類のエラーを区別して対処する実装を示す。
import time
from google import genai
from google.genai import types
client = genai.Client()
def generate_video_with_retry(
prompt: str,
max_retries: int = 3,
aspect_ratio: str = "16:9",
resolution: str = "720p",
duration: int = 8,
) -> str | None:
"""リトライロジック付きの動画生成関数。
成功時はファイルパス、失敗時はNoneを返す。
"""
for attempt in range(1, max_retries + 1):
try:
operation = client.models.generate_videos(
model="veo-3.1-lite-generate-preview",
prompt=prompt,
generate_video_config=types.GenerateVideoConfig(
aspect_ratio=aspect_ratio,
output_resolution=resolution,
number_of_videos=1,
duration_seconds=duration,
),
)
# タイムアウト付きポーリング(最大10分)
timeout = 600
elapsed = 0
while not operation.done and elapsed < timeout:
time.sleep(30)
elapsed += 30
operation = client.operations.get(operation)
if elapsed >= timeout:
print(f"[試行 {attempt}/{max_retries}] タイムアウト({timeout}秒経過)")
continue
if operation.response and operation.response.generated_videos:
output_path = f"video_{attempt}.mp4"
video = operation.response.generated_videos[0]
client.files.download(file=video.video, download_path=output_path)
print(f"✅ 生成成功: {output_path}")
return output_path
# セーフティフィルターによるブロック
if operation.error:
error_msg = operation.error.message
print(f"[試行 {attempt}/{max_retries}] エラー: {error_msg}")
if "safety" in error_msg.lower():
print("⚠️ セーフティフィルターでブロックされました。"
"プロンプトの表現を見直してください。")
return None # リトライしても同じ結果なので即終了
except Exception as e:
error_str = str(e)
print(f"[試行 {attempt}/{max_retries}] 例外発生: {error_str}")
# レートリミット(429)は時間を置けば解決する
if "429" in error_str or "quota" in error_str.lower():
wait = 60 * attempt # 指数的に待機時間を延ばす
print(f" → レートリミット検出。{wait}秒待機します...")
time.sleep(wait)
else:
time.sleep(10 * attempt)
print(f"❌ {max_retries}回の試行後も生成に失敗しました")
return None
# --- 使用例 ---
result = generate_video_with_retry(
prompt="都市の夜景をタイムラプスで撮影。車のヘッドライトが光の線になり、"
"高層ビルの窓が次々と点灯していく。ドローン空撮風、ゆっくりとした上昇。",
max_retries=3,
resolution="720p",
)
if result:
print(f"生成された動画: {result}")このコードの設計で重要なのは、セーフティフィルターによるブロックとレートリミットを明確に分けている点です。セーフティブロックはプロンプト自体の問題なので、同じ内容でリトライしても無駄になります。即座にNoneを返して呼び出し元にプロンプト修正を促す。レートリミット(429)は一時的な制限なので、指数バックオフで再試行する価値があります。この区別ができていないと、無駄なリトライでAPI呼び出し回数だけが増えていく。
Liteで試してからスケールアップするのが最善の戦略
Veo 3.1 Liteは「まず低コストで検証する」ためのモデルです。プロトタイプ段階ではLiteの品質で十分判断できるケースが多く、品質が足りない工程だけVeo 3.1 Fastやフルモデルにアップグレードする段階的アプローチが、コストと品質を同時に最適化する現実的な方法になります。
Gemini APIの料金体系全般を俯瞰したい場合はGemini APIコスト最適化完全ガイドが役立つ。Veo 3の基本機能や上位モデルとの違いについてはVeo 3動画生成API完全ガイドで詳しくまとめています。動画生成をナレーションや音楽と組み合わせた制作パイプラインに興味があれば、Google FlowとVeo 3を活用したAI動画制作ガイドも参考になるはずです。