Claude Opus 5.5 が SeedRouter で利用できます

Claude Opus 5.5 と Seedance 2.5 で AI ショートフィルムを作る方法

Claude Opus 5.5 を監督役に:絵コンテとプロンプトを書かせ、GPT Image 2.5 でキャラクターを描き、Seedance 2.5 で音声付きのショットを 1 本ずつ生成します。

Markdown で読む

Claude Opus 5.5 と Seedance 2.5 でショートフィルムを作るには、Opus に監督を任せ、作画と撮影をほかの 2 つのモデルに任せます。Opus に物語のアイデアを 1 つ渡すと、固定のキャラクター説明、キャラクターシートのプロンプト、ショットごとの動画プロンプトを書きます。GPT Image 2.5 がそのプロンプトからキャラクターシートと先頭フレームを描きます。Seedance 2.5 はそれらの画像を参照して、セリフと音声付きのショットを 1 本ずつ生成します。最後にショットを 1 つのファイルにつなぎます。3 つのモデルはすべて SeedRouter 上で同じ API キーで呼び出せます。以下のリクエストはすべて SeedRouter の API リファレンスに沿っており、2026 年 9 月 30 日に確認しました。

Claude Opus 5.5 と Seedance 2.5 のワークフローはどう動く?

このアイデアは、あるクリエイターが 2026 年 9 月に r/Seedance_AI で共有したワークフローがもとになっています(元の投稿)。「プロンプトは 1 つも手で書いていません。Opus 5.5 に核となるコンセプトを 1 つと、欲しいスタイルの参考スクリーンショットを数枚渡しただけです。」Opus がキャラクターシート、先頭フレーム、カメラワーク、セリフのタイミング、サウンドのプロンプトを書き、GPT Image 2.5 がキャラクターシートと先頭フレームを描き、Seedance 2.5 がショットを生成しました。

各モデルの役割は 1 つずつです。

ステップモデル入力出力
1. 企画Claude Opus 5.5物語のアイデア、任意でスタイル参考画像キャラクター説明、シートのプロンプト、ショットごとの先頭フレーム用と動画用のプロンプト
2. デザインGPT Image 2.5シートのプロンプト、続いてシートを参照にした先頭フレームのプロンプトキャラクターシートと先頭フレーム(画像 URL)
3. 撮影Seedance 2.5動画プロンプトと、参照画像としてのシートと先頭フレームショットごとに音声付きの動画 1 本
4. 編集ffmpeg または任意の編集ソフトショットのファイル完成したフィルム

ステップ同士は URL でつながります。GPT Image 2.5 が返す画像は SeedRouter のストレージでホストされ、Seedance 2.5 は参照画像を公開 URL で受け取るので、ステップ 2 の出力をダウンロードや再アップロードなしでそのままステップ 3 に渡せます。

始める前に何が必要?

  • SeedRouter の API キーを環境変数に設定します:
export SEEDROUTER_API_KEY="your-key"
  • Python 3 と requests、Anthropic SDK:pip install requests anthropic。
  • 最後にショットをつなぐための ffmpeg。
  • クレジット。 呼び出しはすべて有料リクエストです。失敗したタスクは課金されず、新規アカウントには少額の無料残高があります。

以下の Python コードはすべて、次の 2 行を共通で使います:

import os
import requests

HEADERS = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}

ステップ 1:Claude Opus 5.5 にショットを設計させるには?

Seedance 2.5 がプロンプトをどう読むかを説明したシステムプロンプトを Opus に渡し、スクリプトで扱えるよう企画を JSON で返させます。このシステムプロンプトのルールは ByteDance 公式の Seedance プロンプトガイドから取ったもので、Seedance 2.5 プロンプトガイドにまとめています。被写体と動作を先に書く、1 ショットにカメラの動きは 1 つ、長いショットは時間帯で区切る、参照ファイルは番号で呼ぶ、の 4 点です。

import json
import anthropic

client = anthropic.Anthropic(
    api_key=os.environ["SEEDROUTER_API_KEY"],
    base_url="https://api.seedrouter.ai",
)

