Sora 2で動画を生成しているアプリは、生成リクエスト、完了待ち、動画の保存を一組としてVeo 3.1へ移す必要があります。既存の指示文や画像素材は移行の出発点になりますが、SoraのジョブIDを引き継いだり、APIのモデル名だけを変更したりする方法では移行できません。
OpenAIが公表しているVideos API、sora-2、sora-2-proの提供終了予定日は2026年9月24日です。3月24日は通知日であり、この記事を更新した9月5日時点では、予定された終了日はまだ到来していません。公式の廃止一覧にVeoを推奨する記載はなく、移行先はアプリの要件に合わせて選ぶ必要があります。OpenAIの提供終了予定
以下は、OpenAI APIからGemini Developer APIのVeo 3.1へ移す開発者向けの説明です。GeminiアプリやFlowの操作、Vertex AIの認証・料金は別に確認してください。日本はGemini APIの対応地域に含まれますが、実際の利用にはアカウントの利用条件や課金設定の確認が必要です。Gemini APIの対応地域
まず、今の動画を同じ条件で作れるか確認する
移行先の選定では、解像度だけでなく、1回で生成する尺、素材の渡し方、音声まで確認します。Veo 3.1は4K出力に対応しますが、あらゆる設定を自由に組み合わせられるわけではありません。Veoのパラメータと仕様
| 既存処理で確認する点 | Sora 2 API | Veo 3.1での対応と変更点 |
|---|---|---|
| 1回の生成で必要な尺 | 現行ガイドには16秒・20秒の生成も記載 | 基本は4秒・6秒・8秒。長いシーンは分割や延長を含めて設計し直します |
| 横長・縦長の出力 | 1280×720、720×1280など。Proは1920×1080、1080×1920にも対応 | アスペクト比は16:9または9:16。解像度と別の設定として指定します |
| 高解像度 | モデルとピクセル寸法で選択 | 720p・1080p・4Kに対応。1080pと4Kでは8秒を指定します |
| 開始時の構図 | input_referenceで開始フレームを指定 | 開始フレームにはimageを使用。画像の渡し方を変更します |
| 終了時の構図 | 既存処理が何を指定しているか確認が必要 | Pythonではimageとlast_frameを組み合わせて指定できます |
| 参照素材 | Sora固有の素材・キャラクター管理 | Veo 3.1では最大3枚の参照画像を指定可能。参照画像を使う生成は8秒です |
| 音声 | 同期した音声を生成 | Gemini APIのVeo 3.1は音声付き動画を生成 |
Sora側の条件は現行の動画生成ガイドとSora 2モデル仕様、Veo側は動画生成ガイドに基づきます。Veo 3.1の出力は24fpsです。納品先で別のフレームレートが必要なら、変換を含めて確認します。機能を試す際は、選択したモデルと生成方法の組み合わせも確認してください。
たとえば、商品を紹介する20秒のワンカット動画をSoraで作っていた場合、Veoへduration_seconds=20を渡す置き換えはできません。短いカットを編集でつなぐのか、Veoで生成した動画を延長するのかを先に決めます。つなぎ目の自然さが納品条件なら、その条件を満たすか確認するまで移行可能とは判断できません。

