Communitygithub.com

zhengshuyuan2023uk/cartoon-audio-short

세로형 애니메이션 카툰 단편을 제작합니다. 10가지 아이디어를 제시하고, 대본을 작성한 후, 사용자의 음성 내레이션을 MP4 영상으로 변환합니다. 음악과 효과음은 음성 레벨의 50%로 믹싱됩니다. 카툰 단편이나 애니메이션 스토리 영상 요청에 사용하세요.

cartoon-audio-short란 무엇인가요?

이 스킬은 사용자의 아이디어나 스크립트를 기반으로 세로형(1080x1920, 30fps) 2D 카툰 스타일 애니메이션 단편을 완전 자동으로 제작합니다. 먼저 10개의 독창적인 영상 아이디어를 제안하고 사용자가 선택하면, 스크립트를 작성한 후 사용자의 음성 녹음을 받아 애니메이션을 생성합니다. 최종 출력은 음악 배경과 효과음이 음성 레벨의 정확히 50%로 믹싱된 MP4 파일입니다. 이 스킬은 Claude Code와 같은 AI 코딩 에이전트에서 실행되도록 설계되었으며, Node.js, Python, FFmpeg, Playwright 등의 의존성을 사용합니다. 전체 파이프라인은 아이디어 생성, 스크립트 작성, 타이밍 분석, 3D 장면 구축(Three.js 기반), 카드 캐릭터 애니메이션, 카메라 움직임, 오디오 믹싱, 최종 렌더링 및 QA를 포함합니다. 사용자는 단순히 아이디어를 말하거나 음성 파일을 업로드하기만 하면 완성된 애니메이션 영상을 받을 수 있어, 콘텐츠 제작자의 생산성을 획기적으로 높여줍니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zhengshuyuan2023uk/muskill/tree/HEAD/cartoon-audio-short

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

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

문서

카툰 단편: 아이디어 → 대본 → 음성 → 완성된 MP4

시각적 스타일: 캔버스에 그려진 '카드' 형태의 납작한 2D 빈 헤드 카툰 캐릭터(매화나무 윤곽선)가 검은 잉크 윤곽선, 칠해진 텍스처, 피사계 심도, 글라이딩 카메라를 갖춘 다채로운 3D 세계 안에 표현됩니다. 출력은 1080x1920, 30fps이며, 길이는 음성 내레이션 길이와 정확히 일치합니다. 사용자의 목소리는 변경되지 않습니다. 배경 음악과 효과음은 합성되며 **음성 레벨의 50%**로 설정됩니다. "떠나지 않은 병사"(19.7초, 8컷)에서 검증되었습니다.

규칙

  • 이야기, 캐릭터, 장면(컷)은 항상 독창적이어야 합니다. 다른 제작자의 영상을 컷 단위로 그대로 재현하지 마십시오. 대신 같은 아이디어에 대한 독창적인 해석을 제시하십시오.
  • 실존하는 유명 인사를 캐릭터로 사용하거나, 브랜드 마스코트나 로고를 등장시키지 마십시오.
  • 사용자가 요청하지 않는 한 자막을 추가하지 마십시오. 내러티브 내 텍스트(새긴 메시지, 표지판 등)는 허용되며, 올바르게 읽혀야 합니다(반전되지 않아야 함).
  • 음성을 편집하거나 타이밍을 재조정하지 마십시오. 영상은 음성에 맞춰지며, 모든 시각적 반응은 해당 단어가 나오기 0~3프레임 전에 이루어져야 합니다.
  • 오디오 레벨: 배경 음악은 음성 레벨의 50%(−6 dB, 게이트 RMS)로 설정됩니다. 효과음은 50% 또는 그보다 약간 낮게 설정되며, 피크가 제한되어 어떤 충격음도 내레이션을 압도하지 않도록 합니다. 항상 mix.py로 믹싱하고, 수동으로 작업하지 마십시오. 이 비율을 변경하는 덕킹이나 압축을 사용하지 마십시오. 전체 믹스에는 하나의 선형 게인과 피크 리미터만 적용됩니다.
  • 작업 목록을 통해 사용자에게 진행 상황을 알리십시오. 긴 렌더링 전에 스틸 이미지 콘택트 시트를 보내십시오.

1단계: 입력 (항상 먼저)

