HiAPI
ブログ

使用ガイド

seedance-2-0 ショート動画制作ガイド:hiapi API 実践レシピ

hiapi 上の seedance-2-0 タスク API を使って縦型 TikTok/Reels/Shorts のショート動画を制作——テキストから動画・画像から動画、検証済みの料金、そしてそのままコピー&ペーストできる送信/ポーリング/ダウンロードのスクリプト。

Jul 1, 2026
seedance-2-0 ショート動画制作ガイド:hiapi API 実践レシピ

クイック概要

  • これは何か:hiapi 上の seedance-2.0 を使って縦型ショート動画(TikTok / Reels / Shorts)を制作する、すぐに実行でき再現可能なレシピです。下に埋め込まれたショート動画は、まさにその上に記載されたプロンプトをそのまま使って生成されたものです——他人のデモを借りたものでは決してありません。
  • 2つのモード、1つのモデル:seedance-2.0 は同じエンドポイントの下でテキストから動画と画像から動画の両方をサポートします——プロンプトから始めることも、既存の静止画を動かすこともできます。
  • API の事実(プラットフォーム上で検証済み):seedance-2.0 は非同期のタスクエンドポイント(/v1/tasks)上で動作します。input オブジェクトには prompt、aspect_ratio(必須——ショート動画なら 9:16 を使用)、resolution(480p / 720p / 1080p)、そして秒単位の duration が必要です。結果は MP4 として output[0].url に返されます。
  • 料金(出力1秒あたり):480p は $0.136/秒、720p は $0.293/秒、1080p は $0.729/秒。4秒の 480p ショート動画のコストは $0.54 です。最新の価格は料金ページをご覧ください。
  • 実行方法:タスク API に POST し、ステータスが success になるまでポーリングし、output[0].url から MP4 をダウンロードします——この URL は一時的で期限切れになるため、バイトデータをすぐに保存してください。完全なコピー可能なスクリプト(両モード + バッチループ)は文末にあります。

ショート動画に seedance-2.0 を選ぶ理由

ショート動画プラットフォームには決まった文法があります:縦型 9:16、数秒の長さ、明確なアクションのビート。これはまさに seedance-2.0 が得意とする形態です。1つのアスペクト比フラグを指定するだけで映画的な動きをレンダリングできるため、縦型の画角を得るためにモデルと格闘する必要はありません——9:16 を要求すれば、その画角で構図してくれます。

もう1つの理由はワークフローです:各ショート動画は単一の非同期タスクです。ジョブを送信し、タスク ID をポーリングし、完成した MP4 を取得します。監視が必要なストリーミングソケットも、避けるべき100秒のタイムアウトもありません——他のすべての hiapi 生成モデルが使うタスクプロトコルとまったく同じなので、すでに画像モデルを呼び出したことがあれば、ここの制御フローは同じです。

モード 1——テキストから動画

ショート動画を得る最短の道です:ショットを描写し、画角と長さを選び、送信します。

以下のプロンプトは私が実際に実行したものです。キーワードの羅列ではなく、監督のように書いてください——被写体、光、カメラの動きを。

プロンプト:あるバリスタが日当たりの良いカフェでエスプレッソを抽出しており、カップに渦巻くクレマのクローズアップ、暖かな朝の光、そっと立ち上る湯気、浅い被写界深度、滑らかなハンドヘルドカメラのプッシュイン。

設定:aspect_ratio: 9:16、resolution: 480p、duration: 4

このショート動画はネイティブな 9:16 画角で、Reels/Shorts のタイムラインにそのまま入れられます。レンダリングには約2分かかり、現在の 480p 料金で推定約 $0.54——いくつかバリエーションを生成して最良の1本を残すのに十分安い価格です。

リクエストボディは小さなものです。よく見落とされるフィールドの1つが aspect_ratio です:これは必須で、省略すると API は missing required field "aspect_ratio" でタスクを拒否します。

import os, json, requests

TOKEN = os.environ["HIAPI_TOKEN"]
BASE = "https://api.hiapi.ai/v1/tasks"
HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}

payload = {
    "model": "seedance-2.0",
    "input": {
        "prompt": (
            "A barista pulls a shot of espresso in a sunlit cafe, close-up on the "
            "crema swirling into the cup, warm morning light, gentle steam rising, "
            "shallow depth of field, smooth handheld camera push-in."
        ),
        "aspect_ratio": "9:16",   # required — 9:16 for short-form
        "resolution": "480p",     # 480p | 720p | 1080p
        "duration": 4,            # seconds
    },
}

r = requests.post(BASE, headers=HEADERS, data=json.dumps(payload), timeout=60)
task_id = r.json()["data"]["taskId"]
print("submitted:", task_id)

モード 2——画像から動画

2つ目のモードは、シーンをゼロから生み出すのではなく、あなたが提供した静止画を動かすことです。これはまさにブランド案件に必要なものです:クリーンな製品の静止画を撮影(または生成)し、seedance-2.0 にアクションのビートを加えさせることで、構図と製品の両方をブランド仕様に沿ったまま保てます。

