HappyHorse 1.1 画像から動画:API の使い方と実測クリップ
スクリプト1本で静止画を送り、タスクをポーリングして MP4 を保存します。フィールド、ウォーターマークと音声の意外な挙動、2026年11月2日に作った5本のクリップをまとめました。

このページの内容
- 短い答え
- 最初の HappyHorse 1.1 画像から動画の呼び出しに必要なものは?
- リクエストにはどのフィールドが必要ですか?
- Python スクリプト
- 作った5本のクリップ
- ヘッドホンの周回
- 雨のポートレート
- 湖のプッシュイン
- キツネのイラスト
- ファイルの実測値
- なぜクリップに音が入るのですか?
- 結果はどのくらい残りますか?
- どんなエラーが出ますか?
- HappyHorse 1.1 のクリップはいくらですか?
- Alibaba Cloud を直接呼べますか?
- よくある質問
- HappyHorse の画像から動画にプロンプトは必要ですか?
- Happy Horse のウォーターマークはどう消しますか?
- アスペクト比はどう設定しますか?
- HappyHorse 1.5 はありますか?
- 画像から動画は HappyHorse 1.1 と 1.0 のどちらが良いですか?
- 確認した資料
HappyHorse 1.1 の画像から動画は、静止画を first_frame として https://api.omniakey.com/v1/media/tasks に POST し、モデル ID happyhorse-1.1-i2v でタスクをポーリングして MP4 をダウンロードします。2026年11月2日に作った5秒・720Pのクリップ5本は、92〜158秒で完成しました。どのクリップにも頼んでいない音楽が付き、既定では "Happy Horse" のウォーターマークも入ります。
短い答え
- リクエスト:モデル
happyhorse-1.1-i2v、操作image_to_video、input.mediaにfirst_frameをちょうど1つ。 - アスペクト比:
ratioフィールドがないため、クリップは静止画の比率に従います。 - 長さと解像度:3〜15秒で、480P、720P、1080P から選びます。
resolutionは毎回送ってください。Alibaba の既定は 1080P です。 - ウォーターマーク:既定でオン、
watermark: falseでオフ。 - 音声:5本すべてに音楽が付きました。Alibaba の API に音声のオン・オフはなく、
ffmpegで音声トラックを消せます。
最初の HappyHorse 1.1 画像から動画の呼び出しに必要なものは?
キー、Python 3、そして Alibaba の条件を満たす静止画の3つです。
- キーは
OMNIAKEY_API_KEYに入れます。スクリプトは Bearer トークンとして送るので、コードに残りません。 - Python 3 は追加インストール不要です。スクリプトは標準ライブラリだけを使います。
- 静止画は Alibaba の画像から動画 API リファレンス の条件を満たすものにします。JPEG、JPG、PNG、WEBP のいずれかで、幅と高さは300ピクセル以上、20 MBまで、アスペクト比は1:2.5〜2.5:1です。Alibaba は画素数の上限を書いていません。
引っかかるのはサイズです。インラインの静止画はリクエスト本文に入るため、Base64 を含めて1 MiB未満に収める必要があります(OmniaKey のメディア API 概要、2026年11月2日確認)。スクリプトは700 KBを超えると止まります。それ以上なら静止画を縮小するか、公開 HTTPS URL を渡してください。私たちの2K静止画は2,254,819バイトで、次の macOS コマンドで92,212バイトになりました:
sips -s format jpeg -s formatOptions 85 -Z 1280 still.jpg --out still-small.jpg
リクエストにはどのフィールドが必要ですか?
9つのフィールドでタスクが決まります。トップレベルが3つ、input の中が2つ、parameters の中が4つです。
| フィールド | 値 | 補足 |
|---|---|---|
model | happyhorse-1.1-i2v | 1.1 画像から動画のモデル ID |
type | video | タスクが作るファイルの種類 |
operation | image_to_video | 接頭辞なしの名前 |
input.prompt | テキスト | OmniaKey では必須、Alibaba の API では任意。中国語以外は5,000文字、中国語は2,500文字までで、超えた分は切り捨て |
input.media | {"type": "first_frame", "url": ...} をちょうど1つ | 公開 HTTPS URL または data URI |
parameters.resolution | 480P、720P、1080P | 毎回送る:Alibaba の既定は 1080P |
parameters.duration | 整数秒で3〜15 | OmniaKey では必須 |
parameters.watermark | true(既定)または false | false で "Happy Horse" の文字が消える |
parameters.seed | 0〜2147483647 | 同じ seed でも同じクリップになるとは限らない |
見落としやすい点が4つあります。
ratioフィールドはありません。クリップは静止画のアスペクト比を保ちます(Alibaba の画像から動画 API リファレンス、2026年11月2日確認)。- Alibaba のページにネガティブプロンプトのフィールドはありません。
- 作成のたびに
Idempotency-Keyヘッダーが必要です。同じ本文で再送すると元のタスクが返り、二重に課金されません。本文が違うと409 idempotency_key_reusedになります(OmniaKey の 動画 API ドキュメント、2026年11月2日確認)。 - 出力サイズは変わります。OmniaKey のドキュメントでは、1200×630 の静止画を 720P で作ると 1324×696 で返ります。
Python スクリプト
実際に実行したファイルそのままで、標準ライブラリだけを使います。
"""Animate one still with HappyHorse 1.1 image-to-video through the OmniaKey media API.
Usage:
export OMNIAKEY_API_KEY="your-omniakey-api-key"
python3 hh_i2v.py still.jpg "The camera slowly orbits the headphones." clip.mp4
The still can be a local JPEG or PNG (sent inline as a data URL) or a public https:// URL.
"""
import base64
import json
import mimetypes
import os
import sys
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
HEADERS = {
"Authorization": "Bearer " + os.environ["OMNIAKEY_API_KEY"],
"Content-Type": "application/json",
"User-Agent": "happyhorse-i2v-example/1.0",
}
POLL_SECONDS = 10
GIVE_UP_AFTER = 15 * 60 # most clips finish in 1-5 minutes
def call(method, url, body=None, extra_headers=None):
data = json.dumps(body).encode() if body is not None else None
req = urllib.request.Request(url, data=data, method=method, headers={**HEADERS, **(extra_headers or {})})
for attempt in range(3):
try:
with urllib.request.urlopen(req, timeout=60) as resp:
return json.load(resp)
except urllib.error.HTTPError as err:
sys.exit(f"HTTP {err.code}: {err.read().decode(errors='replace')}")
except (urllib.error.URLError, TimeoutError, ConnectionError) as err:
if attempt == 2:
raise
print("network error, retrying:", err) # a retried POST keeps its Idempotency-Key
time.sleep(5)
def first_frame_url(image):
if image.startswith("https://"):
return image
raw = open(image, "rb").read()
if len(raw) > 700_000: # Base64 adds a third, and the whole request must stay under 1 MiB
sys.exit("The still is over 700 KB. Resize it or pass a public https:// URL instead.")
mime = mimetypes.guess_type(image)[0] or "image/jpeg"
return f"data:{mime};base64,{base64.b64encode(raw).decode()}"
def main(image, prompt, out_path):
task = call("POST", API, {
"model": "happyhorse-1.1-i2v",
"type": "video",
"operation": "image_to_video",
"input": {"prompt": prompt, "media": [{"type": "first_frame", "url": first_frame_url(image)}]},
"parameters": {"resolution": "720P", "duration": 5, "watermark": False}, # watermark is on by default
}, {"Idempotency-Key": str(uuid.uuid4())})
print("task", task["id"], task["status"])
start = time.time()
while task["status"] in ("queued", "processing"):
if time.time() - start > GIVE_UP_AFTER:
sys.exit(f"Still {task['status']} after 15 minutes. Do not submit it again; "
f"check it later with GET {API}/{task['id']}")
time.sleep(POLL_SECONDS)
task = call("GET", f"{API}/{task['id']}")
print(task["status"], "after", round(time.time() - start), "s")
if task["status"] != "succeeded":
sys.exit(json.dumps(task.get("error") or task))
# The signed download URL is short-lived, so save the file right away.
req = urllib.request.Request(task["assets"][0]["url"], headers={"User-Agent": HEADERS["User-Agent"]})
with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
f.write(resp.read())
print("saved", out_path)
if __name__ == "__main__":
main(*sys.argv[1:4])
hh_i2v.py として保存し、次のように実行します:
export OMNIAKEY_API_KEY="your-omniakey-api-key"
python3 hh_i2v.py still.jpg "The camera slowly orbits the headphones." clip.mp4
watermark: false で実行したときの出力は次のとおりです:
task task_QqK3ZdAd72vmK1DSOuOxXSytBSaJ244v queued
succeeded after 91 s
saved data/clips/c5-orbit-nowm.mp4
スクリプトで押さえておきたい点は5つあります。
- 10秒ごとにポーリングします。
- 15分で諦め、再送しないようメッセージを出します。
- ネットワークエラーでは再試行します。作成の再試行は
Idempotency-Keyを保つので、二重課金ではなく元のタスクが返ります。 - タスクが成功したらすぐ保存します。署名付きダウンロード URL の有効期限が短いためです。
- どのリクエストにも User-Agent を付けます。2026年10月29日の Kling 3.0 API のテストでは、Python の既定の User-Agent が Cloudflare から
error code: 1010付きの HTTP 403 を受けました。
作った5本のクリップ
Nano Banana 2.1 で静止画を4枚作り、ヘッドホンの画像はウォーターマークの確認用に2回実行しました。2026年11月2日に、5秒・720Pのクリップが5本できました。ポートレート、湖、キツネの3本は既定設定なので、フレームにウォーターマークが入っています。
ヘッドホンの周回
The camera slowly orbits about 90 degrees to the right around the headphones while a soft band of light sweeps across the ear cups. The headphones stay perfectly still on the pedestal. Smooth, steady product-commercial camera move.