DIRECTOR = """You are the director of a short film made with AI models.
Return only JSON, no other text, in this shape:
{"character": "...", "sheet_prompt": "...",
 "shots": [{"duration": 5, "frame_prompt": "...", "video_prompt": "..."}]}

character: one fixed paragraph describing the main character's face, hair,
build and clothes. Repeat it word for word inside every other prompt.

sheet_prompt: an image prompt for one character reference sheet: a front,
three-quarter, profile and back view, plus four facial expressions, on a plain
light background, with no text other than small panel labels.

shots: 3 to 5 shots, each 4 to 15 seconds.
frame_prompt: an image prompt for the first frame of the shot.
video_prompt: a video prompt for Seedance 2.5. Write it in this order: subject
and action, scene, visual style, camera, audio. Image 1 is the character sheet
and Image 2 is the start frame of the shot; refer to them by those names.
Use one camera move per shot. Say who is holding the camera and how they move.
For shots longer than 5 seconds, split the action into time ranges such as
0-3s. Put dialogue in quotes as: Character's line (emotion): content.
Describe the ambient sound. Do not ask for subtitles or on-screen text.

The character must not look like a real, identifiable person. Use a stylized
look, such as a 3D animated or illustrated character."""

message = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    system=DIRECTOR,
    messages=[{
        "role": "user",
        "content": "A lighthouse keeper finds a lost robot on the rocks during a storm and teaches it to wave at passing ships.",
    }],
)
text = "".join(block.text for block in message.content if block.type == "text")
plan = json.loads(text)

いくつか押さえておきたい点があります:

  • max_tokens には思考も含まれます。 Opus 5.5 は常に適応型思考を使い、Opus 5.5 API リファレンスでは思考トークンも max_tokens に数えます。余裕を持たせないと JSON が途中で切れることがあります。
  • temperature、top_p、top_k は送らず、assistant ターンの先埋めもしないでください。 サンプリングの値がデフォルト以外の場合や、応答を先埋めした場合、Opus 5.5 は 400 エラーを返します。思考の深さを調整したいときは output_config.effort を使います。
  • 「誰がカメラを持っているか」は元の投稿のコツです。 投稿者によると、Opus に「友達が後部座席から撮っている」と伝えると、細かな手ブレ、少し遅れるフレーミング、ピント合わせの迷いまで書き込んでくれたそうで、「その 1 つの状況設定が『AI っぽさ』を消す」と述べています。
  • スタイル参考画像は任意です。 Opus は画像を読めるので、欲しい雰囲気のスクリーンショットを user ターンに URL ソースの image ブロックとして追加できます。

json.loads が失敗したら、text を出力してから Opus にもう一度頼みます。何かをレンダリングする前に企画を読むのは、物語を直すいちばん安いタイミングでもあります。ここでの修正はテキストリクエスト 1 回分ですが、レンダリング後の修正には動画の費用がかかります。

ステップ 2:GPT Image 2.5 でキャラクターシートと先頭フレームを作るには?

まず plan["sheet_prompt"] を GPT Image 2.5 に送ります。次に各ショットの frame_prompt を、シートを参照画像にして送ります。こうするとどの先頭フレームにも同じキャラクターが描かれます。画像タスクは /v1/images/generations に送信し、/v1/tasks/{id} から結果を読み取ります:

import time

def image(prompt, size, refs=()):
    body = {"model": "gpt-image-2.5-flare", "prompt": prompt, "size": size, "quality": "high"}
    if refs:
        body["images"] = [{"image_url": url} for url in refs]
    task_id = requests.post(
        "https://api.seedrouter.ai/v1/images/generations",
        headers=HEADERS, json=body, timeout=60,
    ).json()["id"]
    while True:
        task = requests.get(
            f"https://api.seedrouter.ai/v1/tasks/{task_id}", headers=HEADERS, timeout=30,
        ).json()
        if task["status"] == "completed":
            return task["output"]["data"][0]["url"]
        if task["status"] == "failed":
            raise RuntimeError(task["error"]["message"])
        time.sleep(3)

sheet = image(plan["sheet_prompt"], "1536x1024")
frames = [image(shot["frame_prompt"], "1792x1008", [sheet]) for shot in plan["shots"]]

この設定にした理由:

  • 1792x1008 は 16:9 です。 GPT Image 2.5 の size は両辺が 16 の倍数の WIDTHxHEIGHT 形式なので、16:9 の画面は具体的なピクセル数で書く必要があります。16:9 は有効な size ではありません。Seedance に指定する ratio と合わせてください。
  • ほとんどのシートは Flare で十分です。 Sunburst は複数回の編集でより細かく制御できる代わりに遅くなります。使い分けは GPT Image 2.5 Flare と Sunburst の比較を参照してください。
  • 下書きは低めの quality で。 キャラクターを修正している間は、low か medium のほうが速く出ます。撮影に使う画像だけ high に切り替えます。

上の関数は短くするため、期限なしでポーリングしています。実際のコードでは時間制限を設け、タスク ID を保存しておきましょう。中断しても同じタスクを再確認でき、新しく課金されるリクエストを送らずに済みます。