呼び出しの形はタスク呼び出しと同じです——aspect_ratio、resolution、duration を保ち、プロンプトはシーン全体ではなく、画面に加える動き(「ゆっくりプッシュイン」「モデルがカメラの方を向く」「湯気が立ち上り始める」)を描写するようになります。画像モデルからの静止画と組み合わせれば、2ステップのパイプラインが完成します:キービジュアルを生成し、それを動かすのです。

ヒント:画像から動画のショートは短く(4秒)保ち、動きは控えめにしましょう。ショート動画が報われるのは、忙しいカメラワークではなく、潔い1つのビートです。

ショート動画バッチのコスト計算

課金は出力1秒あたりなので、コストは非常に予測しやすいです——解像度を選び、ショート動画の長さを掛けるだけです:

解像度 価格 / 秒 4秒ショート 8秒ショート
480p $0.136 $0.54 $1.09
720p $0.293 $1.17 $2.34
1080p $0.729 $2.92 $5.83

フックを何度も反復するには、480p で下書きしましょう——720p の4分の1の価格で、構図と動きを判断するのに十分です。勝ったバージョンだけを 720p または 1080p で最終公開用に再レンダリングします。現在の各モデルの料金は料金ページをご覧ください。

完全スクリプト——送信、ポーリング、ダウンロード

これはエンドツーエンド版です:テキストから動画のジョブを送信し、タスクが完了するまでポーリングし、MP4 を保存します。ダウンロードのステップは重要です——output[0].url は一時的なリンクで期限切れになるため、タスクが成功したらすぐにバイトをディスクに書き込んでください。

import os, json, time, requests

TOKEN = os.environ["HIAPI_TOKEN"]
BASE = "https://api.hiapi.ai/v1/tasks"
HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}


def submit(prompt, aspect_ratio="9:16", resolution="480p", duration=4):
    payload = {
        "model": "seedance-2.0",
        "input": {
            "prompt": prompt,
            "aspect_ratio": aspect_ratio,  # required
            "resolution": resolution,      # 480p | 720p | 1080p
            "duration": duration,          # seconds
        },
    }
    r = requests.post(BASE, headers=HEADERS, data=json.dumps(payload), timeout=60)
    r.raise_for_status()
    return r.json()["data"]["taskId"]


def wait(task_id, timeout_s=600, poll=8):
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        r = requests.get(f"{BASE}/{task_id}", headers=HEADERS, timeout=30)
        data = r.json().get("data", {})
        status = data.get("status")
        if status == "success":
            return data
        if status == "fail":
            raise RuntimeError(f"task failed: {data.get('error')}")
        time.sleep(poll)
    raise TimeoutError(f"task {task_id} did not finish in {timeout_s}s")


def download(task, path):
    out = task["output"][0]
    assert out["type"] == "video", f"unexpected output type: {out['type']}"
    # output[0].url is temporary (see expireAt) — save immediately.
    resp = requests.get(out["url"], timeout=120)
    resp.raise_for_status()
    with open(path, "wb") as f:
        f.write(resp.content)
    return path


if __name__ == "__main__":
    prompt = (
        "A barista pulls a shot of espresso in a sunlit cafe, close-up on the crema "
        "swirling into the cup, warm morning light, gentle steam rising, shallow "
        "depth of field, smooth handheld camera push-in."
    )
    tid = submit(prompt, aspect_ratio="9:16", resolution="480p", duration=4)
    print("submitted:", tid)
    task = wait(tid)
    print("saved:", download(task, "espresso_9x16.mp4"))

1つのフックを1つのバッチに変えるには、submit / wait / download をプロンプトを反復するループで包みます:

HOOKS = {
    "espresso":  "A barista pulls a shot of espresso in a sunlit cafe, close-up on the crema, gentle steam, handheld push-in.",
    "matcha":    "A whisk froths bright green matcha in a ceramic bowl, top-down light, slow spiral motion, calm morning mood.",
    "pour-over": "Hot water spirals over fresh coffee grounds in a dripper, close macro, steam rising, warm backlight.",
}

for name, prompt in HOOKS.items():
    tid = submit(prompt, aspect_ratio="9:16", resolution="480p", duration=4)
    task = wait(tid)
    download(task, f"{name}_9x16.mp4")
    print("done:", name)

このバッチを 480p で下書きし、勝者を選び、1080p で再レンダリングしてから公開します。これが1つのモデルと1つのエンドポイントで完結するショート動画ループの全体像です。

重要なポイント

  • seedance-2.0 は /v1/tasks 上の単一の非同期タスクで、MP4 を返します——hiapi の画像モデルと同じ制御フローです。
  • aspect_ratio は必須です;TikTok / Reels / Shorts なら 9:16 を使用してください。
  • 課金は出力1秒あたり:480p $0.136/秒、720p $0.293/秒、1080p $0.729/秒——なので 480p で安く下書きし、勝者だけを高解像度で仕上げましょう。
  • 出力 URL は一時的です——タスクが success を報告したら、すぐにバイトデータをダウンロードしてください。
  • 同じ呼び出しでテキストから動画も画像から動画も行えます;画像から動画を生成した静止画と組み合わせれば、ブランドに沿った製品の動きが得られます。

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

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

APIドキュメントを読む