HiAPI
블로그

사용 가이드

seedance-2.0-mini로 숏폼 영상 제작하기: 엔드투엔드 hiapi API 워크플로

Jul 7, 2026
seedance-2.0-mini로 숏폼 영상 제작하기: 엔드투엔드 hiapi API 워크플로

TL;DR

  • 이것은 무엇인가: hiapi API에서 seedance-2.0-mini로 TikTok/Reels 스타일 세로형 숏폼을 만드는 엔드투엔드 워크플로입니다. 첫 curl 호출부터 일주일 분량 콘텐츠를 일괄 렌더링하는 스크립트까지 다룹니다. 이 페이지의 데모 클립은 본문에 제시된 요청 그대로 생성된 결과물입니다.
  • 숏폼에 이 모델을 고르는 이유: 9:16 네이티브 지원, 내장 동기화 오디오(별도 음향 처리 불필요), 4–15초 사이에서 유연하게 선택 가능한 길이, 480p 초안 초당 $0.0272—4초 세로형 초안은 약 $0.11입니다(가격).
  • 검증된 API 사실: prompt, duration(4–15 정수), resolution(480p | 720p)은 필수입니다. aspect_ratio는 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive를 허용합니다. 이미지→영상은 first_frame_url / last_frame_url을 사용합니다. 스키마는 엄격하여 seed 같은 알 수 없는 필드는 400으로 거부됩니다.
  • 워크플로: 480p로 생성하며 프롬프트를 반복하고, 보존할 클립은 720p로 재렌더링하고, 작업을 병렬로 일괄 제출합니다. 비동기 /v1/tasks 큐가 팬아웃을 대신 처리합니다.

왜 seedance-2.0-mini가 숏폼 루프에 적합한가

숏폼 제작은 정량적 작업입니다. 많은 클립을 초안으로 만들고 소수를 보존하여 매일 게시합니다. 이 워크플로는 비디오 API에 세 가지를 요구합니다—저비용 반복, 세로형 출력, 사운드—그리고 seedance-2.0-mini는 정확히 세 가지를 모두 충족합니다:

  • 초안 단가가 반복하기에 충분히 저렴합니다. 480p에서 모델은 출력 초당 $0.0272로 과금되므로 4초 초안은 약 $0.11이고, 전체 15초 클립도 약 $0.41에 불과합니다. 720p 티어는 초당 $0.0586입니다. (가격은 실시간 가격 페이지와 대조 검증했습니다. 영상은 초 단위로 과금되므로 duration이 비용 레버입니다.)
  • 네이티브 9:16. 가로형 클립을 잘라 구도를 잃는 대신 세로형으로 직접 렌더링합니다.
  • 네이티브 동기화 오디오. 출력 MP4에는 장면에 맞춰 생성된 AAC 오디오 트랙—앰비언스, 폴리, 룸 톤—이 포함됩니다. 자동 재생되는 피드 콘텐츠에서 이는 편집 단계 하나를 통째로 생략하게 해줍니다.

키 비주얼 콘텐츠용으로 더 큰 동급 모델을 원한다면 동일한 워크플로가 seedance-2-0에도 적용됩니다—가격 티어만 다릅니다.

설정

hiapi API 키 하나만 있으면 되고 그 외에는 아무것도 필요 없습니다—SDK도 필요 없습니다. 키를 환경 변수에 저장하세요:

export HIAPI_API_KEY="sk-..."

hiapi의 모든 비디오 모델은 통합 비동기 작업 엔드포인트로 실행됩니다. POST https://api.hiapi.ai/v1/tasks는 즉시 taskId를 반환하고, 이후 GET /v1/tasks/{taskId}를 완료될 때까지 폴링합니다. 자세한 내용은 문서를 참조하세요.

첫 세로형 클립(T2V)

최소 유효 요청에는 prompt, duration, resolution이 필요합니다. 숏폼을 위해 aspect_ratio: "9:16"을 추가하세요:

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0-mini",
    "input": {
      "prompt": "세로형 숏폼. 햇살이 내리쬐는 카페 바 위에서 신선한 말차 라떼가 투명한 유리잔에 천천히 부어지고, 녹색 소용돌이가 우유 사이로 피어나며, 부드러운 창가 빛, 얕은 심도. 네이티브 오디오: 잔잔한 카페 앰비언스, 액체 붓는 소리. 선명하고 군침 도는, 포토리얼.",
      "duration": 4,
      "resolution": "480p",
      "aspect_ratio": "9:16"
    }
  }'

응답은 즉시 반환됩니다:

{"code": 200, "data": {"taskId": "tk-hiapi-01KWTTFDPHSDWZ0FP1QAS5J79Q"}, "message": "success"}

