GPT-6 Sol・Claude Opus 5.5 提供開始GPT-6 Sol の料金は 5.6 Sol の半額

Seedance 2.0 API の使い方:Python でテキスト動画と画像動画を生成する

1本のスクリプトがタスクを作成し、状況を確認し、MP4 を保存します。項目と制限、そして 2026 年 10 月 30 日に生成した5秒の動画2本をまとめます。

Kiki, OmniaKey COO読了目安 11分
このページの内容

Seedance 2.0 は OmniaKey のメディア API で動き、モデル ID は dreamina-seedance-2-0-260128 です。https://api.omniakey.com/v1/media/tasks にタスクを POST し、タスク ID をポーリングしてから MP4 をダウンロードします。2026 年 10 月 30 日に生成した5秒・720p の動画2本は、テキストからが 159 秒、静止画からが 139 秒で完成しました。

先に結論

  • モデル ID は dreamina-seedance-2-0-260128 で、操作は text_to_video、image_to_video、reference_to_video の3つです(OmniaKey の 動画 API ドキュメント、2026 年 10 月 30 日確認)。
  • 作成、ポーリング、ダウンロードの順に進みます。作成の呼び出しは 202 とタスク ID を返し、その後は数秒おきに GET /v1/media/tasks/{id} を実行して、ステータスが succeeded になるまで待ちます(OmniaKey の メディア API 概要、2026 年 10 月 30 日確認)。
  • 長さは 4〜15 の整数秒です。2.0 の完全な ID は 480P、720P、1080P を出力します。
  • リクエスト本文は全体で 1 MiB 未満です。インラインの base64 も含みます。
  • 5秒・720p の2本は、テキストからが 159 秒、最初のフレームからが 139 秒で完了しました。

最初の呼び出しに何を用意する?

OmniaKey の API キー、Python 3、そして正確なモデル ID です。スクリプトは標準ライブラリだけを読み込むので、仮想環境もパッケージのインストールも要りません。

最初の呼び出しの前に、キーを OMNIAKEY_API_KEY としてエクスポートします。スクリプトは1回だけ読み込み、毎回のリクエストで Bearer トークンとして送ります。キーはファイルにも git の履歴にも残りません。

作成は POST https://api.omniakey.com/v1/media/tasks、ポーリングは GET https://api.omniakey.com/v1/media/tasks/{id} です。これに POST /v1/media/tasks/{id}/cancel を加えた3つがメディア API のすべてです(メディア API 概要、2026 年 10 月 30 日確認)。

モデル ID は省略せずに書きます。OmniaKey は seedance-2 や seedance-2-5 のような短い別名を提供しておらず、503 no_available_channel が返ります(動画 API ドキュメント、2026 年 10 月 30 日確認)。

動画のタスクは生成される秒数に応じて事前に課金されます。タスクが failed か canceled で終わると、その分は自動で戻ります(メディア API 概要、2026 年 10 月 30 日確認)。1秒あたりの現在の料金は Seedance 2.0 のモデルページ にあります。

Seedance 2.0 のリクエストにはどの項目が必要?

4つのトップレベル項目がタスクを運び、parameters オブジェクトが出力設定を持ちます。妥当な既定値がないのは duration だけなので、毎回送ります。

  • model:完全なモデル ID(短い別名は失敗する)
  • type:video(メディアの種別)
  • operation:text_to_video、image_to_video、reference_to_video(接頭辞なしの名前)
  • input.prompt:文字列1つ(場面、動作、カメラ。最大 12,000 文字)
  • input.media[]:{"type": "first_frame", "url": …}(最初のフレーム、または reference_image)

parameters の中は次のとおりです。

  • duration:4〜15 の整数秒(料金を決める)
  • resolution:480P、720P、1080P(Fast と Mini は 720P まで)
  • ratio:16:9、9:16、1:1、4:3、3:4、21:9、adaptive(adaptive は画像に合わせる)
  • generate_audio:既定は true、false も可(false で無音の MP4)
  • n:1(1 のみ)

