HiAPI
ブログ

使用ガイド

happyhorse-1.1 テキスト-to-ビデオ API でショート動画を制作:エンドツーエンドのワークフロー

Jul 7, 2026
happyhorse-1.1 テキスト-to-ビデオ API でショート動画を制作:エンドツーエンドのワークフロー

ショート動画は数の勝負です。TikTok、Reels、Shorts はいずれも毎日投稿するアカウントを優遇しますが、最大の制作ボトルネックは通常 B-roll です。フック、製品のハイライト、あるいは心地よいループを担う 3〜8 秒の縦長クリップのことです。HappyHorse 1.1 テキスト-to-ビデオ はこの用途に特に適しています。なぜなら同じ呼び出しの中でネイティブ音声を生成し(別途の BGM やフォーリーは不要)、さらに9:16 の縦長出力を直接サポートするため、後工程でのクロップも不要だからです。

本ガイドはエンドツーエンドのワークフローです。ショート動画向けに調整したプロンプトパターン、非同期タスクのライフサイクル、1 回の実行で 1 週間分の動画をレンダリングするバッチ生産スクリプト、そして各プラットフォームのコスト計算を扱います。以下に埋め込まれた各クリップは、すぐ横に示したものとまったく同じリクエストで生成されたものです。音声はオン、API から直接取得しています。

前提条件。 hiapi キーが必要です(Authorization: Bearer sk-…)。これまで /v1/tasks を呼び出したことがない場合は、まず 非同期 API 作成 ドキュメントか happyhorse-1.1 curl + Python チュートリアル に目を通してください。本記事はそのチュートリアルを踏まえ、ショート動画ワークフローに焦点を当てています。

このモデルがショート動画に向いている理由

このフォーマットにとって重要な特性は 3 つあります:

  • ネイティブ音声。 環境音、フォーリー、ワンショットの効果音が動画と一緒に生成されます。「不思議な解圧」や B-roll のコンテンツでは、音こそがコンテンツです。実際の音声を持つクリップは、クリエイターがストック音楽で埋めた無音の AI クリップよりも明らかに優れています。
  • 一級市民としての 9:16。 aspect_ratio は 9:16(および 16:9、1:1、4:5、21:9、9:21 など)を受け付けるため、横長マスターをクロップして構図を失うのではなく、縦長をネイティブにレンダリングできます。
  • 3〜15 秒の範囲。 duration は 3 から 15 までの任意の整数を受け付けます。まさにショート動画の領域です。フックは 3 秒、製品ハイライトは 4〜6 秒、完全なマイクロストーリーは 12〜15 秒に収まります。

入力スキーマは意図的に小さく保たれています。必須は prompt のみで、有用なパラメータは次のとおりです:

フィールド 値 ショート動画のデフォルト
prompt 文字列(必須) 下記のパターンを参照
aspect_ratio 16:9、9:16、3:4、4:3、4:5、5:4、1:1、9:21、21:9 9:16
resolution 720p、1080p 下書きは 720p、本番投稿は 1080p
duration 整数 3〜15(秒) 3〜5

受け付けないものが 2 つあり、それを送ってリクエストを無駄にしないよう先に言っておきます:audio スイッチはなく(音声は常にオン)、seed もありません。どちらかを送ると 400 の検証エラーが返ります。

3 つの実クリップ、3 つのショート動画タイプ

これらはショート動画のフィードを支配する 3 つのフォーマットで、それぞれ 1 回の API 呼び出しで生成されています。プロンプトは繰り返し使えるパターンに従っており、自由に調整できます:フォーマットタグ → 被写体と動作 → 構図 → 照明 → 音声ヒント。

1. ライフスタイル B-roll(カフェの定番)

{
  "model": "happyhorse-1.1/text-to-video",
  "input": {
    "prompt": "縦長ショート動画テスト:明るいカフェでバリスタがラテアートを描く、スマホ風の縦長構図、ミルクスチームとカフェの会話の自然な音声。",
    "duration": 4,
    "resolution": "720p",
    "aspect_ratio": "9:16"
  }
}

プロンプト末尾の音声ヒント(「ミルクスチームとカフェの会話」)に注目してください。欲しい音を明示することは、このモデルを使う上で最も効果の高いテクニックです。ヒントがなくても音声は生成されますが、描写することで使える環境音トラックが得られます。

2. 製品ローンチ予告

{
  "model": "happyhorse-1.1/text-to-video",
  "input": {
    "prompt": "製品ローンチ予告、縦長 9:16:クリーム色と焦がしオレンジの厚底レトロランニングシューズがマットブラックのターンテーブルでゆっくり回転し、硬質なリムライトがシルエットを浮かび上がらせ、光の筋の中を微細な塵が漂う、暗いスタジオ背景、上部にタイトルオーバーレイ用の十分な空白。インパクト重視、シネマティック。ネイティブ音声:低く響くベースのハム音と、シューズが回転を終える瞬間の柔らかなシューッという音。",
    "duration": 3,
    "resolution": "720p",
    "aspect_ratio": "9:16"
  }
}