오디오 파일이 이미 첨부되어 있으면 4단계로 건너뜁니다. 대본도 함께 제공된 경우 타이밍에 사용합니다. 그렇지 않으면 AskUserQuestion 하나(또는 해당 도구가 없으면 일반 텍스트)로 질문합니다: "어디서부터 시작하시겠습니까?"

  • 음성 내레이션 준비 완료: 업로드를 요청하고, 대본 텍스트도 있다면 함께 요청합니다(대본이 있으면 타이밍이 정확해집니다). 파일이 도착하면 4단계로 이동합니다.
  • 대본은 있지만 음성 내레이션이 필요합니다: 필요한 경우 3단계에 따라 대본을 다듬고, 녹음 팁과 함께 다시 제공한 후 업로드를 요청하고 4단계로 이동합니다.
  • 영상 아이디어와 대본이 모두 필요합니다: 2단계로 이동합니다. 또한 사용자가 언급하지 않은 경우 대상 길이를 물어보십시오. 기본값은 2030초이며, 4560초도 허용됩니다.

2단계: 10가지 영상 아이디어

정확히 10개의 아이디어를 하나의 답변에 번호를 매겨 제시하고, 사용자에게 번호(또는 "더 보기")로 답변해 달라고 요청하십시오. 각 아이디어에는 다음이 포함됩니다:

  • 제목 (5~8단어, 호기심 유발, 예: "떠나지 않은 병사").
  • 훅 라인: 첫 번째로 말하는 문장, 역설을 사실처럼 진술 ("한 남자가 에펠탑을 팔았습니다. 두 번이나.").
  • 반전 한 줄 (영상의 마지막을 장식하는 아이러니한 결과).
  • 애니메이션에 적합한 이유: 2~3개의 주요 시각적 장면(붕괴, 폭로, 추격).
  • 사실 또는 전설: 이것이 기록된 역사인지, 논쟁의 여지가 있는 이야기인지, 민담인지 명확히 밝히십시오.

이 형식에 "완벽한" 아이디어의 조건:

  • 보여줄 수 있는 물리적 인과 관계가 있는 하나의 놀라운 이야기.
  • 명확한 평범한 인물, 점점 고조되는 갈등, 마지막 대사에 반전.
  • 단순한 3D 형태와 카툰 카드로 구축할 수 있는 배경(마을, 다리, 배, 성, 사막, 연구소, 궁전).
  • 10개의 아이디어를 시대와 주제에 걸쳐 혼합하십시오: 고대, 중세, 1800년대, 현대, 과학, 동물, 발명, 재난, 이상한 법률, 행운의 사고.
  • 사실로 제시되는 내용은 제공하기 전에 웹 검색을 통해 주요 사실을 확인하십시오. 입소문난 전설을 사실로 제시하지 마십시오. 사용자가 그래도 원한다면 "전설에 따르면"이라는 틀을 사용하십시오.
  • 실존 인물을 농담의 대상으로 삼지 말고, 선정적이거나 정치적인 내용은 피하십시오.

3단계: 대본 (선택 후)

내레이션만 작성하고(말하는 텍스트에 무대 지시 없음), 약 3.7단어/초 속도에 맞춥니다: 20초 ≈ 75단어, 30초 ≈ 110, 60초 ≈ 220. 공식:

  1. 훅 (문장 1, 준비 과정 없음): 터무니없는 사실.
  2. 배경 설정 1~2줄: 언제, 어디서, 누가, 구체적인 세부 사항.
  3. 고조, 2~4비트, 각 단계는 더 커짐. 타인은 의심하거나 조롱함. 하나의 과장 농담을 사용하십시오.
  4. 수수께끼 또는 전환: "하지만..." / "사실은," 이라고 시작하여 실제 메커니즘을 소개하며, 종종 일상적인 비유를 사용합니다.
  5. 반전 / 결말: 짧고 아이러니하며 영상의 마지막 단어. 평범한 구어체 영어, 축약형, 8~15단어 정도의 문장, 숫자는 단어로 표기합니다. 시청자가 이미 보고 있는 것을 설명하지 마십시오.

그런 다음 다음을 포함하여 답변하십시오:

  • 복사 가능한 블록 안의 대본, 단어 수와 예상 길이 포함.
  • 한 문단 분량의 시각적 계획(애니메이션할 장면들).
  • 녹음 팁: 안정적이고 따뜻한 나레이터 목소리; ElevenLabs가 잘 작동함(낮은 나레이터 목소리, 속도 약 1.051.1, 안정성 약 4555%). Mp3 또는 wav 파일 가능. 문장 끝에서 자연스러운 멈춤을 남기십시오. 음악 없이 내보내십시오.
  • 요청: "음성 내레이션이 준비되면 업로드해 주세요. 전체 영상을 만들겠습니다." 최종 대본 텍스트를 유지하십시오. 4단계의 타이밍을 결정하므로 음성 인식이 필요하지 않습니다. 사용자가 변경된 버전을 녹음한 경우 최종 텍스트를 요청하십시오.