この 2 つのリストは OmniaKey の 動画 API ドキュメント と メディア API 概要(2026 年 10 月 30 日確認)に基づき、プロンプトの上限はモデルページによります。

操作名はそのまま送ります。メディア種別の接頭辞は OmniaKey が付けます(動画 API ドキュメント、2026 年 10 月 30 日確認)。認識しないパラメータはそのまま提供元に渡されます(メディア API 概要、2026 年 10 月 30 日確認)。

ベンダーのドキュメントから始めると、ひとつ落とし穴があります。BytePlus の作成タスク API は項目を content[] とトップレベルに置くため、BytePlus のチュートリアルのコードは /v1/media/tasks ではそのまま動きません(BytePlus の作成タスク API、2026 年 10 月 30 日確認)。

Python スクリプト

1つのファイルで両方の操作を実行し、違いは組み立てる本文だけです。seedance_video.py として保存し、python3 seedance_video.py で実行します。

python
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid

API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "dreamina-seedance-2-0-260128"

def request(method, url, body=None, extra_headers=None):
    headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
    data = None
    if body is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(body).encode()
    headers.update(extra_headers or {})
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    with urllib.request.urlopen(req, timeout=120) as resp:
        return json.load(resp)

def poll(url, attempts=5):
    for attempt in range(attempts):
        try:
            return request("GET", url)
        except urllib.error.HTTPError as err:
            if err.code < 500 or attempt == attempts - 1:
                raise
        except urllib.error.URLError:
            if attempt == attempts - 1:
                raise
        time.sleep(5 * (attempt + 1))

def run_task(body, out_path):
    task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
    print("task", task, flush=True)
    for _ in range(180):  # 5秒ごとに確認し、最大15分
        time.sleep(5)
        state = poll(f"{API}/{task}")
        if state["status"] not in ("queued", "processing"):
            break
    else:
        raise TimeoutError(f"{task} is still {state['status']}: poll it again later, do not resubmit")
    if state["status"] != "succeeded":
        raise RuntimeError(state.get("error") or state["status"])
    asset_url = state["assets"][0]["url"]  # 署名付きリンクは短命なので、すぐダウンロード
    req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
    with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
        f.write(resp.read())
    return task

def text_to_video(prompt, out_path, duration=5, resolution="720P", ratio="16:9"):
    body = {
        "model": MODEL,
        "type": "video",
        "operation": "text_to_video",
        "input": {"prompt": prompt},
        "parameters": {"duration": duration, "resolution": resolution, "ratio": ratio},
    }
    return run_task(body, out_path)

def image_to_video(prompt, image_path, out_path, duration=5, resolution="720P", audio=False):
    with open(image_path, "rb") as f:
        raw = f.read()
    if len(raw) > 700_000:  # base64 で3分の1増えるため、本文全体は 1 MiB 未満に保つ
        raise ValueError("first frame too large: save it as a JPEG about 1024 px wide")
    frame = "data:image/jpeg;base64," + base64.b64encode(raw).decode()
    body = {
        "model": MODEL,
        "type": "video",
        "operation": "image_to_video",
        "input": {"prompt": prompt, "media": [{"type": "first_frame", "url": frame}]},
        "parameters": {"duration": duration, "resolution": resolution, "ratio": "adaptive",
                       "generate_audio": audio},
    }
    return run_task(body, out_path)

if __name__ == "__main__":
    print("done", text_to_video(
        "Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles "
        "rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly "
        "pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.",
        "sparkling-glass.mp4",
    ))
    print("done", image_to_video(
        "The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. "
        "Raindrops keep running down the glass. The camera stays still.",
        "cat.jpg",
        "cat-wakes.mp4",
    ))