ここにはショート動画特有のテクニックが 2 つあります。第一に、「上部にタイトルオーバーレイ用の十分な空白」——このクリップの上にエディタでテキストを載せるので、字幕が画面を奪い合わないよう、モデルにネガティブスペースを残すよう要求します。第二に、音声は環境音ではなく設計されたものです。ベースのハム音に、動作のビートに同期したシューッという音を加えるのは、まさに製品予告編が使う手法です。

3. 不思議な解圧マクロループ

{
  "model": "happyhorse-1.1/text-to-video",
  "input": {
    "prompt": "不思議な解圧マクロ、縦長 9:16:鋭利なパレットナイフが白いテーブルの上の淡いミント色のキネティックサンドをきれいに切り分け、切り口がスローモーションで崩れ、粒がこぼれ落ちる、柔らかく均一なスタジオ照明、画面いっぱいの極端なクローズアップ。ネイティブ音声:切断時の乾いた粒のパリパリという音、音楽なし。",
    "duration": 3,
    "resolution": "720p",
    "aspect_ratio": "9:16"
  }
}

「音楽なし」が重要です。ASMR 系のコンテンツでは、モデルは音声の予算をフォーリー(粒のパリパリ音)に使うべきであり、明示することで汎用の BGM を追加するのを防げます。

ショート動画に効くプロンプトパターン

上記のクリップとその背後にある実行から抽出すると:

  1. フォーマットから始める。 「縦長ショート動画」「製品ローンチ予告、縦長 9:16」「不思議な解圧マクロ」で書き始めます。モデルは指定したアスペクトに合わせて構図を組みます。スマホ風の構図はワイドスクリーンのシネマティックショットとは見え方が違います。
  2. 被写体は 1 つ、動作は 1 つ。 3〜5 秒は 1 ビートです。「バリスタがラテアートを描く」は機能しますが、4 秒で三幕の物語を語ろうとすると、ただの混沌になります。複数のビートが必要なら、複数のクリップを生成してつなぎ合わせましょう。実際のショート動画もそうやって編集されています。
  3. 音声を一文で書き表す。 各プロンプトは ネイティブ音声:<欲しい音を 1〜3 つ> で終わります。環境の下地音(「カフェの会話」)、フォーリー(「乾いた粒のパリパリ音」)、設計されたワンショット効果音(「低く響くベースのハム音と柔らかなシューッという音」)のいずれも機能します。
  4. オーバーレイ用の空間を確保する。 クリップに字幕やタイトルを載せる場合は、「上部の空白」や「上部三分の一のきれいなネガティブスペース」を要求します。後から構図し直すより安上がりです。
  5. ループできる状態で終える。 フィードは自動的にループします。始まりと同じところで終わるプロンプト(「シューズが回転を終える」)はきれいにループし、静かにリピート再生を積み上げます。

非同期ワークフロー:送信、ポーリング、ダウンロード

各生成は非同期タスクです。POST /v1/tasks がすぐに taskId を返し、status が success になるまで GET /v1/tasks/:id をポーリングし、その後 output[0].url をダウンロードします。4 秒の 720p クリップは通常 1〜3 分ほどでレンダリングされます。

curl -s -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "happyhorse-1.1/text-to-video",
    "input": {
      "prompt": "縦長ショート動画テスト:明るいカフェでバリスタがラテアートを描く、スマホ風の縦長構図、ミルクスチームとカフェの会話の自然な音声。",
      "duration": 4,
      "resolution": "720p",
      "aspect_ratio": "9:16"
    }
  }'
# → {"code":200,"data":{"taskId":"tk-hiapi-…"},"message":"success"}

つまずきやすい運用ルールが 1 つあります:出力 URL は期限切れになります。 レスポンスの output[0].url には expireAt が付いています。タスク成功後すぐに mp4 をダウンロードし、自分のストレージに置いてください。ホットリンク URL を CMS やスケジューリングツールに書き込んではいけません。

バッチ生産:1 回の実行で 1 週間分のクリップを生成

並列に送信すると、タスク API は真価を発揮します。作成はすぐに戻るため、正しいスケールパターンはまず全部送信し、それから全部ポーリングすることです。5 つのクリップは、ほぼ 1 つのクリップ分の実時間でレンダリングが完了します。

import os, time, requests

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

BATCH = [
    ("mon-coffee",  "縦長ショート動画:ハンドドリップコーヒーがスローモーションで蒸らされ、湯気が立ち上る、暖かな朝の光。ネイティブ音声:注ぐ音、柔らかなカフェの環境音。", 4),
    ("tue-sneaker", "製品ローンチ予告、縦長 9:16:ネオンのランニングシューズが浅い水しぶきを上げて着地、水滴が空中で凍りつく、暗い背景。ネイティブ音声:深い水しぶきの音。", 3),
    ("wed-sand",    "不思議な解圧マクロ、縦長 9:16:ラベンダー色のキネティックサンドが細い線で切り分けられ、切断面が崩れる。ネイティブ音声:乾いた粒のパリパリ音、音楽なし。", 3),
    ("thu-city",    "縦長ショート動画:夜の雨に濡れたネオン街、傘が通り過ぎ、反射が揺らぐ。ネイティブ音声:雨音と遠くの交通音。", 5),
    ("fri-dessert", "縦長ショート動画マクロ:スプーンがクレームブリュレのカラメル殻を割り、下のカスタードが沈み込む。ネイティブ音声:軽快な割れる音、その後静寂。", 3),
]