4단계: 영상 제작 (음성 내레이션 업로드 후)

여기서부터 멈추지 않고 모든 작업을 수행하십시오. 타이밍을 해결할 수 없는 경우에만 질문하십시오.

4.0 키트 가져오기

코드 키트는 이 스킬 폴더 내 kit/에 포함되어 있습니다(엔진, 도구, 작업 예제, 벤더드 three.js r160 및 github.com/mromidev/claude-animated-shorts의 toon.ts Pen 라이브러리, 둘 다 MIT 라이선스). find / -name SKILL.md -path "*cartoon-audio-short*" 2>/dev/null로 폴더를 찾고 해당 kit/을 읽기 전용으로 취급하십시오.

그런 다음 bash <skill>/kit/tools/setup.sh ~/shorts/<slug>을 실행하십시오. 엔진과 도구를 프로젝트에 복사하고, 벤더드 three.js를 설치하며, Node 22 module.stripTypeScriptTypes로 toon.ts에서 타입을 제거하고 Playwright를 연결합니다. 네트워크가 필요하지 않습니다. 벤더드 파일이 없으면 npm 또는 git 클론으로 대체됩니다.

  • 요구 사항: Node 22.6+, numpy와 Pillow가 포함된 Python 3, ffmpeg, Playwright with Chromium (npm i -g playwright && npx playwright install chromium 설치 필요).
  • 패키지 레지스트리가 차단된 경우, 일반적으로 GitHub를 통한 git이 작동합니다. TLS를 비활성화하거나 프록시를 우회하지 마십시오.
  • Chromium: --use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist 플래그와 함께 사전 설치된 Playwright 브라우저를 사용하십시오. 이렇게 하면 CPU WebGL이 프레임당 약 3~10초로 제공됩니다.

4.1 타이밍

python3 timing.py voice.mp3 script.txt --out work 실행.

  • whisper 또는 faster-whisper가 설치된 경우 단어 타임스탬프를 사용합니다.
  • 그렇지 않으면 구두점으로 분할된 대본 구문을 무음 감지 음성 세그먼트에 정렬하며, 음절을 지속 시간과 일치시키고 세그먼트 내 문장 끝과 구문 내 긴 간격에 패널티를 부과하는 DP를 사용합니다.
  • ASR도 대본도 없으면 대본을 요청하십시오. Claude는 오디오를 들을 수 없습니다.
  • work/phrases.json 확인: 멈춤은 문장 끝에 있어야 합니다. 총 프레임 수 = round(지속 시간 × 30).

4.2 컷 계획 (work/PLAN.md 코드 작성 전)

컷당 한 행: 프레임, 단어, 배경, 조명, 카메라 이동, 캐릭터/포즈/표정, 효과 및 SFX 큐.

  • 프레임 0은 이미 훅 이미지입니다.
  • 일반적으로 구문당 하나의 컷입니다. 아주 작은 구문은 다음 컷에 병합합니다.
  • 모든 문장을 문자 그대로 시각화하십시오. 소품이 농담을 전달합니다.
  • 컷 크기 변화: 훅 MCU → 와이드 리빌 → 투샷 → 주요 물체 인서트 클로즈업 → 반응 클로즈업 → 결말을 위한 환경 이동.
  • 비트에 맞게 조명 사용: 평범할 때는 낮, 쇠퇴나 드라마에는 황금빛, 설명에는 밤-파란색. 시간 점프는 6프레임 흰색 플래시.
  • 반전 라인은 스팅(음악 중단, 낮은 히트, 롤과 함께 푸시 인)을 받습니다. 마지막 컷의 물리적 결과는 마지막 단어에 맞춰집니다.

4.3 월드 (web/main.js)

