GPT-6 Sol・Claude Opus 5.5 提供開始GPT-6 Sol の料金は 5.6 Sol の半額

HappyHorse 1.1 画像から動画:API の使い方と実測クリップ

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

Kiki, OmniaKey COO読了目安 11分
このページの内容

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バイトになりました:

bash
sips -s format jpeg -s formatOptions 85 -Z 1280 still.jpg --out still-small.jpg

リクエストにはどのフィールドが必要ですか?

9つのフィールドでタスクが決まります。トップレベルが3つ、input の中が2つ、parameters の中が4つです。

フィールド値補足
modelhappyhorse-1.1-i2v1.1 画像から動画のモデル ID
typevideoタスクが作るファイルの種類
operationimage_to_video接頭辞なしの名前
input.promptテキストOmniaKey では必須、Alibaba の API では任意。中国語以外は5,000文字、中国語は2,500文字までで、超えた分は切り捨て
input.media{"type": "first_frame", "url": ...} をちょうど1つ公開 HTTPS URL または data URI
parameters.resolution480P、720P、1080P毎回送る:Alibaba の既定は 1080P
parameters.duration整数秒で3〜15OmniaKey では必須
parameters.watermarktrue(既定)または falsefalse で "Happy Horse" の文字が消える
parameters.seed0〜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 スクリプト

実際に実行したファイルそのままで、標準ライブラリだけを使います。

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 として保存し、次のように実行します:

bash
export OMNIAKEY_API_KEY="your-omniakey-api-key"
python3 hh_i2v.py still.jpg "The camera slowly orbits the headphones." clip.mp4

watermark: false で実行したときの出力は次のとおりです:

text
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本は既定設定なので、フレームにウォーターマークが入っています。

ヘッドホンの周回

prompt
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.
石の台座に置かれた黒いヘッドホンの8フレーム。カメラは片側から反対側へ回り込み、中盤のフレームでは後ろに湾曲した背景の縁が現れる。
周回クリップの8フレームを時系列に並べたもの、0.0〜4.85秒、ウォーターマークは false。HappyHorse 1.1 を OmniaKey API 経由で使い、画像から動画、5秒、720P、2026年11月2日作成。

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

同じ静止画と同じプロンプトで、既定設定と watermark: false の2回を実行しました。右下に違いが出ます。

2本のクリップの右下隅。上のクリップには白い Happy Horse の文字があり、下のクリップはウォーターマークを false にしたので何もない。
各周回クリップの最終フレームの右下隅を拡大したもの。上:既定設定。下:ウォーターマークを false に設定。HappyHorse 1.1 を OmniaKey API 経由で使い、画像から動画、5秒、720P、2026年11月2日作成。

雨のポートレート

prompt
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.
濡れたネオン街で黄色いレインコートを着た女性の4フレーム。左を見ていた彼女がカメラの方を向いて微笑み、ショットは腰から上から顔のアップへ寄る。
雨のポートレートクリップの4フレームを時系列に並べたもの、0.0〜4.85秒、既定のウォーターマーク付き。HappyHorse 1.1 を OmniaKey API 経由で使い、画像から動画、5秒、720P、2026年11月2日作成。

彼女は左を見る姿勢からカメラの方を向いて微笑みます。順番はプロンプトどおりで、どのフレームにもウォーターマークが入っています。プロンプトは軽いプッシュインを頼み、ショットは腰から上から顔のアップになります。

湖のプッシュイン

prompt
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.
日の出の霧の湖に浮かぶ木造船の8フレーム。カメラが寄り、船が画面の大半を占めるまでになり、船体から波紋が広がる。
湖のクリップの8フレームを時系列に並べたもの、0.0〜4.85秒、既定のウォーターマーク付き。HappyHorse 1.1 を OmniaKey API 経由で使い、画像から動画、5秒、720P、2026年11月2日作成。

カメラは頼んだとおり船へ寄ります。最後には船が画面の大半を占め、船体から波紋が広がります。

キツネのイラスト

prompt
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フレーム。オレンジの葉が舞い落ち、視点は木全体からキツネへ寄っていく。
キツネのクリップの4フレームを時系列に並べたもの、0.0〜4.85秒、既定のウォーターマーク付き。HappyHorse 1.1 を OmniaKey API 経由で使い、画像から動画、5秒、720P、2026年11月2日作成。

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

左:送ったキツネの静止画で、木全体が写っている。右:クリップの最終フレームで、キツネと開いた本にかなり寄っており、同じフラットなタッチのまま Happy Horse のウォーターマークが入る。
左:最初のフレームとして送った静止画。右:キツネのクリップの最終フレーム。HappyHorse 1.1 を OmniaKey API 経由で使い、画像から動画、5秒、720P、2026年11月2日作成。

4本のプロンプトのうち2本で、カメラは頼んだ以上に動きました。短いテストで構図を確認してください。ドキュメントにある最短・最下位の設定は3秒・480Pです(Alibaba の画像から動画 API リファレンス、2026年11月2日確認)。

ファイルの実測値

クリップ比率ピクセルフレーム時間バイト
周回、既定16:91286×716123128秒1,486,548
周回、watermark: false16:91286×71612198秒1,320,527
雨のポートレート9:16716×1286123158秒2,108,577
湖16:91286×716123131秒2,691,558
キツネ1:1960×96012392秒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日確認)。無音のファイルにするには、ダウンロード後に音声トラックを外します:

bash
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 です。

確認した資料

OmniaKey 自身のドキュメント(2026年11月2日確認):動画 API と メディア API 概要。

この記事で紹介しているモデル

HappyHorse 1.1画像から動画AI 動画動画 APIPython

関連記事

最近の記事

人気のガイド