カメラはヘッドホンの片側から反対側へ回り込み、ヘッドホンは台座の上にとどまります。中盤のフレームでは、静止画にはない湾曲した背景の縁が後ろに現れ、プロンプトで頼んだ光の帯はほとんど見えません。
同じ静止画と同じプロンプトで、既定設定と watermark: false の2回を実行しました。右下に違いが出ます。

雨のポートレート
She slowly turns her head toward the camera and gives a small smile while light rain keeps falling. The neon signs behind her flicker softly and the camera pushes in a little.

彼女は左を見る姿勢からカメラの方を向いて微笑みます。順番はプロンプトどおりで、どのフレームにもウォーターマークが入っています。プロンプトは軽いプッシュインを頼み、ショットは腰から上から顔のアップになります。
湖のプッシュイン
Slow aerial push-in over the water toward the rowboat. Mist drifts across the lake, the boat rocks gently and small ripples spread from its hull, and the golden light grows a little brighter.

カメラは頼んだとおり船へ寄ります。最後には船が画面の大半を占め、船体から波紋が広がります。
キツネのイラスト
The fox turns a page of the book with its paw and its ears twitch. A few orange leaves drift down from the tree and the branches sway gently. Keep the flat illustration style.

最初のフレームから最後までフラットイラストのタッチは保たれ、オレンジの葉が舞い落ちます。カメラは木全体からキツネのアップへ寄り、これはプロンプトで頼んでいない動きです。本のページは浮き上がりますが、前足でページをめくったかどうかはフレームからは確認できません。