既存のSora動画をそのまま延長できるわけではない
Veoの動画延長は、Veoで生成した動画を入力にする機能です。1回に7秒ずつ、最大20回延長できますが、延長は720pで行います。保存済みのSoraのMP4を渡して、同じ延長処理を続けられるという仕様ではありません。Veoの動画延長
既存動画から取り出した静止画や、利用できる元の画像素材を開始フレームとして使う方法は検討できます。ただし、これは新しい動画の生成です。動き、声、カメラの軌跡を引き継ぐわけではなく、SoraのキャラクターIDやジョブIDもGoogle側の素材IDには変換できません。
日本語の台詞は、映像と分けて合格を判断する
Googleの説明では英語が全面的なサポート対象で、その他の言語は評価されておらず、結果が変わる可能性があります。また、音声処理や安全フィルタによって動画が生成されない場合もあります。日本語の台詞、固有名詞の読み、口の動きとの一致は、使う台本で確認してください。Veoの制限事項
正確な商品名や決められた文言を必ず読み上げる必要があるなら、生成動画の音声をそのまま採用する方法と、後からナレーションを付ける方法を比較します。後者を選ぶ場合は、音声の差し替えにかかる編集工数も移行後の費用に含めます。4K対応や音声生成の有無だけでは、日本語の広告として使えるかは決まりません。
APIの差分は「作成・確認・取得」の3か所にある
OpenAIの動画APIは、POST /v1/videosでジョブを作成し、GET /v1/videos/{id}で状態を確認します。completedになった後、GET /v1/videos/{id}/contentから動画を取得します。完了通知にvideo.completed、失敗通知にvideo.failedのWebhookを使う構成もあります。OpenAIの動画生成API
Gemini APIは、長時間実行処理を表すoperationを返します。RESTではpredictLongRunningへ送信し、返されたnameを使って進行状況を問い合わせます。Python SDKでは専用のgenerate_videosメソッドを使います。Gemini APIの非同期処理
| 処理 | OpenAIのVideos API | Gemini APIのVeo |
|---|---|---|
| 作成 | POST /v1/videos | POST /v1beta/models/veo-3.1-generate-preview:predictLongRunning |
| 保存しておく識別子 | ジョブのid | operationのname |
| 状態の確認 | queued、in_progress、completed、failed | doneとerror、結果の有無を確認 |
| 結果の取得 | 完了後に/contentを取得 | 生成結果の動画を認証付きでダウンロード |
| Pythonの入口 | OpenAIの動画API | client.models.generate_videos(...) |
GeminiのRESTホストはhttps://generativelanguage.googleapis.comです。認証はx-goog-api-keyで行い、進行状 況はGET /v1beta/{operation_name}で取得します。RESTのdurationSecondsなどの名前と、Pythonのduration_secondsは区別してください。OpenAIのchat.completions.createをVeoのモデル名で呼び出すコードは、この公式APIの移行例にはなりません。
アプリ内では、利用者に見せる依頼番号を維持し、その下にサービス名、モデルID、外部ジョブID、生成条件、保存先を記録する設計が扱いやすくなります。古い依頼はSoraの処理系、新しい依頼はVeoの処理系で追跡できるようにし、SoraのWebhookを停止するタイミングと、新規生成先を切り替えるタイミングを分けて管理します。
done=trueだけで利用者に「動画を保存しました」と通知しないでください。 処理終了時にもエラーや動画なしの結果があり得ます。結果を確認し、ダウンロードして再生できることを確かめた段階で、保存完了にします。
Pythonで生成し、処理を再開してMP4を保存する
次の例は公式SDKの呼び出し方に、operation名の保存と待機時間の上限を加えたものです。8秒・720p・横長のVeo 3.1動画を1件生成します。初回の実行で有料の生成を開始します。 コードは公式資料に基づく実装例です。公式Python例
google-genaiをインストールし、利用可能なプロジェクトのAPIキーを環境変数GEMINI_API_KEYに設定してから実行します。
bashpython -m pip install google-genai
pythonimport time from pathlib import Path from google import genai from google.genai import types client = genai.Client() job_file = Path("veo-operation.txt") output_file = Path("product-shot.mp4") partial_file = Path("product-shot.part.mp4") # 同じ作業フォルダでは、保存済みの処理を再開します。 if job_file.exists(): operation = types.GenerateVideosOperation( name=job_file.read_text(encoding="utf-8").strip() ) operation = client.operations.get(operation) else: operation = client.models.generate_videos( model="veo-3.1-generate-preview", prompt=( "A slow camera orbit around a ceramic teapot on a wooden table. " "Soft morning light. Quiet room ambience, no dialogue." ), config=types.GenerateVideosConfig( duration_seconds=8, resolution="720p", aspect_ratio="16:9", ), ) job_file.write_text(operation.name, encoding="utf-8") # 15分はこの例の待機上限で、サービスの処理時間保証ではありません。 deadline = time.monotonic() + 15 * 60 while not operation.done: if time.monotonic() >= deadline: raise TimeoutError("待機を終了しました。ジョブを再作成せず再開してください。") time.sleep(10) operation = client.operations.get(operation) if operation.error: raise RuntimeError(f"動画生成が失敗しました: {operation.error}") result = operation.response if result is None or not result.generated_videos: raise RuntimeError("処理は終了しましたが、取得できる動画がありません。") video = result.generated_videos[0].video if video is None: raise RuntimeError("動画ファイルの情報がありません。") client.files.download(file=video, destination=str(partial_file)) if not partial_file.is_file() or partial_file.stat().st_size == 0: raise RuntimeError("動画ファイルが保存されていません。") partial_file.replace(output_file) print(f"保存先: {output_file.resolve()}")
この例は1つのフォルダで1件を扱います。保存済みのoperation名があれば、新しい生成を作らず、同じ処理を再確認します。指示文を変更して別の動画を作る場合は、既存ジョブの結果を保存したうえで、別の作業フォルダを用意してください。
待機上限に達してもGoogle側の生成がキャンセルされたとは限りません。通信エラーでも、まず保存済みのoperationを確認します。作成リクエスト自体がタイムアウトし、operation名を受け取れなかった場合は、送信前に失敗したのか、受理後に応答を失ったのかが不明です。無条件に作成を再試行すると、別の生成と課金が発生する可能性があります。
本番ではこのファイル保存を永続的なジョブ管理に置き換え、同じ依頼を複数のワーカーが同時に作成しないようにします。上の例には同時実行の制御や、リクエスト受付からID保存までの障害対策は含まれていません。
ダウンロードまでを生成処理に含める
Veoの生成動画はサーバーに2日間保存され、その後削除されます。外部の動画URLだけをデータベースに残さず、生成後すぐに自分の管理する保存先へコピーしてください。動画の保存期間
サンプルのファイルサイズ確認は、空ファイルを検出するための最小限の処理です。納品完了の判定には、MP4を開けること、想定した尺・解像度であること、音声トラックの有無を確認する処理も必要です。ダウンロードに失敗した場合は、保存済みのジョブから取得を再試行します。動画を取り直すために生成からやり直す必要はありません。
料金は同じ解像度・同じ秒数で比較する
2026年9月5日確認時点の公式API料金は、次のとおりです。金額は米ドルで、アプリの月額契約やクレジット数とは分けて比較します。Veo 3.1は無料枠の対象外で、音声付き動画の生成成功分に課金されます。GoogleのVeo料金、Sora 2料金、Sora 2 Pro料金
| モデル・出力条件 | 1秒あたり | 8秒を1本生成した場合 |
|---|---|---|
| Sora 2:1280×720/720×1280 | $0.10 | $0.80 |
| Sora 2 Pro:1280×720/720×1280 | $0.30 | $2.40 |
| Sora 2 Pro:1792×1024/1024×1792 | $0.50 | $4.00 |
| Sora 2 Pro:1920×1080/1080×1920 | $0.70 | $5.60 |
| Veo 3.1:720p/1080p | $0.40 | $3.20 |
| Veo 3.1:4K | $0.60 | $4.80 |
| Veo 3.1 Fast:720p | $0.10 | $0.80 |
| Veo 3.1 Fast:1080p | $0.12 | $0.96 |
| Veo 3.1 Fast:4K | $0.30 | $2.40 |
| Veo 3.1 Lite:720p | $0.05 | $0.40 |
| Veo 3.1 Lite:1080p | $0.08 | $0.64 |
8秒の金額は「秒単価×8」の計算例です。Veo 3.1 Liteは4Kに対応していません。また、第三者サービスやVertex AIを使う場合は、そのサービスの料金表で計算し直してください。
720pで比較すると、Sora 2とVeo 3.1 Fastの秒単価は同じです。一方、標準のVeo 3.1はSora 2より高くなります。「Veoへ移せば安くなる」と一括りにせず、必要な出力条件を満たすモデルを比べます。標準モデルのIDはveo-3.1-generate-preview、Fastはveo-3.1-fast-generate-previewです。どちらもプレビューモデルなので、採用するIDを設定として管理し、更新時に確認できるようにします。Veoのモデルと仕様
運用上は、成功した生成本数より採用できた動画1本あたりの費用が役立ちます。仮にFastの720pで8秒の動画を100本生成し、60本を採用したなら、生成費は$80、採用1本あたりは約$1.33です。これは採用率60%を仮定した計算で、モデルの実績値ではありません。正常に生成されても演出が合わず不採用になった動画は、無料にはなりません。

