Communitygithub.com

툰 스튜디오

단일 명령어로 AI 애니메이션 영화를 제작하는 파이프라인입니다. story.json 스크립트를 캐릭터 레퍼런스, 스토리보드 스틸컷, 애니메이션 클립, 보이스오버, 음악이 포함된 완전히 믹싱된 애니메이션 단편 영화로 변환합니다. 사용자 자신의 KIE.ai 및 (선택적으로) ElevenLabs API 키를 사용합니다. 사용자가 AI 모델로 애니메이션 카툰 비디오, 설명 영상, 스토리 또는 광고를 만들거나 그 일부를 수정/재렌더링하려 할 때 사용합니다.

툰 스튜디오란 무엇인가요?

툰 스튜디오(Toon Studio)는 단일 Python 파일(`studio.py`, stdlib + `elevenlabs` SDK만 사용)로 구성된 AI 애니메이션 영화 제작 파이프라인입니다. JSON 스크립트(`story.json`)를 입력받아 캐릭터 레퍼런스 생성, 스토리보드 스틸컷 제작, 애니메이션 클립 생성, 보이스오버(TTS), 배경 음악 제작 및 최종 믹싱까지 전 과정을 자동화합니다. Windows, macOS, Linux에서 GPU 없이 실행 가능하며, 사용자가 제공한 API 키(KIE.ai 필수, ElevenLabs 권장)만으로 작동합니다. 이 도구는 Claude Code, Cursor, Codex, Windsurf, Goose, HUGS 등 모든 AI 코딩 에이전트에서 사용 가능하도록 설계되었습니다. 주요 기능으로는 `build` 명령어를 통한 전체 파이프라인 실행, `--director` 플래그를 통한 스토리보드 단계에서의 수동 개입, `--producer` 플래그를 통한 사후 수정 루프, `check` 명령어를 통한 크레딧 비용 사전 확인, `preview` 명령어를 통한 음성 미리 듣기 등이 있습니다. 각 단계는 캐싱되어 있어 재실행 시 누락된 부분만 생성합니다. 파이프라인은 백엔드 시스템에 독립적이며, story.json의 `backends` 설정을 통해 이미지, 비디오, 음성, 음악 생성에 각각 다른 백엔드를 지정할 수 있습니다(KIE, ElevenLabs, Higgsfield 지원). 최종 출력은 MP4 비디오와 SRT 자막 파일이며, 자막은 기본적으로 비디오에 하드코딩됩니다. 사용자는 `--no-captions` 옵션으로 자막을 비활성화하거나 `CAPTION_STYLE` 변수로 스타일을 변경할 수 있습니다. 또한 이 도구는 각 AI 모델(KIE의 qwen3, miniMax H3, Hailuo, Seedance, Suno 등)의 실제 사용 경험을 바탕으로 한 '하드 원(hard-won) 모델 정보'를 제공하여 API 호출 방식, 제약 사항, 비용 등을 상세히 문서화하고 있습니다. 예를 들어 nano-banana 모델은 `image_input` 필드를 사용해야 하며 `image_urls` 필드는 무시된다는 점, MiniMax H3는 자체 사운드트랙을 생성하므로 기본적으로 음소거 처리된다는 점 등의 중요한 구현 세부 사항을 포함하고 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aroga2/toon-studio/tree/main

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

툰 스튜디오은(는) 무엇을 하나요?

JSON 스크립트로부터 믹싱된 MP4 카툰 영화를 제작하는 단일 파일 Python 파이프라인(studio.py, stdlib + elevenlabs SDK만 사용)입니다. Windows, macOS, Linux에서 실행됩니다. GPU가 필요 없으며, 사용자가 제공하는 API 키 외에 별도 계정이 필요하지 않습니다.

설정 (머신당 한 번만 수행)

  1. Python 3.10+.
  2. pip install elevenlabs imageio-ffmpeg (ffmpeg 바이너리는 imageio-ffmpeg에 포함되어 제공됨; 원할 경우 FFMPEG 환경 변수로 재정의 가능).
  3. .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 크레딧), Suno V4_5 (배경 음악). 모든 KIE 모델 ID는 KIE_IMAGE_MODEL / KIE_VIDEO_MODEL / KIE_MUSIC_MODEL을 통해 대체 가능.

워크플로우

  1. 스크립트. story.json 작성 (예제: examples/moodcast-eva/story.json 및 studio.py 헤더 독스트링 참조): 제목, 스타일, 캐릭터(이름, 디자인, 음성 설명, 실사 인물을 카툰화할 선택적 photo, 선택적 ElevenLabs voice_id), 장면(설명, 모션, 지속 시간 4-15초, 화자와 대사), music_prompt. 또는 LLM을 사용해 초안 작성: python studio.py new "황금 열쇠를 찾은 새끼 고양이 기사" --scenes 3 --out story.json
  2. 빌드. python studio.py build story.json --outdir my-film 단계: 캐릭터 레퍼런스 -> 스토리보드 스틸컷 -> 애니메이션 -> 보이스오버 -> 음악 + 믹싱. 모든 단계는 캐싱됨; 재실행 시 누락된 부분만 생성.
  3. 감독 모드 (선택 사항, 권장). --director를 추가하여 스토리보드 스틸컷 후에 일시 중지: 각 이미지를 보고 승인하거나, 노트와 함께 재생성(r wider shot)하거나, 애니메이션 크레딧이 소모되기 전에 자신의 이미지로 교체(s path.png) 가능. 대화형 stdin이 없는 에이전트에서는 폴더 프로토콜을 대신 사용: build --stop-after stills 실행, outdir에서 sceneN.png를 검토/덮어쓰기(또는 python studio.py regen story.json --outdir DIR <장면번호> "감독 노트" 실행), 그런 다음 동일한 빌드를 다시 실행.
  4. 프로듀서 모드 (선택 사항). --producer를 추가하여 조립 후 수정 루프 사용: r 2는 장면 2의 클립을 재렌더링, v 2 1은 장면 2의 대사 1을 다시 녹음, m 0.2는 더 큰 음악 볼륨으로 리믹스, a는 승인.
  5. 사전 확인 (크레딧 소모 없음). python studio.py check story.json은 스키마를 검증하고, 장면당 예상 음성 시간을 보고하며(추정 음성 초 vs 장면 창), 누락된 단계의 KIE 크레딧 비용과 현재 잔액을 견적하여 지출 전에 승인받을 수 있도록 함.
  6. 캐스트 승인 (저렴). 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/createTask with {"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.0 in 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-video6초당 약 48-56 크레딧빠름 (약 90초), 자체 오디오 생성
hailuo/2-3 i2v pro6초당 약 45 크레딧약 130초
seedance-2-fast6초당 약 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 (직접)로 라우팅.
  • 빌드 중간에 생성이 실패함: 동일한 명령을 다시 실행하기만 하면 됨; 완료된 단계는 재사용되고 누락된 에셋만 다시 생성됨.

관련 스킬