4本のプロンプトのうち2本で、カメラは頼んだ以上に動きました。短いテストで構図を確認してください。ドキュメントにある最短・最下位の設定は3秒・480Pです(Alibaba の画像から動画 API リファレンス、2026年11月2日確認)。
ファイルの実測値
| クリップ | 比率 | ピクセル | フレーム | 時間 | バイト |
|---|---|---|---|---|---|
| 周回、既定 | 16:9 | 1286×716 | 123 | 128秒 | 1,486,548 |
周回、watermark: false | 16:9 | 1286×716 | 121 | 98秒 | 1,320,527 |
| 雨のポートレート | 9:16 | 716×1286 | 123 | 158秒 | 2,108,577 |
| 湖 | 16:9 | 1286×716 | 123 | 131秒 | 2,691,558 |
| キツネ | 1:1 | 960×960 | 123 | 92秒 | 2,405,557 |
どのファイルも5.16秒と記録されていますが、指定したのは5秒です。これは音声ストリームの長さで、映像ストリームは123フレームで5.13秒、121フレームで5.04秒です。5本とも24 fps の H.264 で、2チャンネルの AAC トラックが付いています。カット検出スクリプトはどのファイルにもカットを見つけませんでした。
私たちのクリップは、送信からダウンロードまで92〜158秒でした。Alibaba のドキュメントは画像から動画のタスクに1〜5分と書いています(Alibaba の画像から動画 API リファレンス、2026年11月2日確認)。480P、1080P、ほかの長さ、seed、公開画像 URL、HappyHorse 1.0、Alibaba 自身のエンドポイントは試していません。モデルを比べるなら HappyHorse 1.1 と Seedance 2.0 の比較 と HappyHorse 1.1 と Kling 3.0 の比較 をどうぞ。コードなしで作り直すなら、HappyHorse 1.1 は AI 動画生成ツール にあります。
なぜクリップに音が入るのですか?
5本すべてに HappyHorse 1.1 が音楽を付けました。プロンプトでは一曲も頼んでいません。試聴した人はいません。Gemini 3.8 Flash に OmniaKey API 経由で各トラックを説明させました。
| クリップ | モデルの説明 | 平均ラウドネス |
|---|---|---|
| 周回、既定 | 「シンコペーションのパーカッション、クラップ、まろやかなシンセコードを伴うリズミカルなヒップホップビート。」 | −19.5 dB |
周回、watermark: false | 「安定したビートと旋律的なシンセトーンを持つ、落ち着いたリズミカルな電子音楽」 | −20.5 dB |
| 雨のポートレート | 「ゆっくりと物憂げで優しいピアノの旋律に、柔らかな環境音を添えたもの」 | −22.6 dB |
| 湖 | 「ゆっくりと優しく情感のあるピアノの旋律」 | −20.2 dB |
| キツネ | 「柔らかなベルの音で奏でる穏やかで優しいアンビエントの旋律」に加え「砂利を踏む足音」 | −27.4 dB |
どのクリップにも人の声はないと報告されました。同じプロンプトと同じ静止画を2回実行すると、別々のトラックが付きました。
Alibaba の画像から動画リファレンスには音声のフィールドも無音の選択肢もありませんが、1.1 のリリースノートは音声と映像の同期に触れています(Alibaba の新リリースモデルのページ、2026年11月2日確認)。無音のファイルにするには、ダウンロード後に音声トラックを外します:
ffmpeg -i clip.mp4 -an -c:v copy silent.mp4
watermark: false のクリップでこれを実行すると、映像ストリームがあり、音声ストリームがないファイルになりました。-c:v copy は再エンコードせずにストリームをコピーするので、映像はそのままです。
結果はどのくらい残りますか?
OmniaKey では、MP4 への署名付きリンクは約1時間有効で、タスクの記録は24時間保持されます。タスクをもう一度ポーリングすると新しい URL が取れます(OmniaKey のメディア API 概要、2026年11月2日確認)。Alibaba 自身の API では、動画 URL とタスク ID がともに24時間有効で、その後は照会が UNKNOWN を返し、ファイルは消えています。タスクが成功したらすぐダウンロードしてください。
どんなエラーが出ますか?
5回の実行はどれも失敗しなかったため、この一覧は OmniaKey の動画 API ドキュメント(2026年11月2日確認)によるものです。
| ステータス | 意味 | 対処 |
|---|---|---|
400 invalid_request | 本文の形式が不正、またはタスクに input.prompt がない | 上のリクエストの形を確認する |
400 model_price_error | 長さがモデルの範囲外、または料金のない解像度 | 対応する長さと解像度を使う |
403 model_not_allowed | キーまたはグループにモデルが含まれていない | キーのモデル権限を確認する |
409 idempotency_key_reused | 同じキーを違う本文で送った | 同じキーは同一の再試行だけに使う |
503 no_available_channel | 今このモデルや操作を提供するチャネルがない | 時間をおいて試すか、ダッシュボードを見る |
failed で終わったタスクは自動で返金されるので、拒否されたレンダリングでかかるのは時間だけです(OmniaKey のメディア API 概要、2026年11月2日確認)。
避けたいのは、手元のタイムアウトをタスクの失敗と読むことです。同じタスク ID をポーリングしてください。再送すると2つ目のタスクが始まり、2回目の課金になります。どうしても送り直すときは、同じ Idempotency-Key と同じ本文を保てば、元のタスクが返ります。
HappyHorse 1.1 のクリップはいくらですか?
5秒・720Pのクリップは、Alibaba のシンガポールの定価で $0.70 です。以下は Alibaba の秒単価で、料金ページ(2026年11月2日確認)の数字です:
| 解像度 | シンガポール | 北京と Global |
|---|---|---|
| 480P | $0.07 | $0.0618845 |
| 720P | $0.14 | $0.123769 |
| 1080P | $0.18 | $0.165026 |
請求額は秒単価に出力の秒数を掛けたものです。失敗したリクエストは課金されません。シンガポールには90日間有効な10秒の無料枠もあります。料金ページでは、Global の料金がフランクフルト、バージニア、東京に適用されます。
OmniaKey はレンダリングされた出力の秒数で課金し、タスク作成時に先に引き落とします。失敗やキャンセルのタスクは自動で返金されます。現在の料金は HappyHorse 1.1 のページ で確認できます。
Alibaba Cloud を直接呼べますか?
はい。HappyHorse は Alibaba Cloud Model Studio で提供され、シンガポール、米国(バージニア)、北京、フランクフルト、東京にリージョンのエンドポイントがあります(Alibaba の画像から動画 API リファレンス、2026年11月2日確認)。私たちの実行は OmniaKey の API 経由なので、以下は Alibaba のドキュメントによるものです。
- シンガポールでは
POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesisで作成します。 X-DashScope-Async: enableヘッダーを送らないと、リクエストは "current user api does not support synchronous calls" で失敗します。- 約15秒ごとに
GET .../api/v1/tasks/{task_id}をポーリングします。ステータスはPENDING、RUNNING、SUCCEEDED、FAILED、CANCELED、UNKNOWNと進みます。 - モデル、エンドポイント、キーは同じリージョンに置きます。リージョンをまたぐ呼び出しは失敗します。
- 1つのキーで毎秒5リクエスト、同時5タスクまでです(Alibaba のレート制限ページ、2026年11月2日確認)。
料金ページには東京が載っていますが、レート制限ページには東京の 1.1 画像から動画が載っていないため、東京は未確認です。
よくある質問
HappyHorse の画像から動画にプロンプトは必要ですか?
OmniaKey では必要です。input.prompt のないタスクは 400 invalid_request になります(OmniaKey の動画 API ドキュメント、2026年11月2日確認)。Alibaba 自身の API はプロンプトを任意として扱い、最初のフレームだけで生成します。どちらでも、上のプロンプトのように動きとカメラの動きを書いてください。
Happy Horse のウォーターマークはどう消しますか?
parameters.watermark: false を送ります。既定の true は右下に白い小さな "Happy Horse" の文字を描きます。2本目の周回クリップは false で送ったので、何も入らずに返ってきました。
アスペクト比はどう設定しますか?
静止画を切り抜きます。画像から動画には ratio フィールドがなく、クリップは最初のフレームの形に従うので、16:9 の静止画からは 16:9 のクリップ、縦長の静止画からは 9:16 のクリップができます。切り抜きは 1:2.5〜2.5:1 の範囲に収めてください。
HappyHorse 1.5 はありますか?
2026年11月2日時点で、Alibaba のモデル一覧、料金表、ライフサイクルのページに 1.1 より後のバージョンはありません。これらのページで最新なのは happyhorse-1.1-i2v で、2026年6月16日に公開されました。一部のサイトは "Happy Horse 1.5" という名前を使っています。
画像から動画は HappyHorse 1.1 と 1.0 のどちらが良いですか?
Alibaba は 1.1 で画質、動きの表現、クリップ間の一貫性が向上したと述べています。料金ページでも 480P の段は 1.1 だけにあります。1.1 は2026年6月16日、1.0 は2026年4月22日の公開です。Alibaba のシンガポール料金では、1080P が 1.1 で毎秒 $0.18、1.0 で $0.24 です。
確認した資料
- Alibaba Cloud:HappyHorse 画像から動画 API リファレンス、2026年11月2日確認
- Alibaba Cloud:モデル料金、2026年11月2日確認
- Alibaba Cloud:モデル一覧、2026年11月2日確認
- Alibaba Cloud:新リリースモデル、2026年11月2日確認
- Alibaba Cloud:レート制限、2026年11月2日確認
OmniaKey 自身のドキュメント(2026年11月2日確認):動画 API と メディア API 概要。
この記事で紹介しているモデル
関連記事
HappyHorse 1.1 vs Seedance 2.0:同じプロンプトで比較、仕上がりと料金
同じ3本のプロンプトを同じ日に。仕上がりは Seedance 2.0、速さは HappyHorse 1.1 が2倍でした。
HappyHorse 1.1 vs Kling 3.0:同じプロンプトで比較、仕上がりと料金
同じ3本のプロンプトで、HappyHorse 1.1 は屋台と香水瓶の周回を制し、Kling 3.0 はスケートの技を決めました。
Kling 3.0 API:テキストto動画のリクエストコードと実測クリップ
テキストto動画のタスクは、model に kling-3.0 を指定した 1 回の POST で始まります。リクエストコードと必須フィールド、2026 年 10 月 29 日に作成して計測した 5 秒クリップ 2 本を掲載します。