status가 success가 될 때까지 작업을 폴링한 다음 즉시 output[0].url을 다운로드하세요—출력 URL은 임시이며 만료됩니다. 다음은 바로 이 요청으로 생성된 실제 클립입니다(4초, 480p, 9:16, 네이티브 붓기 및 앰비언스 오디오 포함—음소거를 해제하면 들을 수 있습니다):

이번 렌더링에서 얻은 실용적 팁 두 가지: “480p” 세로형 출력은 실측 시 496×864 픽셀이며, 오디오는 표준 AAC 트랙으로 MP4에 포함됩니다—별도 파일 합성이 필요 없습니다.

입력 스키마, 실시간 API로 검증

스키마는 엄격합니다. 다음은 실제 검증 응답을 그대로 재현한 것이며, 로그에서 식별하는 데 도움이 됩니다:

필드 타입 필수 값
prompt string ✅ (최소 길이 3) 샷 설명
duration integer ✅ 4–15(초)
resolution string ✅ 480p, 720p
aspect_ratio string 선택 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive
first_frame_url string 선택 I2V 시작 프레임 이미지 URL
last_frame_url string 선택 종료 프레임 제어용 이미지 URL
image_input array 선택 멀티모달 이미지 레퍼런스
reference_video_urls array 선택 스타일/모션 레퍼런스 비디오(더 낮은 초당 요율)

필수 필드를 생략하면 작업이 생성 전에 거부됩니다(과금 없음):

{"code": 400, "error_code": "INVALID_REQUEST", "message": "invalid input: resolution: missing required field \"resolution\"; duration: missing required field \"duration\""}

범위를 벗어난 값은 정확한 경계를 명시합니다—duration: maximum: got 16, want 15—알 수 없는 필드는 무시되지 않고 거부됩니다:

{"code": 400, "error_code": "INVALID_REQUEST", "message": "invalid input: <root>: additional properties 'seed' not allowed"}

이 마지막 동작은 꼭 새겨둘 만합니다: 다른 모델에서 요청 구조를 그대로 가져왔다면(seed, size, audio 플래그), seedance-2.0-mini는 해당 필드를 조용히 버리는 대신 400을 반환합니다.

재사용 가능한 Python 함수

프로덕션에 필요한 모든 것은 약 40줄입니다—제출, 폴링, 다운로드:

import os, time, requests

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

def submit(prompt: str, duration: int = 4, resolution: str = "480p",
           aspect_ratio: str = "9:16", **extra) -> str:
    r = requests.post(API, headers=HEADERS, json={
        "model": "seedance-2.0-mini",
        "input": {"prompt": prompt, "duration": duration,
                  "resolution": resolution, "aspect_ratio": aspect_ratio, **extra},
    }, timeout=60)
    data = r.json()
    task_id = (data.get("data") or {}).get("taskId")
    if not task_id:
        raise RuntimeError(f"submit failed: {data}")
    return task_id

def wait(task_id: str, timeout_s: int = 900) -> dict:
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        task = requests.get(f"{API}/{task_id}", headers=HEADERS, timeout=30).json()["data"]
        if task["status"] == "success":
            return task
        if task["status"] == "fail":
            raise RuntimeError(f"task failed: {task.get('error')}")
        time.sleep(8)
    raise TimeoutError(task_id)

def make_clip(prompt: str, out_path: str, **kw):
    task = wait(submit(prompt, **kw))
    url = task["output"][0]["url"]          # 임시 URL—즉시 다운로드하세요
    with open(out_path, "wb") as f:
        f.write(requests.get(url, timeout=120).content)

4초 480p 클립은 보통 몇 분 내에 완료됩니다. 피크 시간대에는 타임아웃 판정 전 최대 약 10분을 여유로 두세요.

이미지→영상: 첫 프레임 고정

제품 중심 숏폼에서 프롬프트 표류는 적입니다—당신은 당신의 제품이 화면에 나오길 원하지, 모델이 상상한 제품을 원하지 않습니다. 해결책은 first_frame_url을 사용한 I2V입니다. 정지 이미지를 생성(또는 촬영)한 뒤 애니메이션화하세요. 다음 같은 세로형 레퍼런스 정지 이미지는 동일한 /v1/tasks 엔드포인트로 gpt-image-2를 통해 제작되었으며 시작 프레임으로 적합합니다:

요청에는 필드 하나만 추가하면 됩니다:

task_id = submit(
    "뜨거운 물이 위에서 천천히 원을 그리며 부어지고, 핸드드립 드리퍼에서 증기가 피어오르며, "
    "물방울이 아래 유리 서버로 떨어지고, 햇살이 증기를 비춘다. 느리고 부드러운 푸시인. "
    "네이티브 오디오: 부드러운 물소리, 조용한 아침 방의 룸 톤.",
    duration=4, resolution="480p", aspect_ratio="9:16",
    first_frame_url="https://your-cdn.example/pourover-ref.jpg",
)

다음은 첫 프레임 애니메이션의 실제 결과입니다—우리 seedance-2.0-mini 레시피 라이브러리의 정지 이미지와 그로부터 생성된 클립, 동일한 모델과 요청 구조(이 예시는 16:9)입니다:

구도, 색조, 피사체가 정지 이미지에 고정되며 프롬프트는 모션만 설명하면 됩니다. 클립이 특정 종료 프레임에서 끝나야 한다면 last_frame_url도 있습니다—제품 카드로 되돌아가는 루프에 적합합니다.

일주일 분량 콘텐츠 일괄 제작

/v1/tasks는 비동기이므로 일괄 제작은 모든 작업을 제출한 뒤 폴링하는 것입니다. 클라이언트 측 큐가 필요 없습니다.

briefs = [
    ("mon-hook",  "세로형 클립. 에스프레소가 천천히 추출되는 중, ……"),
    ("tue-loop",  "세로형 심리스 루프 클립. 컵에서 증기가 소용돌이치며 피어오르고, ……"),
    ("wed-recipe","세로형 클립. 탑뷰 핸드드립 브루잉 시퀀스, ……"),
    # ……게시일마다 하나씩
]

tasks = {name: submit(p, duration=6) for name, p in briefs}   # 팬아웃
for name, tid in tasks.items():                                 # 수집
    make = wait(tid)
    url = make["output"][0]["url"]
    open(f"{name}.mp4", "wb").write(requests.get(url, timeout=120).content)

출력 초 단위로 과금되므로 비용 계산은 예측 가능하게 유지됩니다:

시나리오 사양 비용
초안 반복 1회 4초 · 480p 약 $0.11
바로 게시 가능한 클립 1개 6초 · 480p 약 $0.16
클립 7개(일주일, 매일 하나) 7 × 6초 · 480p 약 $1.14
키 비주얼 재렌더링 6초 · 720p 약 $0.35

효과적인 워크플로: 각 아이디어를 480p로 먼저 초안하고, 승자를 보존하여 720p로만 재렌더링하세요. 더 많은 레버(해상도 티어, 길이 트리밍, 배치 스케줄링)는 AI 이미지 및 비디오 API 비용 제어 가이드를 참조하세요.

피드를 위한 프롬프트 팁

테스트 렌더링에서 효과가 있었던, 숏폼에 특화된 방법:

  • "세로형"을 명시하고 그에 맞게 구도하세요. "세로형 숏폼."으로 시작하고 aspect_ratio: "9:16"을 추가하면 잘려나갈 가로형 장면을 프레임에 담는 대신 피사체를 세로 화면 중앙에 배치합니다.
  • 훅을 첫 1초에 두세요. 피드는 첫 1초에 결정합니다—첫 동작이 곧 보상이 되게 하세요(붓기가 이미 진행 중, 증기가 이미 피어오름). 느린 설정 샷은 피하세요.
  • 오디오를 스크립트하세요. "네이티브 오디오: ……"로 구체적인 사운드 2–3개(액체 붓는 소리, 카페 앰비언스)를 나열하면 오디오 트랙이 안정적으로 형성됩니다. 프롬프트하지 않으면 일반적인 룸 톤만 얻습니다.
  • 루프 가능한 클립은 첫/끝 변화를 최소화하세요. 떠다니는 입자, 맥동하는 글로우, 소용돌이치는 증기—稳态 운동을 설명하면 첫/끝 프레임이 루프에 충분히 가까워집니다.

요약

seedance-2.0-mini로 숏폼 제작은 결국 하나의 비동기 엔드포인트, 세 개의 필수 필드, 그리고 반복을 저렴하게 만드는 초 단위 과금으로 귀결됩니다. 세로형 클립을 480p로 초안하면 개당 약 2~3센트, first_frame_url로 제품 샷을 고정하고, 게시 캘린더를 일괄 제출하며, 보존할 것은 720p로 재렌더링하세요. API 키를 발급받고 위의 4초 curl 요청부터 시작하세요—seedance-2.0-mini 모델 페이지에서 파라미터 레퍼런스와 실시간 가격을 확인하며 이어갈 수 있습니다.

영구 AI 아티팩트로 빌드 시작하기

API 키를 받아 태스크 기반의 하나의 API로 이미지, 비디오, 오디오 모델을 호출하세요.

API 문서 보기