HiAPI
ブログ

使用ガイド

seedance-2.0-mini でショート動画を制作する:hiapi API によるエンドツーエンドのワークフロー

Jul 7, 2026
seedance-2.0-mini でショート動画を制作する:hiapi API によるエンドツーエンドのワークフロー

TL;DR

  • これは何か:hiapi API 上で seedance-2.0-mini を使って TikTok/Reels 風の縦型ショート動画を制作するエンドツーエンドのワークフローです。最初の curl 呼び出しから、1週間分のコンテンツを一括レンダリングするスクリプトまでを扱います。本ページのデモクリップは、記事中に示したリクエストをそのまま実行して生成したものです。
  • ショート動画にこのモデルを選ぶ理由:9:16 をネイティブサポートし、音声を同期生成(別途の効果音処理は不要)、尺は 4〜15 秒の間で柔軟に選択でき、480p のドラフトは毎秒 $0.0272 のみ——4秒の縦型ドラフトで約 $0.11 です(価格)。
  • 検証済みの API 仕様:prompt、duration(4〜15 の整数)、resolution(480p | 720p)は必須です。aspect_ratio は 1:1、4:3、3:4、16:9、9:16、21:9、adaptive を受け付けます。イメージ・トゥ・ビデオでは first_frame_url / last_frame_url を使用します。スキーマは厳格で、seed のような未知のフィールドは 400 で拒否されます。
  • ワークフロー:480p で生成してプロンプトを反復し、採用したクリップを 720p で再レンダリングし、タスクを並列で一括投入します。非同期の /v1/tasks キューがファンアウトを代行します。

seedance-2.0-mini がショート動画のループに適している理由

ショート動画制作は量的な作業です。多くのクリップを草稿し、少数を残し、毎日投稿します。このワークフローでは動画 API に三つのことが求められます——低コストでの反復、縦型出力、そして音声——seedance-2.0-mini はまさにこの三つを満たします:

  • 1回のドラフトコストが反復に十分なほど低い。480p では出力1秒あたり $0.0272 で課金されるため、4秒のドラフトで約 $0.11、フルの15秒クリップでも約 $0.41 に過ぎません。720p は $0.0586/秒です。(価格はライブの価格ページで確認済み。動画は秒単位で課金されるため、duration がコストのレバーになります。)
  • ネイティブな 9:16。横型クリップをトリミングして構図を失うのではなく、縦型で直接レンダリングします。
  • ネイティブな同期音声。出力される MP4 には、シーンに合わせて生成された AAC 音声トラック——環境音、フォーリー、室内の暗騒音——が組み込まれます。自動再生で音が出るフィード向けコンテンツでは、これで編集工程がまるごと一つ省けます。

より大きな同系統モデルをメインビジュアル向けに使いたい場合は、同じワークフローが seedance-2-0 にも適用できます——価格帯が異なるだけです。

セットアップ

必要なのは hiapi の API キーだけで、他には何もいりません——SDK も不要です。キーを環境変数に保存します:

export HIAPI_API_KEY="sk-..."

hiapi 上のすべての動画モデルは、統一された非同期タスクエンドポイントで動作します:POST https://api.hiapi.ai/v1/tasks が即座に taskId を返し、その後 GET /v1/tasks/{taskId} を完了までポーリングします。詳細はドキュメントを参照してください。

最初の縦型クリップ(T2V)

最小限の有効なリクエストには prompt、duration、resolution が必要です。ショート動画向けに aspect_ratio: "9:16" を加えます:

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0-mini",
    "input": {
      "prompt": "縦型ショート動画。日差しが降り注ぐカフェのカウンターで、淹れたての抹茶ラテが透明なグラスにゆっくりと注がれ、緑の渦がミルクの中に広がる。柔らかな窓の光、浅い被写界深度。ネイティブ音声:穏やかなカフェの環境音、液体が注がれる音。軽快で食欲をそそる、フォトリアル。",
      "duration": 4,
      "resolution": "480p",
      "aspect_ratio": "9:16"
    }
  }'

レスポンスは即座に返ります:

{"code": 200, "data": {"taskId": "tk-hiapi-01KWTTFDPHSDWZ0FP1QAS5J79Q"}, "message": "success"}