엔진 섹션 유지: toon 재질, 잉크 컨트랙트, add/tbox, 하늘, 조명, 카드, 렌더 타겟/포스트, applyLight, drawActors, swapForNd, renderFrame. // ---------- world ----------와 // ---------- cards ---------- 사이의 예제 월드와 worldState()의 스토리 부분을 교체하십시오.

  • 칠해진 캔버스 텍스처(paint.js: 판자, 빔, 썩은 나무, 돌, 이끼/담쟁이, 잔디, 흙, 회반죽, 기와, 대리석, 배너, 새겨진 텍스트)로 기본 요소를 만드십시오. 같은 평평하고 어두운 이음새 스타일로 새 페인터를 작성하십시오.
  • tbox를 사용하여 일정한 텍셀 밀도, 2단계 toon 그래디언트, 안개 = 수평선 색상을 유지하십시오.
  • 배경: 언덕(반쯤 묻힌 구체), 산(원뿔 + 눈 덮인 뚜껑), 사이프러스/소나무, 먼 집, 칠해진 구름 빌보드.
  • 세트 피스(붕괴, 낙하, 문)는 worldAt(f)의 0..1 진행률에 의해 구동되는 피벗 그룹이며, 부드럽고 지연된 부분이 있습니다.
  • 곡선형 내러티브 텍스트는 평면 UV를 사용합니다. 반전되지 않았는지 확인하십시오.

4.4 캐스트 (web/roman.js → web/toon.js)

  • romanFront(p, outfitKey, opts)는 y=975에 발바닥이 있는 600x1000 디자인 캔버스에 그립니다. 카드 높이는 2.25m이므로 1단위 = 0.00225m입니다.
  • OUTFITS에 의상을 추가하고(튜닉/망토/갑옷/투구/머리/모자/수염/앞치마/드레스/토가) 같은 스타일로 새 머리 장식과 소품을 추가하십시오.
  • 팔 포즈: 매달리기, 창, 가리키기, 위, 흔들기, 엉덩이, 배, 관자놀이(+소용돌이), 들어올리기, 뻗기(+들어올리기), 볼, 방패, 팔짱, 엄지.
  • 표정: toon.ts FACE 세트에 추가로 코골이, 고집, 찡그림. 더 많은 표정을 위해 FACE를 확장하십시오.
  • 수정 후 cat web/toonbase.js web/roman.js > web/toon.js로 재구축하십시오. 새 디자인을 사용하기 전에 캐릭터 테스트 시트를 렌더링하십시오.
  • 빌보드는 요우만 켜고, 접촉 블롭과 알파 테스트 그림자를 얻으며, 월드 패스에 의해 잉크 처리되지 않습니다.
  • q() 반올림 값에서 카드 키를 구축하십시오(캔버스가 보이는 변경 시에만 다시 그려지도록).
  • 분리된 부분(예: 들어올려진 투구)은 자체 카드이며, headCenter(seed)로 정렬됩니다: y = DECK + (partY − hc) × 0.00225.

4.5 모션: 부드럽고 살아있게 (web/motion.js)

  • 카메라: camFromKeys(keys, f, {kicks}). 부드러운 스텝 글라이드(18-45f), 리빌 및 휩에는 easeOut, 곡선 이동에는 via-포인트(캣멀-롬) path 사용. 모든 홀드는 움직임이 있으며 어떤 것도 4프레임 이상 정적이지 않습니다. 드라마에는 3-5° 롤, 충돌에는 7프레임 플립-쉐이크를 사용하십시오.
  • 연속성: 연속적인 움직임 선호(클로즈업에서 와이드로 당기기, 랙 포커스, 데크를 통한 크레인, 객체 안으로 푸시). 장소나 시간 점프에만 하드 컷을 사용하고 플래시를 넣으십시오.
  • 캐릭터는 절대 멈추지 않음: 모든 카드에 idle(f, seed)를 적용하고, blinkAt 깜빡임, 강조된 단어에 머리 끄덕임.
  • 액션: 예상 → back 오버슈트 → spring 안정. 발 구르기는 2프레임 딥 + 먼지 퍼프 + 킥. 웃음은 번갈아 기울이기 + 깡충.
  • 2차 모션: 배너 천 흔들림, 나뭇잎/먼지/물방울/Zzz 효과 카드, 흐르는 물. 항상 무언가 움직입니다.
  • 걷기: walk()는 거리 + 스텝 위상을 제공합니다. 발은 고정, 깡충 3-7%.
  • 렌즈: 클로즈업 및 미디엄에 DOF(cInf 8-14 px), 눈에 초점. 와이드는 선명합니다. 랙은 약 14f.

4.6 룩 체크 (전체 렌더링 전)

