チュートリアル
Creatify Boreal API の使い方:テキスト・画像・音声から動画を生成する
creatify-boreal は hiapi 上の動画モデルで、音声とサウンドがすでにミックスされた完成済みのクリップを返します。1 つのモデル id で 3 つの出発点をカバーします:プロンプトのみ、プロンプト+参照画像、またはプロンプト+独自のナレーション音声です。本ガイドではリクエスト、ポーリングループ、そして実際に一度リアルな生成を実行した結果を紹介します。
API キーは hiapi ダッシュボード から取得してください。すべての呼び出しは統一タスクエンドポイント POST /v1/tasks を通じて行います。
入力フィールド
これらのフィールドは実際のモデルページと照合し、さらに /v1/tasks に意図的に無効な値を送信して検証しました。無効な値は 400 を返し、課金されません。
| フィールド | 必須 | 受け付ける値 |
|---|---|---|
prompt |
はい | テキスト、最大 5000 文字 |
image_url |
いいえ | JPG/PNG/WebP、10 MB;被写体と構図を設定 |
audio_url |
いいえ | MP3/WAV/M4A、15 MB;先頭の duration 秒のみ使用 |
negative_prompt |
いいえ | 最大 2000 文字 |
resolution |
いいえ | 720p、1080p、2k |
aspect_ratio |
いいえ | auto、16:9、9:16、1:1、4:3、3:4 |
duration |
いいえ | 整数秒、1 から 20 |
これら 3 つのモードは独立したモデル id ではありません。テキストから動画を生成する場合は image_url と audio_url を省略します。画像から動画を生成する場合は image_url を追加します。audio_url を追加すると(通常は画像も同時に提供)、出演者があなたのナレーションに合わせて動きます。
最小限の動作するリクエスト
curl -X POST 'https://api.hiapi.ai/v1/tasks' \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "creatify-boreal",
"input": {
"prompt": "縦型自撮りスタイルの UGC 動画:若い女性が明るい寝室で柔らかなピンクのリップスティックを掲げ、カメラに向かって「これ、私の冬を乗り切った唯一のリップなんだよね」と言う。自然な部屋の環境音。",
"resolution": "720p",
"aspect_ratio": "9:16",
"duration": 4
}
}'
レスポンスでタスク id が返ります:
{"code":200,"data":{"taskId":"tk-hiapi-01M5MJC8NG8E1E0XN9NEJRDBQH"},"message":"success"}
Python:送信とポーリング
import os, time, requests
BASE = "https://api.hiapi.ai/v1/tasks"
HEADERS = {"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}"}
def create(payload: dict) -> str:
r = requests.post(BASE, headers=HEADERS, json=payload, timeout=30)
r.raise_for_status()
return r.json()["data"]["taskId"]
def wait(task_id: str, every: int = 10, limit: int = 900) -> dict:
start = time.time()
while time.time() - start < limit:
try:
d = requests.get(f"{BASE}/{task_id}", headers=HEADERS, timeout=30).json()["data"]
except (requests.RequestException, ValueError):
time.sleep(every) # 一時的なネットワークエラー:同じ id でポーリングを続行
continue
if d["status"] == "success":
return d
if d["status"] == "fail":
raise RuntimeError(d.get("error"))
time.sleep(every)
raise TimeoutError(task_id)
task_id = create({
"model": "creatify-boreal",
"input": {
"prompt": "縦型自撮りスタイルの UGC 動画:若い女性が柔らかなピンクのリップスティックを掲げ、カメラに向かって「これ、私の冬を乗り切った唯一のリップなんだよね」と言う。自然な部屋の環境音。",
"resolution": "720p",
"aspect_ratio": "9:16",
"duration": 4,
},
})
result = wait(task_id)
print(result["output"][0]["url"])
ステータスは handling、archiving を経て success に至ります。動画 URL は data.output[0].url にあります。
画像モードと音声モード
画像から動画を生成する場合はフィールドを 1 つ追加するだけです:
{"model": "creatify-boreal",
"input": {"prompt": "この女性がキッチンでカメラに向かって微笑みながら話す:「コーヒーをこのオーツミルクのラテブレンドに替えたんだよね。」自然なキッチンの環境音。",
"image_url": "https://your-cdn.example/presenter.jpg",
"resolution": "720p", "duration": 8}}
音声駆動モードではナレーションファイルを指す audio_url を追加します。モデルページでは、ナレーションが動画内に保持され、唇がナレーションの動きに追従すること、そして音声の先頭 duration 秒のみが使用されることが説明されているため、duration は求めるクリップの長さに設定してください。モデルページの音声サンプルは音声と参照画像を組み合わせていますが、私自身は画像+音声の生成を実行していないため、この組み合わせは本記事ではドキュメント記載であり検証済みではありません。
実際の実行の様子
上記のリクエスト(テキストのみ、720p、9:16、4 秒)を実行しました。
- 生成時間: タスクは
handling状態に約 283 秒、その後archiving状態に約 10 秒かかりました。4 秒のクリップであっても、秒ではなく分単位で計画してください。短いタイムアウトではなく、10 秒ごとのポーリングまたはコールバックを使用してください。 - 出力ファイル: 720x1280 の MP4、H.264 動画 24 fps に AAC 音声トラック、長さ 4.04 秒。リクエストに音声フィールドがないにもかかわらず音声が存在しますが、これはモデルのネイティブなサウンドデザインに沿ったものです。
- 一時 URL: 出力 URL は
temp.hiapi.aiにあり、約 7 日後に期限切れになるexpireAtが付いています。ページからリンクするのではなく、ファイルをダウンロードして自分で保存してください。 - コストの形: 秒単位で課金され、
resolutionにも依存します(料金ページを参照)。そのためプロンプトの反復を最も安く行うには 720p かつ短めのdurationを使い、その後最終版を 1080p や 2k で再レンダリングしてください。
私が遭遇した落とし穴
- 誤った値は即座に失敗し、無料です。
aspect_ratio: "7:5"、duration: 25、resolution: "4k"を送信すると、いずれも HTTP 400INVALID_REQUESTを返し、メッセージに許可される値('auto', '16:9', '9:16', '1:1', '4:3', '3:4'、最大 20、および'720p', '1080p', '2k')が列挙されます。これを利用して、送信前に自分のフォームを検証してください。 - 誤ったメディア URL は後でポーリング時に失敗します。
audio_url: "https://example.com/a.mp3"(実際の音声ファイルではない)を送信しました。作成呼び出しは HTTP 200 とタスク id を返しましたが、約 15 秒後にタスクはstatus: "fail"とerror.code: "INVALID_REQUEST"で終了しました。つまり作成時に 200 が返っても、メディアが利用可能であることを意味しません。常に最終ステータスを確認し、data.errorを読んでください。この場合、失敗は HTTP エラーとしてではなく、HTTP 200 のポーリングレスポンス内で示されました。 - 失敗は HTTP ステータスではなく
status: "fail"です。 ポーリングリクエスト自体は 200 を返すため、data.statusを確認してください。
関連ページ
- Creatify Boreal モデルページ:Playground、リアルタイム料金、サンプルクリップ
- hiapi 料金
- hiapi ドキュメント
- OmniHuman 1.5 API の使い方:もう 1 つの出演者スタイル動画モデル
- Ray 3.2 画像から動画への API
- Wan 3.0 動画 API ガイド
よくある質問
テキスト・画像・音声の入力には別々のモデル id が必要ですか?
いいえ。3 つとも creatify-boreal を使用します。input に含めるフィールドがモードを決定します。
クリップは最長どれくらいにできますか? 1 から 20 の整数秒です。値 25 は HTTP 400 で拒否されます。
出力に音声は含まれますか? 含まれます。4 秒のテストクリップには、音声入力を提供していなくても AAC 音声トラックが付いていました。
利用可能な解像度は何ですか?
720p、1080p、2k です。課金は解像度によって異なります。料金ページを確認してください。
どれくらい待つべきですか? 私の 4 秒 720p のテストはエンドツーエンドで約 5 分かかりました。余裕のある上限を設定したポーリングまたはコールバックを使用してください。
関連記事
すべての記事を見る →-
チュートリアル
HiAPI API で hailuo-2.3-fast/image-to-video を呼び出す方法:curl と Python の実践
高速・低コストな画像から動画へのティアにおける最初の実行可能なリクエスト — モデル ID から MP4 のダウンロードまで
-
チュートリアル
HiAPI APIでhailuo-2.3/text-to-videoを呼び出す方法:curl、Python、実行可能なリクエスト例
-
チュートリアル
HiAPI で Kandinsky 6.0 Pro のテキストto動画を使用する:curl と Python チュートリアル
リクエスト優先の実践デモ:プロンプトから動画クリップへの呼び出しを構築し、リクエストを送信し、完了状態をポーリングし、結果をダウンロードする