def submit(prompt, duration):
    r = requests.post(API, headers=HEADERS, json={
        "model": "happyhorse-1.1/text-to-video",
        "input": {"prompt": prompt, "duration": duration,
                  "resolution": "720p", "aspect_ratio": "9:16"},
    }, timeout=60)
    return r.json()["data"]["taskId"]

# 1) まず全タスクを送信
tasks = {key: submit(p, d) for key, p, d in BATCH}

# 2) すべて終端状態になるまでポーリング
while tasks:
    time.sleep(10)
    for key, tid in list(tasks.items()):
        t = requests.get(f"{API}/{tid}", headers=HEADERS, timeout=30).json()["data"]
        if t["status"] == "success":
            url = t["output"][0]["url"]          # 期限切れになる——すぐダウンロード
            open(f"{key}.mp4", "wb").write(requests.get(url, timeout=180).content)
            print(f"done: {key}.mp4")
            del tasks[key]
        elif t["status"] == "fail":
            print(f"FAILED {key}: {t.get('error')}")
            del tasks[key]

このスクリプト形態を大規模に運用する際の実務メモ:

  • 失敗時は再送信し、再ポーリングはしない。失敗したタスクは終端状態です。同じ入力で新しいタスクを送信します(コンテンツ上の理由で 2 回失敗したら、ときどきプロンプトを書き換えます)。
  • マニフェストを維持する。 {key, prompt, taskId, local_path} を随時 JSON ファイルに書き出し、再起動時には mp4 が既に存在するキーをスキップします。バッチジョブは中断されますが、事前に計画すれば復元性はタダで手に入ります。
  • 同時実行制限に注意する。 数十個のタスクを送信する場合は、送信間隔を 1〜2 秒空け、同じ瞬間に 50 個を投げないようにします。

コストはいくらか

課金は出力動画の秒数に基づきます(料金ページ):720p は $0.16/秒、1080p は $0.21/秒 で、アスペクト比には依存しません。長さが唯一のコストレバーであり、これがショート動画をこのモデルで最も安く使える場所にしています:

クリップ 仕様 コスト
フック / 解圧ループ 3秒 · 720p $0.48
標準 B-roll ビート 4秒 · 720p $0.64
製品予告 5秒 · 720p $0.80
本番投稿 5秒 · 1080p $1.05
毎日投稿、月 30 × 4秒の下書き 720p ~$19.20

実用的な 2 段階フロー:3秒/720p でプロンプトを繰り返し調整し(1 回の試行あたり約半ドル)、勝ったものだけを 1080p に再レンダリングして投稿します。プロンプトは解像度間をきれいに移行するので、クリエイティブな作業をやり直すのではなく、クリップが価値があると分かってからピクセル分を支払うだけです。

API 出力から公開済み投稿へ

モデルは音声付きの完成した縦長クリップを渡してくれます。残りはパッケージングです:

  • プラットフォーム別の長さ: 3〜5 秒のクリップは TikTok と Reels でループとしてよく機能します。Shorts では、2〜3 のビートをつないで 10〜15 秒にすると、より長く視聴者を引き留められることがよくあります。duration は最大 15 秒なので、編集したくなければ 1 回の呼び出しで完全なマイクロストーリーをカバーできます。
  • テキストオーバーレイ: エディタ(CapCut、Premiere、ffmpeg drawtext)で字幕を追加します。これが「空白を残す」プロンプトテクニックが重要な理由です。
  • ネイティブ音声を保つ ベースレイヤーとして、音楽を加える場合でも。音楽の下にある本物のフォーリーは、音楽だけよりも制作価値を伝えます。
  • 一貫したシリーズ: ショート動画はフォーマットの繰り返しを優遇します。プロンプトの骨格(構図、照明、音声スタイル)を固定し、被写体だけを変えます。上記の 3 つのタイプテンプレートは、まさにそのように再利用できるよう設計されています。

シリーズがブランド資産(実際の製品写真、マスコット、顔)を核とする場合は、このワークフローを happyhorse-1.1 イメージ-to-ビデオ と組み合わせて使います。キーフレームを一度生成または撮影し、そこから動きを駆動させれば、被写体がすべての投稿で同じまま保たれます。

レンダリングを始める

最短の道:キーを取得し、本ページのバリスタリクエストをコピーすれば、数分で最初の音声付き縦長クリップが手に入ります。happyhorse-1.1 テキスト-to-ビデオモデルページ にはリアルタイムのパラメータリファレンスと料金があり、クイックスタート は hiapi への初回呼び出しの場合の認証をカバーしています。下書きを 3 つレンダリングし、最良の 1 つを残せば、コーヒー 1 杯未満の値段で明日の投稿が手に入ります。

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

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

APIドキュメントを読む