変更する前に、このファイルの6つのポイントを確認してください。

  • 作成リクエストは毎回ランダムな Idempotency-Key を持ちます。同じキーと同じ本文で再送すると、元のタスクが HTTP 200 で返り、二重に課金されません(メディア API 概要、2026 年 10 月 30 日確認)。
  • ループはポーリングの間に5秒待ち、180回で止まります。合計15分です。
  • タイムアウトは、タスクがまだレンダリング中という意味です。同じタスク ID を後で再度ポーリングし、絶対に再送しないでください。2本目の料金が発生します。
  • assets[0].url は約1時間有効な署名付きリンクです。そのためスクリプトはタスクの成功後すぐにダウンロードします(メディア API 概要、2026 年 10 月 30 日確認)。
  • progress.percent はタスク実行中ずっと 0 のことがあるため、ループは status だけを見ます(動画 API ドキュメント、2026 年 10 月 30 日確認)。
  • 画像の関数は 700,000 バイトを超えるファイルを拒否します。base64 で3分の1増え、本文は 1 MiB 未満に収める必要があるためです。

リクエストの形は 同じ API の Kling 3.0 と同じです。モデルを変えるときはモデル ID とパラメータが変わり、その周りのコードはそのままです。

画像から動画への最初のフレームはどう送る?

画像を input.media[] に入れ、"type": "first_frame" を指定して、data:image/jpeg;base64,... の URI としてインラインで送ります。ネコの動画はこの形でした。

input.media[] は公開 HTTPS の URL もインラインの data URI も受け付け、本文全体は 1 MiB までです(動画 API ドキュメント、2026 年 10 月 30 日確認)。OmniaKey のテストでは、通常の HTTPS のフレームリンクが provider_submit_rejected で拒否されたため、例では data URI を送っています(動画 API ドキュメント、2026 年 10 月 30 日確認)。

base64 で3分の1増えるので、幅 1024 ピクセル程度の JPEG から始めてください。今回の最初のフレームは 134,356 バイトでしたが、4 MB の PNG は拒否されます。

ここでは parameters.ratio を adaptive のままにします。送った画像の形に従うので、1024×571 の静止画が 1280×720 の動画になりました。reference_to_video では同じ配列に "type": "reference_image" を入れます(動画 API ドキュメント、2026 年 10 月 30 日確認)。

実際に作った2本の動画

2つのタスクは 2026 年 10 月 30 日に、上のファイルをそのまま使って送りました。1本目はテキストから動画で、タスクは task_uF2QUtbeAAUW11lXEaLxNw1ZnBUoqvNk、01:39:43 UTC に作成し、01:42:22 UTC に成功しました。プロンプトで注ぐ音を求めたので、音声はオンのままです。

prompt
Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.
木のバーカウンターに置かれたグラスの8フレーム。水を注ぐ空の状態から、泡が底にたまった満杯のグラスまで。
グラスの動画を時間順に並べた8フレーム、0.0〜5.0 秒。Seedance 2.0、OmniaKey API 経由、テキストから動画、5秒、720P、2026 年 10 月 30 日生成。

フレームには、木のバーカウンターの上の氷入りのグラス、その奥にぼけたボトルと暖かい照明が写っています。グラスは最初のフレームから最後のフレームへ大きくなり、プロンプトが求めたプッシュインになり、最後は泡が底にたまった満杯のグラスで終わります。

2本目は画像から動画で、タスクは task_u85W0jn1sQLkrszJlxqXF1hxJYhsndxK、01:42:33 UTC に作成し、01:44:52 UTC に成功しました。最初のフレームは、雨の窓辺で古い本の山の上に寝ている茶トラ猫の静止画(1024×571 ピクセル)で、"type": "first_frame" を付けた data URI として送りました。