長尺化のために複数回生成する費用、保存費、編集費も別に加えます。費用の整理方法を広く確認したい場合は、AI動画生成の費用ガイドも参照してください。
本番切り替えは、保存と復旧まで確認してから行う
短い動画が1本出力できただけでは、既存の処理全体が移行できたとは判断できません。現在使っている入力を種類別に選び、次の条件を確認します。
- 素材と演出:テキストのみ、開始画像あり、人物や商品の参照画像ありなど、実際に使う入力で採用可能な結果になること。日本語の台詞は読みと音声を別途確認します。
- 出力条件:縦横比、解像度、尺、フレームレート、音声が、アプリや納品先の要求を満たすこと。長い動画は接続部分も見ます。
- 復旧:ポーリング途中に処理を止めても、保存したoperation名から再開できること。ダウンロード失敗を生成失敗と混同しないこと。
- 利用者への表示:生成中、生成失敗、保存中、保存完了を区別し、動画がない状態を成功として通知しないこと。
- 費用と処理量:採用動画あたりの費用と、実際のアカウントで使える利用枠が、必要な件数を支えられること。
切り替え時は、新しく受け付ける依頼の一部をVeoへ送り、Soraですでに受け付けた依頼はSora側で完了・保存まで追跡する構成が考えられます。問題が出た際に新規受付を止める手段も用意します。Soraへの切り戻しは、提供終了後まで使える復旧策にはなりません。
最後に、残っているSoraのジョブと必要な成果物の保存を確認し、Veoの処理が生成から再生可能なファイルの保存まで継続して動くことを確かめます。移行の完了条件は、APIが応答することではなく、利用者に必要な動画を届けられ、途中で止まっても復旧できることです。