ステップ 3:Seedance 2.5 で各ショットを生成するには?

各 video_prompt を Seedance 2.5 に送り、参照画像を 2 枚付けます。キャラクターシートが Image 1、そのショットの先頭フレームが Image 2 です。Seedance は参照ファイルを添付した順に番号を振るので、この順番を守ってください。動画タスクは専用のエンドポイント /v1/contents/generations/tasks を使い、完了すると status: "succeeded" になります:

def shot(prompt, refs, duration):
    content = [{"type": "text", "text": prompt}]
    for url in refs:
        content.append({"type": "image_url", "image_url": {"url": url}, "role": "reference_image"})
    task_id = requests.post(
        "https://api.seedrouter.ai/v1/contents/generations/tasks",
        headers=HEADERS,
        json={
            "model": "dreamina-seedance-2-5",
            "content": content,
            "resolution": "480p",
            "ratio": "16:9",
            "duration": duration,
            "generate_audio": True,
        },
        timeout=60,
    ).json()["id"]
    while True:
        task = requests.get(
            f"https://api.seedrouter.ai/v1/contents/generations/tasks/{task_id}",
            headers=HEADERS, timeout=30,
        ).json()
        if task["status"] == "succeeded":
            return task["content"]["video_url"]
        if task["status"] in ("failed", "expired"):
            raise RuntimeError(task["error"]["message"])
        time.sleep(15)

videos = [shot(s["video_prompt"], [sheet, frame], s["duration"]) for s, frame in zip(plan["shots"], frames)]

リクエストの選び方:

  • 先頭フレームではなく参照画像を使います。 Seedance 2.5 はショットを正確な先頭フレームに固定することもできます(role: "first_frame")が、Seedance 2.5 API リファレンスには先頭フレームのモードは「参照アイテムと組み合わせられない」とあり、キャラクターシートが使えなくなります。両方を reference_image にした場合は、プロンプトで Image 2 が先頭フレームだと Seedance に伝えます。冒頭はその画像によく沿いますが、ピクセル単位で一致するわけではありません。
  • 下書きは 480p。 まず全ショットを 480p で生成し、うまくいかなかったプロンプトを直してから、採用するショットだけ同じプロンプトで 720p か 1080p でレンダリングします。
  • generate_audio: true にすると、プロンプトからセリフ、環境音、効果音が映像と一緒に生成されます。
  • ratio は固定します。 全ショットのアスペクト比と解像度をそろえておけば、ffmpeg で再エンコードせずにつなげます。

1 ショットは 4〜30 秒で、プロンプトで各カットに時間帯を指定すれば、1 つのタスクに複数のカットを入れることもできます。たとえば投稿者の 2 つ目のシーンでは、ドラムのヒットに合わせて 10 秒に 6 ショットを詰め込んでいます。

すべてのショットで同じキャラクターを保つには?

一貫性は、プロンプトと参照の両方で同じものを繰り返すことで生まれます:

  • 同じ説明を繰り返します。 ステップ 1 の character の段落を、すべての画像・動画プロンプトに一字一句そのまま入れます。同じ人物を 2 通りに説明すると、キャラクターが崩れたり重複したりする原因になります。
  • すべてのショットに同じシートを送ります。 シートは常に Image 1 です。Seedance 2.5 はマルチビューのシートを受け付けます。旧版の Seedance 2.0 はマルチアングルのシートを複数人と読むことがあるため、プロンプトガイドではキャラクターごとに顔のアップと全身の画像を 1 枚ずつ使うよう勧めています。
  • キャラクターはいつも同じ呼び方で。 たとえば「Image 1 の灯台守」のように呼び、画像の中に書かれた名前には頼らないでください。
  • 声も全ショットでそろえます。 Seedance 2.5 は参照音声を最大 10 本(WAV または MP3、2〜30 秒)受け付けます。同じ声のクリップを各ショットに付け、ByteDance の例のようにテキストで結び付けます:「Image 1 は主人公の John で、Audio 1 の声色を使う。」

2 つのショットを目立つ切れ目なしにつなぎたい場合は、別の方法もあります。最初のショットで "return_last_frame": true を指定し、返ってきた content.last_frame_url を次のショットの first_frame として送ります。つなぎ目は固定されますが、次のショットではキャラクターシートを使えなくなるので、すべてのカットではなく、同じシーン内の連続した動作に使いましょう。

実在の人物の写真をキャラクターに使える?

使えません。Seedance 2.5 は実在の人の顔を含む参照画像や参照動画を受け付けず、そうしたタスクは失敗し、課金もされません。Seedance の実在人物エラーで、ByteDance のルールと、ByteDance が自社プラットフォームで用意している選択肢を説明しています。