prompt
The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. Raindrops keep running down the glass. The camera stays still.
雨の窓辺で本の山の上に寝ている茶トラ猫の8フレーム。目覚めて、前足を伸ばし、あくびをする。
ネコの動画を時間順に並べた8フレーム、0.0〜5.0 秒。Seedance 2.0、OmniaKey API 経由、画像から動画、5秒、720P、2026 年 10 月 30 日生成。

ネコは頭を上げ、目を開け、前足2本を本の端の外へ伸ばし、大きくあくびをしてから窓のほうへ頭を向けます。順番はプロンプトどおりです。雨は窓ガラスを流れ続け、カメラは動きません。

左が最初のフレームとして送った茶トラ猫の静止画、右が動画の最後のフレーム。前足は本の外へ伸び、頭は窓のほうを向いている。
左:最初のフレームとして送った静止画。右:ネコの動画の最後のフレーム。Seedance 2.0、OmniaKey API 経由、画像から動画、5秒、720P、2026 年 10 月 30 日生成。

この2回はテキストから動画と、720P・5秒の最初のフレームをカバーします。1080P、Fast、Mini、2.5、reference_to_video、HTTPS のフレームリンク、その他の長さは試していません。

ファイルの実測値

どちらのダウンロードも H.264 の MP4 で、1280×720、24 fps、121 フレーム、5.04 秒です。

動画グラスネコ
操作テキストから動画画像から動画
完了まで159 秒139 秒
ファイルサイズ2,070,248 バイト1,352,027 バイト
映像1280×720、24 fps、121 フレーム1280×720、24 fps、121 フレーム
音声AAC トラックなし

グラスの動画には注ぐ音、泡の音、氷の触れ合う音が入っていて、声も音楽もありません。ネコの動画には音声トラックがまったくありません。リクエストで generate_audio: false を送ったためです。

どちらのタスク記録も usage.completion_tokens: 108900 を報告しました。これは 121 × 1280 × 720 ÷ 1024 で、BytePlus が動画の課金見積もりに使うトークンの式です(BytePlus の料金ページ、2026 年 10 月 30 日確認)。

OmniaKey のドキュメントでは、6秒・720p の動画は通常1分ほどで完了します(動画 API ドキュメント、2026 年 10 月 30 日確認)。今回の2本は 159 秒と 139 秒で、10 月 26 日の比較 の5秒・720p の3本は 144.8、319.0、184.7 秒でした。2〜5分を見込み、リクエストを開いたままにせずポーリングしてください。

どんなエラーと制限に当たる?

まず3つの設定を確認します。モデル ID、4〜15 の長さ、そして音声です。提供元のフィルターが音声を拒否することがあります。

ステータス / コード変更する点
400 invalid_request本文または input.prompt
400 model_price_error長さを 4〜15 秒に
403 model_not_allowedキーのモデル権限
409 idempotency_key_reused本文ごとに新しいキー
503 no_available_channel完全な ID、接頭辞なしの操作名
失敗したタスク、提供元のエラーerror を読んで再試行

これらのコードはメディア API 概要と動画 API ドキュメントによります(2026 年 10 月 30 日確認)。failed で終わったタスクは事前課金が戻るので、拒否されたレンダリングは時間だけの損失です。

音声の設定に注意してください。Seedance は既定で音声トラックを作り、オンのままだと提供元が 4秒・480P のリクエストを OutputAudioSensitiveContentDetected.PolicyViolation で拒否しました。場面に音が必要なければ parameters.generate_audio: false を送ります(動画 API ドキュメント、2026 年 10 月 30 日確認)。

BytePlus によると、2.0 シリーズは実在の人の顔を含む参照画像や参照動画を受け付けません(BytePlus の Seedance 2.0 ページ、2026 年 10 月 30 日確認)。Seedance 2.0 には seed も camera_fixed もありませんが、どちらもベンダーの作成タスク API にある項目です(BytePlus の作成タスク API、2026 年 10 月 30 日確認)。