status が success になるまでタスクをポーリングし、その後すぐに output[0].url をダウンロードしてください——出力 URL は一時的で失効します。以下はまさにこのリクエストが生成した実際のクリップです(4秒、480p、9:16、注ぐ音と環境音のネイティブ音声付き——ミュートを解除して聴いてみてください):

このレンダリングから得られた実用的なヒントが二つあります。「480p」の縦型出力は実測で 496×864 ピクセルで、音声は標準の AAC トラックとして MP4 に入ります——別ファイルでの合成は不要です。

入力スキーマ(ライブ API で検証済み)

スキーマは厳格です。以下は実際の検証レスポンスで、ログで見分けられるようにそのまま再現しています:

フィールド 型 必須 値
prompt string ✅(最小長 3) ショットの説明
duration integer ✅ 4〜15(秒)
resolution string ✅ 480p、720p
aspect_ratio string 任意 1:1、4:3、3:4、16:9、9:16、21:9、adaptive
first_frame_url string 任意 I2V 開始フレームの画像 URL
last_frame_url string 任意 終了フレーム制御用の画像 URL
image_input array 任意 マルチモーダル画像リファレンス
reference_video_urls array 任意 スタイル/モーションのリファレンス動画(より低い毎秒レート)

必須フィールドを省略すると、タスクは作成前に拒否されます(課金なし):

{"code": 400, "error_code": "INVALID_REQUEST", "message": "invalid input: resolution: missing required field \"resolution\"; duration: missing required field \"duration\""}

範囲外の値は正確な境界を示します——duration: maximum: got 16, want 15——また未知のフィールドは無視されず拒否されます:

{"code": 400, "error_code": "INVALID_REQUEST", "message": "invalid input: <root>: additional properties 'seed' not allowed"}

この最後の挙動は心に留めておく価値があります。他のモデルからリクエスト構造を持ち越す(seed や size、audio フラグなど)と、seedance-2.0-mini はそのフィールドを静かに捨てるのではなく 400 を返します。

再利用可能な Python 関数

本番に必要なものは約40行です——送信、ポーリング、ダウンロード:

import os, time, requests

API = "https://api.hiapi.ai/v1/tasks"
HEADERS = {"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}"}

def submit(prompt: str, duration: int = 4, resolution: str = "480p",
           aspect_ratio: str = "9:16", **extra) -> str:
    r = requests.post(API, headers=HEADERS, json={
        "model": "seedance-2.0-mini",
        "input": {"prompt": prompt, "duration": duration,
                  "resolution": resolution, "aspect_ratio": aspect_ratio, **extra},
    }, timeout=60)
    data = r.json()
    task_id = (data.get("data") or {}).get("taskId")
    if not task_id:
        raise RuntimeError(f"submit failed: {data}")
    return task_id

def wait(task_id: str, timeout_s: int = 900) -> dict:
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        task = requests.get(f"{API}/{task_id}", headers=HEADERS, timeout=30).json()["data"]
        if task["status"] == "success":
            return task
        if task["status"] == "fail":
            raise RuntimeError(f"task failed: {task.get('error')}")
        time.sleep(8)
    raise TimeoutError(task_id)

def make_clip(prompt: str, out_path: str, **kw):
    task = wait(submit(prompt, **kw))
    url = task["output"][0]["url"]          # 一時 URL——すぐにダウンロードすること
    with open(out_path, "wb") as f:
        f.write(requests.get(url, timeout=120).content)

4秒の 480p クリップは通常数分で完了します。ピーク時間帯にはタイムアウトを判定する前に最大約10分を確保してください。

イメージ・トゥ・ビデオ:最初のフレームを固定する

製品指向のショート動画では、プロンプトのドリフトが敵です——求めているのはあなたの製品が画面に収まることであり、モデルが想像した製品ではありません。解決策は first_frame_url を使った I2V です。静止画を生成(または撮影)し、それをアニメーション化します。このような縦型のリファレンス静止画を、同じ /v1/tasks エンドポイント経由で gpt-image-2 を使って制作すれば、開始フレームとして適しています:

リクエストにフィールドを一つ加えるだけです:

