HappyHorse 1.1 이미지 투 비디오: API 사용법과 실제 클립
스크립트 하나로 정지 이미지를 보내고, 작업을 폴링해 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하나. - 화면 비율:
ratio필드가 없어서 클립이 정지 이미지의 비율을 따릅니다. - 길이와 해상도: 3~15초, 480P, 720P, 1080P 가운데 고릅니다.
resolution은 매번 보냅니다. Alibaba 기본값은 1080P입니다. - 워터마크: 기본으로 켜지고
watermark: false로 끕니다. - 소리: 5개 모두 음악이 붙었습니다. Alibaba API에는 오디오 스위치가 없고
ffmpeg로 오디오 트랙을 제거합니다.
HappyHorse 1.1 이미지 투 비디오를 처음 호출하기 전에 무엇이 필요한가요?
key, Python 3, Alibaba 규칙을 통과하는 정지 이미지, 이 세 가지입니다.
- key는
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": ...} 정확히 하나 | 공개 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라도 같은 클립이 나오지는 않습니다 |
놓치기 쉬운 점이 네 가지 있습니다.
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
스크립트에서 짚을 점은 다섯 가지입니다.
- 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장을 만들고, 헤드폰 이미지는 워터마크를 확인하려고 두 번 실행했습니다. 2026년 11월 2일에 5초 720P 클립 5개가 나왔습니다. 인물, 호수, 여우 클립은 기본 설정으로 만들어 프레임에 워터마크가 보입니다.
헤드폰 궤도
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를 한 번씩 실행했습니다. 오른쪽 아래에서 차이가 보입니다.

비 오는 인물
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초입니다. 다섯 개 모두 24 fps H.264이며 2채널 AAC 트랙이 붙어 있습니다. 컷 감지 스크립트는 어느 파일에서도 컷을 찾지 못했습니다.
클립은 제출부터 다운로드까지 92158초가 걸렸습니다. Alibaba 문서는 이미지 투 비디오 작업에 15분이 걸린다고 적습니다(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 |
어느 클립에서도 사람 목소리는 없다고 보고했습니다. 같은 프롬프트와 같은 이미지로 두 번 실행하면 서로 다른 트랙이 붙었습니다.
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을 돌려주며 파일은 사라집니다. 작업이 성공하면 바로 내려받으세요.
어떤 오류가 나나요?
다섯 번의 실행이 모두 성공했으므로 이 목록은 OmniaKey 비디오 API 문서(2026년 11월 2일 확인)에서 가져왔습니다.
| 상태 | 의미 | 대처 |
|---|---|---|
400 invalid_request | 본문 형식이 잘못되었거나 작업에 input.prompt가 없음 | 위의 요청 형태를 확인합니다 |
400 model_price_error | 길이가 모델 범위를 벗어났거나 가격이 없는 해상도 | 지원하는 길이와 해상도를 씁니다 |
403 model_not_allowed | key나 그룹에 모델이 없음 | key의 모델 권한을 확인합니다 |
409 idempotency_key_reused | 같은 키를 다른 본문으로 이미 보냄 | 같은 키는 똑같은 재시도에만 씁니다 |
503 no_available_channel | 지금 이 모델이나 작업을 제공하는 채널이 없음 | 잠시 뒤 다시 시도하거나 대시보드를 봅니다 |
failed로 끝난 작업은 자동으로 환불되므로 거절된 렌더링에 드는 비용은 시간뿐입니다(OmniaKey 미디어 API 개요, 2026년 11월 2일 확인).
피해야 할 실수는 내 쪽 타임아웃을 작업 실패로 읽는 것입니다. 같은 작업 ID를 폴링하세요. 다시 제출하면 두 번째 작업이 시작되고 두 번째 청구가 됩니다. 정말 다시 보낼 때는 같은 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순서로 갑니다. - 모델, 엔드포인트, key를 같은 리전에 둡니다. 리전을 넘는 호출은 실패합니다.
- key 하나에 초당 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" 글자를 그립니다. 두 번째 궤도 클립은 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이 두 배였습니다.
HappyHorse 1.1 vs Kling 3.0: 같은 프롬프트로 비교한 결과와 가격
같은 프롬프트 3개에서 HappyHorse 1.1은 야시장과 향수병 회전을 이겼고, Kling 3.0은 스케이트 묘기를 해냈습니다.
Kling 3.0 API: 텍스트 투 비디오 요청 코드와 실측 클립
텍스트 투 비디오 작업은 model에 kling-3.0을 넣는 POST 한 번으로 시작합니다. 요청 코드와 필수 필드, 2026년 10월 29일에 만들어 측정한 5초 클립 2개를 담았습니다.