これはリアルな AI キャラクターにも関わります。元の投稿ではフォトリアルな女性を撮影していますが、ほかのモデルが描いたリアルな顔を ByteDance の顔チェックがどう扱うかは、ドキュメントに書かれていません。上のシステムプロンプトが求めているような 3D アニメやイラスト調のキャラクターにすれば、この問題を避けられます。フォトリアルにしたい場合は、フィルム全体を企画する前に、まず 480p で短いショットを 1 本試してください。

ショットをつないで 1 本のフィルムにするには?

動画を順番にダウンロードし、テキストファイルに並べて ffmpeg でつなぎます:

names = []
for index, url in enumerate(videos):
    name = f"shot-{index + 1}.mp4"
    with open(name, "wb") as file:
        file.write(requests.get(url, timeout=300).content)
    names.append(name)
with open("shots.txt", "w") as file:
    file.writelines(f"file '{name}'\n" for name in names)
ffmpeg -f concat -safe 0 -i shots.txt -c copy film.mp4

-c copy は再エンコードせずにファイルをつなぎます。すべてのショットの解像度、アスペクト比、形式が同じなので、これで問題なく動きます。設定が混在している場合は -c copy を外して ffmpeg に再エンコードさせてください。動画の URL は SeedRouter のストレージでホストされているので、残したいファイルはダウンロードしておきましょう。

Seedance 2.5 のショートフィルムにかかる費用は?

モデルごとに課金単位が異なり、現在の料金は各モデルのページにあります:

  • Claude Opus 5.5 は入力・出力トークン(思考を含む)で課金されます。フィルムの企画は 1 回から数回のリクエストで済みます。料金。
  • GPT Image 2.5 の Flare と Sunburst は、納品された画像 1 枚ごとの定額です。ショートフィルムなら、シート 1 枚とショットごとの先頭フレームで 4〜6 枚です。料金。
  • Seedance 2.5 は動画トークンで課金されます:出力秒数 × 幅 × 高さ × 24 ÷ 1024。16:9 の 1 秒は、480p で 9,607.5 トークン、720p で 21,600、1080p で 48,600 で、1080p には別の料金が適用されます。料金。

費用の大半は動画です。480p の下書きは 720p の半分以下のトークンしか使わないので、480p でプロンプトを直し、最終版だけ高い解像度でレンダリングするのがいちばんの節約になります。計算例は Seedance API の料金にもっと載せています。

よくある質問

Claude Opus 5.5 だけで動画を作れる?

作れません。Opus 5.5 はテキストモデルで、画像を読むことはできますが、画像や動画は生成しません。このワークフローではプロンプトを書く役で、絵と映像は GPT Image 2.5 と Seedance 2.5 が作ります。

Opus 5.5 の代わりに Claude Fable 5.1 を使える?

使えます。Fable 5.1 は同じ Messages リクエストを受け付けるので、model を claude-fable-5-1 に変えるだけです。3 つの比較は Claude Fable 5.1 vs Fable 5 vs Opus 5.5 を参照してください。

Seedance 2.5 のショートフィルムはどのくらいの長さにできる?

Seedance 2.5 のタスク 1 回で 4〜30 秒を生成でき、duration: -1 にすれば長さをモデルに任せられます。長いフィルムは複数のショットをつないで作るので、全体の長さに固定の上限はありません。

ショットごとにキャラクターが変わってしまうのはなぜ?

多くの場合、プロンプトごとにキャラクターの説明が違う、一部のショットでシートが抜けている、または参照ファイルの添付順がプロンプトの番号と合っていない、のどれかです。すべての動画プロンプトに同じキャラクター段落が入っているか、シートが常に最初の画像になっているかを確認してください。

このワークフローで Seedance 2.0 は使える?

使えます。リクエストの形は同じで、モデル ID を変えるだけです。キャラクターシートについては、Seedance 2.0 には 1 枚のマルチビューシートではなく、顔と全身の画像を別々に渡してください。そのほかの違いは Seedance 2.5 と 2.0 の比較にまとめています。

最初のショートフィルムを作ってみよう

まずは 3 ショットの物語を 480p で作ってショットを確認し、最終版を高い解像度でレンダリングしましょう。Seedance 2.5 のページに現在の料金と、ショット 1 本を試せる Playground があります。リクエストの詳細は Seedance 2.5 API ドキュメント、GPT Image 2.5 API ドキュメント、Claude Opus 5.5 API ドキュメントにあります。

関連ガイド