task_id = submit(
    "上からお湯がゆっくりと円を描いて注がれ、ハンドドリップのドリッパーから湯気が立ち上り始め、"
    "雫が下のガラスサーバーに落ち、日差しが湯気を照らす。ゆっくりと穏やかに寄っていく。"
    "ネイティブ音声:静かな水の音、早朝の静かな部屋の暗騒音。",
    duration=4, resolution="480p", aspect_ratio="9:16",
    first_frame_url="https://your-cdn.example/pourover-ref.jpg",
)

以下は最初のフレームをアニメーション化した実際の結果です——私たちの seedance-2.0-mini レシピ集から取った静止画と、それから生成したクリップで、同じモデルとリクエスト構造を使用しています(この例は 16:9):

構図、色調、被写体はあなたの静止画に固定されます。プロンプトは動きだけを記述すれば済みます。クリップを特定の終了フレームに着地させたい場合は last_frame_url もあり、製品カードに戻るループに適しています。

1週間分のコンテンツを一括制作する

/v1/tasks は非同期なので、一括制作とはすべてのタスクを送信してからポーリングするだけです。クライアント側のキューは不要です。

briefs = [
    ("mon-hook",  "縦型クリップ。エスプレッソがゆっくりと抽出される、……"),
    ("tue-loop",  "縦型のシームレスループクリップ。カップから湯気が立ち上る、……"),
    ("wed-recipe","縦型クリップ。真上からのハンドドリップ抽出シーケンス、……"),
    # ……投稿日ごとに1本
]

tasks = {name: submit(p, duration=6) for name, p in briefs}   # ファンアウト
for name, tid in tasks.items():                                 # 収集
    make = wait(tid)
    url = make["output"][0]["url"]
    open(f"{name}.mp4", "wb").write(requests.get(url, timeout=120).content)

課金は出力秒単位なので、コスト計算は予測可能なままです:

プラン 仕様 コスト
ドラフト反復1回 4秒 · 480p 約 $0.11
公開可能なクリップ1本 6秒 · 480p 約 $0.16
クリップ7本(1週間、毎日1本) 7 × 6秒 · 480p 約 $1.14
メインビジュアルの再レンダリング 6秒 · 720p 約 $0.35

うまく機能するワークフロー:各アイデアはまず 480p で草稿し、勝者を残し、それだけを 720p で再レンダリングします。さらなるレバー(解像度の段階、尺のトリミング、バッチスケジューリング)については、AI 画像・動画 API のコストを抑えるガイドを参照してください。

フィード向けのプロンプトのコツ

テストレンダリングで効果があった手法を、ショート動画向けに調整して紹介します:

  • 「縦型」を明記し、それに合わせて構図する。「縦型ショート動画。」で始め、aspect_ratio: "9:16" を加えることで、トリミングされる横型シーンを切り取るのではなく、高い画角の中央に被写体を配置できます。
  • フックを最初の1秒に置く。フィードは最初の1秒で決まります——ゆっくりとした確立ショットではなく、最初の動きそのものを報酬にします(すでに注がれている、すでに湯気が上がっている)。
  • 音声を脚本化する。「ネイティブ音声:……」と具体的な音を2〜3個(液体が注がれる音、カフェの環境音)列挙すると、音声トラックを確実に形作れます。指定しなければ、汎用的な室内暗騒音しか得られません。
  • ループ可能なクリップでは、最初と最後の変化を最小化する。漂う粒子、脈打つ光の輪、立ち上る湯気——定常的な動きを描写すれば、最初と最後のフレームがループに十分近くなります。

まとめ

seedance-2.0-mini でのショート動画制作は、一つの非同期エンドポイント、三つの必須フィールド、そして反復を安価にする秒単位課金に集約されます。縦型クリップを 480p で草稿すれば1本あたり約25セント、first_frame_url で製品ショットを固定し、投稿カレンダーを一括投入し、残したものを 720p で再レンダリングします。API キーを取得し、上の4秒の curl リクエストから始めてください——seedance-2.0-mini モデルページにはパラメータリファレンスとライブ価格があり、ここから続けられます。

永続的なAIアーティファクトで開発を始める

APIキーを取得して、タスクベースの1つのAPIで画像・動画・音声モデルを呼び出せます。

APIドキュメントを読む