15秒がこのシリーズの上限で、duration: -1 でもそれ以上は作れません。20秒や30秒の映像は Seedance 2.5 の担当です(Seedance 2.0 のモデルページ、2026 年 10 月 30 日確認)。

OmniaKey は固定のレート制限を公開していません。HTTP 429 は再試行できるものとして扱い、間隔を広げながら再試行してください(OmniaKey の API エラーページ、2026 年 10 月 30 日確認)。

Seedance 2.0、Fast、Mini、2.5 のどれを選ぶ?

4つの階層は同じ本文を受け付けるので、切り替えはモデル ID ひとつ分です。Fast と Mini では解像度の上限が下がります。

  • Seedance 2.0、dreamina-seedance-2-0-260128:480P、720P、1080P、4〜15 秒。BytePlus の定価は5秒の動画で 720p が $0.76、480p が $0.35 です(BytePlus の料金ページ、2026 年 10 月 30 日確認)。
  • Seedance 2.0 Fast、dreamina-seedance-2-0-fast-260128:480P、720P、4〜15 秒。5秒の動画は 720p が $0.60、480p が $0.28 です。
  • Seedance 2.0 Mini、dreamina-seedance-2-0-mini-260615:480P、720P、4〜15 秒。5秒の動画は 720p が $0.38、480p が $0.18 です。
  • Seedance 2.5、dreamina-seedance-2-5-260628:20秒や30秒の映像を作れるこのシリーズ唯一の ID で、いちばん遅く、4秒・480P の動画に約4分かかります(動画 API ドキュメント、2026 年 10 月 30 日確認)。画質の話は Seedance 2.5 のレビュー にあります。

OmniaKey のモデルページでは、4秒・480P の動画が 2.0 で約1分、Fast で約2分、Mini で 100 秒とされています(2026 年 10 月 30 日確認)。

1080P のマスターが必要なら 2.0 の完全な ID を選んでください。Fast と Mini は 720P までです(動画 API ドキュメント、2026 年 10 月 30 日確認)。これらの ID の料金は OmniaKey が独自に設定しているため、現在の料金は Seedance 2.0 のモデルページ で確認してください。

よくある質問

Seedance 2.0 に公式 API はある?

あります。BytePlus ModelArk が販売しており、有効化には USD 30 を超える残高、Savings Plan、または Seedance のリソースパックが必要です(BytePlus の Seedance 2.0 ページ、2026 年 10 月 30 日確認)。上のスクリプトは同じモデル ID を OmniaKey のメディア API 経由で呼びます。

base64 の代わりに画像 URL を送れる?

OmniaKey のドキュメントは、インラインの data URI と並べて公開 HTTPS の URL も挙げています(動画 API ドキュメント、2026 年 10 月 30 日確認)。OmniaKey のテストでは HTTPS のフレームリンクが provider_submit_rejected で返ってきたため、今回の実行はインラインにしました。まずテスト用の動画で URL を試してください。

音を消すには?

parameters.generate_audio: false を送ると、MP4 に音声トラックがまったく入りません。ネコの動画がその例です。このモデルは既定で音声がオンです。

リクエストがタイムアウトしたのはなぜ?

動画はまだレンダリング中のことがほとんどです。5秒・720p のタスクは今回 139〜319 秒かかりました。同じタスク ID を再度ポーリングし、再送はしないでください。15秒の動画では15分のループ上限を上げてください。

動画のリンクはどれくらい有効?

assets[0].url の署名付きリンクは約1時間有効で、タスク記録自体は作成後 24 時間保持されます(メディア API 概要、2026 年 10 月 30 日確認)。最初の成功時にダウンロードするか、タスクを再度ポーリングして新しいリンクを取得してください。

確認した資料

OmniaKey 自身のドキュメント(2026 年 10 月 30 日確認):動画 API、メディア API 概要、API エラー。

この記事で紹介しているモデル

Seedance 2.0AI 動画動画 API画像から動画Python

関連記事

最近の記事