각 컷의 중간 지점과 전환 및 주요 액션에서 스틸 렌더링: node render.mjs stills/a "5,40,..." 그런 다음 python3 sheet.py stills/a stills/sheet_a.jpg. 시트를 보고 다음 함정을 수정하십시오:

  • 좁은 세로 프레임: 수평 반 너비 = d·tan(hfov/2), hfov = 2·atan(tan(vfov/2)·0.5625). 4m, fov 40에서 ±0.8m이므로 캐릭터를 깊이로 배치하십시오.
  • 얼굴을 가로지르는 난간이나 기둥(카메라가 난간 안쪽 또는 약 2.5m 위). 집, 지붕, 덤불을 통과하는 카메라 경로. 약 2m 미만의 전경 소품. 기둥 뒤에 숨겨진 주인공.
  • 반전된 텍스트. 분리된 부품 카드가 잘못된 방향으로 오프셋됨.
  • 돌출 재질 그룹: 0 = 캡, 1 = 측면+상단.
  • 잉크 누락: 가장자리 전용 출력 디버그. 잉크 반경 ~1080에서 2.5px. 하늘은 먼 깊이로 간주, 카드가 아님. 시트를 한 줄 컷 요약과 함께 사용자에게 보낸 후 전체 렌더링을 시작하십시오.

4.7 사운드 (audio.py → 스템 → mix.py)

이야기에 맞게 큐 테이블을 다시 작성하십시오; 신디사이저는 그대로 유지됩니다. audio.py는 스템(music.wav, sfx.wav)만 작성합니다.

  • 음악: 짧은 행진곡 스타일 루프(킥/스네어, 플럭 베이스, 브라스 패드). 반전 라인에서 멈추고, 낮은 드론이 계속됩니다.
  • 사건별 SFX(프레임/30): 큰 움직임에 우우슉, 발 구름에 덤벙, 붕괴에 덜컹+충돌, 금속에 긁는 소리, 폭로에 팅, 반전에 스팅, 삐걱, 탁, 철푸덕, 코골이, 나뭇잎, 물 주변 소리.
  • python3 mix.py voice.mp3 music.wav sfx.wav로 믹싱. 음악은 음성의 게이트 RMS의 정확히 50% (−6 dB)로 설정되고, SFX는 50%로 설정되며 피크는 음성 피크의 0.7배로 제한됩니다. 측정된 레벨을 출력합니다: 음성 대비 음악이 −6.0 dB로 표시되고 SFX가 그 이하인지 확인하십시오.
  • 사운드를 만들기 전에 영상 타이밍을 고정하십시오. 타이밍 변경은 audio.py와 mix.py를 다시 실행하는 것을 의미합니다.

4.8 렌더링 + 마무리

  • node render.mjs frames "0-<N-1>"을 Bash run_in_background로 실행하고, 진행 상황을 보고하고 오류나 프로세스 종료를 포착하는 Monitor 루프로 감시하십시오. RESUME=1은 중단 후 계속됩니다. 작은 시스템에서 동시에 무거운 Python을 실행하지 마십시오.
  • bash finish.sh "제목" 실행. 하나의 선형 게인을 약 −14 LUFS에 적용하고 −1 dBFS 피크 리미터를 적용한 다음, H.264 CRF 17 + AAC로 인코딩하고, 프리즈/블랙 및 음량 QA를 실행하여 out/qa_sheet.jpg를 작성합니다. 시트를 확인하십시오. ≥0.4초 동안 얼어붙은 구간이나 검은 프레임은 수정이 필요합니다.
  • MP4를 SendUserFile로 전달하고 각 컷이 무엇을 보여주는지 몇 줄 작성하십시오. 자막, 수정 또는 목록의 다음 아이디어를 제안하십시오.

엔진 주의사항 (키트에 보관됨; 재구축 시 유지)

  • #include <fog_vertex> / <fog_fragment>는 별도 줄에 있어야 합니다.
  • 최종 패스는 linearToOutputTexel(...)을 씁니다(렌더 타겟은 선형 HalfFloat).
  • 법선+깊이 패스는 메시별로 재질을 교체합니다: 월드 → 법선/깊이, 카드 → 알파 테스트 마스크(rgb 0, a = 깊이), 블롭/구름/하늘 숨김, 물 → 평면 법선. 안개와 그림자는 이 중에 꺼집니다.
  • 잉크는 깊이 점프의 가까운 쪽에만 갑니다. 주름은 법선 내적에서 비롯됩니다. 카드 이웃은 건너뜁니다. 잉크는 약 140-520m에서 페이드됩니다.
  • DOF: 샘플당 CoC 테스트가 있는 48탭(전경 블리드 없음).
  • 태양은 조명 사전 설정당 az/el에서 옵니다. 그림자 카메라는 각 컷의 액션에 중심을 둡니다.

아키텍처 (키트 편집 참고용)

  • web/index.html은 로컬 HTTP 서버를 통해 main.js(ES 모듈)를 로드합니다.
  • ...

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