툰 스튜디오은(는) 무엇을 하나요?
JSON 스크립트로부터 믹싱된 MP4 카툰 영화를 제작하는 단일 파일 Python 파이프라인(studio.py, stdlib + elevenlabs SDK만 사용)입니다. Windows, macOS, Linux에서 실행됩니다. GPU가 필요 없으며, 사용자가 제공하는 API 키 외에 별도 계정이 필요하지 않습니다.
설정 (머신당 한 번만 수행)
- Python 3.10+.
pip install elevenlabs imageio-ffmpeg(ffmpeg 바이너리는 imageio-ffmpeg에 포함되어 제공됨; 원할 경우FFMPEG환경 변수로 재정의 가능)..env.example을.env로 복사하고 다음 항목을 입력:KIE_API_KEY(필수) - https://kie.ai에서 발급 - 이미지, 비디오 및 음악 생성을 담당.ELEVENLABS_API_KEY(권장) - https://elevenlabs.io에서 발급 - 직접 음성 생성. KIE는 ElevenLabs TTS를 재판매하기도 하지만 해당 엔드포인트에 반복적인 장애가 발생함; 기본 스토리는 음성 라우팅을 직접 백엔드로 설정함.- 모델 선택은 2026년 11월 측정 기준 예산/품질 최적 지점을 기본값으로 함:
qwen3/pro-text-to-image(스틸컷, 약 6.4 크레딧),minimax-h3/image-to-video(클립, 6초당 약 48 크레딧), SunoV4_5(배경 음악). 모든 KIE 모델 ID는KIE_IMAGE_MODEL/KIE_VIDEO_MODEL/KIE_MUSIC_MODEL을 통해 대체 가능.
워크플로우
- 스크립트.
story.json작성 (예제:examples/moodcast-eva/story.json및studio.py헤더 독스트링 참조): 제목, 스타일, 캐릭터(이름, 디자인, 음성 설명, 실사 인물을 카툰화할 선택적photo, 선택적 ElevenLabsvoice_id), 장면(설명, 모션, 지속 시간 4-15초, 화자와 대사), music_prompt. 또는 LLM을 사용해 초안 작성:python studio.py new "황금 열쇠를 찾은 새끼 고양이 기사" --scenes 3 --out story.json - 빌드.
python studio.py build story.json --outdir my-film단계: 캐릭터 레퍼런스 -> 스토리보드 스틸컷 -> 애니메이션 -> 보이스오버 -> 음악 + 믹싱. 모든 단계는 캐싱됨; 재실행 시 누락된 부분만 생성. - 감독 모드 (선택 사항, 권장).
--director를 추가하여 스토리보드 스틸컷 후에 일시 중지: 각 이미지를 보고 승인하거나, 노트와 함께 재생성(r wider shot)하거나, 애니메이션 크레딧이 소모되기 전에 자신의 이미지로 교체(s path.png) 가능. 대화형 stdin이 없는 에이전트에서는 폴더 프로토콜을 대신 사용:build --stop-after stills실행, outdir에서sceneN.png를 검토/덮어쓰기(또는python studio.py regen story.json --outdir DIR <장면번호> "감독 노트"실행), 그런 다음 동일한 빌드를 다시 실행. - 프로듀서 모드 (선택 사항).
--producer를 추가하여 조립 후 수정 루프 사용:r 2는 장면 2의 클립을 재렌더링,v 2 1은 장면 2의 대사 1을 다시 녹음,m 0.2는 더 큰 음악 볼륨으로 리믹스,a는 승인. - 사전 확인 (크레딧 소모 없음).
python studio.py check story.json은 스키마를 검증하고, 장면당 예상 음성 시간을 보고하며(추정 음성 초 vs 장면 창), 누락된 단계의 KIE 크레딧 비용과 현재 잔액을 견적하여 지출 전에 승인받을 수 있도록 함. - 캐스트 승인 (저렴).
python studio.py preview story.json은 각 고유 음성의 첫 대사를preview_<speaker>.mp3로 렌더링하여 비디오 크레딧이 소모되기 전에 사용자가 음성을 승인할 수 있도록 함.
모든 빌드는 MP4 옆에 <film>.srt도 작성합니다 - 영화 타임라인에서 각 대사의 정확한 위치를 포함하는 자막 사이드카 파일이며, 기본적으로 비디오에 자막을 하드코딩합니다(흰색 텍스트에 어두운 외곽선, 하단 1/3 위치; build --no-captions로 비활성화하거나 studio.py의 CAPTION_STYLE로 스타일 변경 가능).
하드 원(hard-won) 모델 정보 (재발견하지 마세요)
- KIE 태스크 API:
POST {KIE_BASE_URL}/api/v1/jobs/createTaskwith{"model", "input": {...}},GET /api/v1/jobs/recordInfo?taskId=...폴링; 성공 =successFlag == 1; 결과는data.response.resultUrls[0]에 있음. 로컬 파일 업로드는https://kieai.redpandaai.co/api/file-base64-upload(JSON base64)로, api.kie.ai가 아님. - 레퍼런스 이미지: nano-banana 계열은
image_input(URL 목록)을 읽음;image_urls필드는 자동으로 무시되며 잘못된 캐릭터를 생성함. - MiniMax H3 (
minimax-h3/image-to-video): 입력은first_frame_url, 정수 지속 시간 4-15, 해상도768P또는2K를 사용. 이 모델은 고유의 사운드트랙을 자체 생성함 - 종종 보컬이 포함된 전체 음악 - 스튜디오는 기본적으로 이를 음소거 처리함(AMB_VOL = 0.0in studio.py). 깨끗한 사운드 이펙트로 확인된 렌더링에 대해서만 볼륨을 높이세요. - Hailuo (
hailuo/2-3-image-to-video-pro):image_url, 문자열 지속 시간 ("6"/"10"), 해상도768P/1080P. - Seedance (
bytedance/seedance-2-fast):first_frame_url, 정수 지속 시간,generate_audio: false. - KIE를 통한 Suno 음악:
POST /api/v1/generate(플레이스홀더callBackUrl필수;GET /api/v1/generate/record-info?taskId=...폴링하여status == SUCCESS확인, 오디오는response.sunoData[0].audioUrl에 있음). - 모든 모션 프롬프트에는 두 가지 하드 규칙(studio.py의 상수
NO_SPEAK,AUDIO_FX)이 적용됨: 캐릭터는 절대 입술을 움직이지 않음(오프스크린 대사는 그렇지 않으면 깨진 립싱크로 읽힘) 그리고 클립 사운드트랙에 음악이나 음성이 없음.
백엔드
story.json의 "backends"는 각 프리미티브를 독립적으로 라우팅함: {"image": "kie", "video": "kie", "voice": "elevenlabs", "music": "kie"}. 사용 가능: kie (이미지/비디오/음악/음성), elevenlabs (음성 전용, 직접 API), higgsfield (대체 CLI 백엔드). TOON_BACKEND 또는 story의 backend가 달리 명시하지 않는 한 모든 항목의 기본값은 higgsfield입니다.
비용 투명성 (KIE 기준, 2026년 11월 측정)
| 모델 | 비용 | 비고 |
|---|---|---|
| qwen3/pro-text-to-image | 약 6.4 크레딧/이미지 | 1344x768, 레퍼런스 작동, 약 60초 |
| z-image | 약 0.8 크레딧/이미지 | 더 저렴, 낮은 품질 |
| nano-banana-pro | 약 18 크레딧/이미지 | 프리미엄 품질 |
| minimax-h3/image-to-video | 6초당 약 48-56 크레딧 | 빠름 (약 90초), 자체 오디오 생성 |
| hailuo/2-3 i2v pro | 6초당 약 45 크레딧 | 약 130초 |
| seedance-2-fast | 6초당 약 148.8 크레딧 | 프리미엄 모션 |
| Suno V4_5 | 약 24 크레딧/곡 | 전체 곡, 믹싱에서 트리밍 |
ElevenLabs 음성: 요금제에 따라 다름 (예: eleven_v4 ~ 한 줄에 수백 자). KIE 잔액 확인은 GET /api/v1/chat/credit; 빌드는 실행 후 남은 크레딧을 출력합니다.
문제 해결
- 캐릭터가 잘못 보이거나 레퍼런스를 무시함: 레퍼런스가 실제로 업로드되었는지 확인(로그에 태스크 ID 표시); nano-banana는
image_urls가 아닌image_input이 필요함. - 영화에 추가 음악이나 음성이 나타남: H3 또는 유사 모델의 클립 레벨 사운드트랍 -
AMB_VOL = 0.0유지하거나 클립을 재렌더링(비결정적임). - 내레이션 위로 입술 움직임: NO_SPEAK 규칙이 일반적으로 적용됨; 하나의 클립이 통과되면 해당
clipN.mp4를 삭제하고 빌드를 재실행(새 렌더링이 일반적으로 준수함)하거나--producer와 노트를 사용하여 재렌더링. - KIE 음성 태스크가 500 오류로 실패함:
voice를elevenlabs(직접)로 라우팅. - 빌드 중간에 생성이 실패함: 동일한 명령을 다시 실행하기만 하면 됨; 완료된 단계는 재사용되고 누락된 에셋만 다시 생성됨.