카툰 단편: 아이디어 → 대본 → 음성 해설 → 완성된 MP4
비주얼 스타일: 자두색 윤곽선이 있는 캔버스에 그린 '카드' 형태의 납작한 2D 빈대 머리 카툰 캐릭터가 검은 잉크 윤곽선, 채색된 질감, 피사계 심도, 부드러운 카메라 움직임이 있는 다채로운 3D 세계에 등장합니다. 출력물은 1080x1920, 30fps이며, 음성 해설 길이와 정확히 일치합니다. 사용자 음성은 변경되지 않습니다. 배경 음악과 음향 효과는 합성됩니다: 음악은 음성 대비 16 dB 아래, 음향 효과는 음성 레벨의 50 % 이하입니다. "떠나지 않은 군인"(19.7초, 8컷)에서 검증되었습니다.
이 스킬이 채팅에 파일로 도착한 경우
사용자가 SKILL.md와 cartoon-short-kit.zip을 보내며 "이 스킬을 읽고, 설치하고, 사용하세요" (اقرأ هذه المهارة، وثبّتها، واستخدمها)라고 말할 수 있습니다. 그런 다음:
- 이 전체 파일을 읽고 따르세요. 스킬이 무엇인지 설명하지 말고 설정 질문도 하지 마세요.
- 킷을 쓰기 가능한 폴더에 압축을 풉니다(4.0 참조).
engine/main.js와vendor/three.module.js가 있는지 확인하세요. - 이 환경에 개인 스킬 폴더(예:
~/.claude/skills/)가 있으면,SKILL.md와 킷을 그 안에 있는cartoon-audio-short/에 복사하세요. 없으면, 영구 설치되었다고 말하지 말고 한 줄로 이 채팅에서만 사용 가능하며 새 채팅에서 두 파일을 다시 보내야 한다고 말하세요. - 짧은 한 줄로 답변하고 바로 1단계로 이동하세요.
언어: 아랍어 또는 영어
- 채팅: 첫 번째 답변부터 사용자 메시지의 언어로 답변하세요. 사용자가 아랍어로 쓰거나 아랍어를 요청하면, 모든 메시지(질문, 옵션 레이블 및 설명, 작업 목록, 아이디어, 진행 노트, 오류, 전달 노트)는 아랍어입니다. 일상적인 쉬운 단어를 사용하고, 사용자가 특정 방언을 쓰면 그에 맞추세요. 영어는 파일 이름과 명령어에만 사용하며, 오른쪽에서 왼쪽으로 쓰는 텍스트가 뒤섞이지 않도록 자체 줄에 표시하세요.
- 대본: 대본의 언어는 특별한 요청이 없으면 채팅 언어를 따릅니다. 질문에 "أريد أفكار بالعربي"라고 입력하면 2단계(아랍어)로 진행됩니다.
- 아랍어 변종: 사용자가 방언(이라크어, 이집트어, 걸프어, 레반트어 등)을 쓰거나 요청하지 않는 한 간단한 표준 아랍어로 작성하세요. 묻지 말고 진행하세요. 대본 답변 끝에 한 줄을 추가하세요: "تريده بلهجة ثانية؟ اكتب اللهجة وسأعيد كتابته." 사용자가 요청하지 않는 한 하나의 대본에 표준어와 방언을 섞지 마세요.
- 아랍어 고정 질문. 다음 표현을 사용하세요:
- "من أين نبدأ؟"
- "الصوت جاهز": 오디오 파일을 업로드하고, 텍스트가 있으면 함께 보내주세요. 제가 비디오를 만들겠습니다.
- "عندي نص": 제가 다듬고 녹음 팁을 드린 후, 오디오를 업로드하면 비디오를 만들겠습니다.
- "أحتاج إلى أفكار ونص": 10가지 독창적인 아이디어를 제안하고, 선택한 아이디어에 대한 대본을 작성하겠습니다.
- "كم مدة الفيديو؟"
- "من 20 إلى 30 ثانية (مُوصى به)": 약 40~60단어.
- "من 30 إلى 45 ثانية": 약 60~90단어.
- "من 45 إلى 60 ثانية": 약 90~120단어.
- "من أين نبدأ؟"
규칙
- 이야기, 캐릭터, 장면은 항상 독창적이어야 합니다. 다른 제작자의 비디오를 컷 단위로 재현하지 마세요. 대신 같은 아이디어에 대한 독창적인 해석을 제공하세요.
- 실존하는 유명 인물을 캐릭터로 사용하지 말고, 브랜드 마스코트나 로고도 사용하지 마세요.
- 사용자가 요청하지 않는 한 자막을 추가하지 마세요. 이야기 속 텍스트(새겨진 메시지, 간판)는 괜찮으며, 올바르게 읽혀야 합니다(반전되지 않아야 함). 간판, 레이블, 제목은 대본 언어를 사용합니다: 아랍어 비디오에는 "SOLD" 대신 "بِيعَ"를 사용하세요. 4.3에 설명된 대로 그리세요.
- 음성을 편집하거나 타이밍을 변경하지 마세요. 그림은 음성에 맞춰지며, 모든 시각적 반응은 해당 단어보다 0~3프레임 먼저 나타납니다.
- 오디오 레벨: 배경 음악은 음성 대비 16dB 아래에 위치합니다(게이트 적용 RMS). 음향 효과는 50% 또는 약간 더 낮게 설정하며, 피크가 음성을 넘지 않도록 제한합니다. 항상
mix.py로 믹싱하고, 수동으로 하지 마세요. 이 비율을 변경할 수 있는 덕킹이나 압축을 사용하지 마세요. 전체 믹스에는 하나의 선형 게인과 피크 리미터만 적용됩니다. - 진행 상황을 작업 목록으로 사용자에게 알리세요. 긴 렌더링 전에 스틸 컷 연락처 시트를 보내세요.
1단계: 접수 (항상 먼저)
오디오 파일이 이미 첨부되어 있으면 4단계로 건너뛰세요. 대본도 함께 제공된 경우 타이밍에 사용하세요. 그렇지 않으면 AskUserQuestion(또는 해당 도구가 없으면 일반 텍스트) 한 개를 물어보세요: "어디서부터 시작하시겠습니까?"
- 음성 해설 준비 완료: 사용자에게 업로드하도록 요청하고, 대본 텍스트도 있으면 함께 보내달라고 하세요(대본이 있으면 타이밍이 정확해집니다). 도착하면 4단계로 이동하세요.
- 대본은 있고 음성 해설이 필요합니다: 필요한 경우 3단계에 따라 대본을 다듬고, 녹음 팁과 함께 반환한 후 업로드를 요청하고 4단계로 이동하세요.
- 비디오 아이디어와 대본이 필요합니다: 2단계로 이동하세요.
또한 대상 길이를 아직 말하지 않았다면 물어보세요. 기본값은 20
30초이며, 4560초도 허용됩니다. 아랍어 채팅에서는 언어 섹션의 표현을 사용하세요.
2단계: 10가지 비디오 아이디어
정확히 10가지 아이디어를 한 번의 답변에 번호를 매겨 제시하고, 사용자에게 번호(또는 "more")로 답변하도록 요청하세요. 각 아이디어에는 다음이 포함됩니다:
- 제목 (5~8단어, 호기심을 자극하는, 예: "떠나지 않은 군인").
- 후크 라인: 첫 번째 말하는 문장, 역설을 사실처럼 진술 ("한 남자가 에펠탑을 팔았습니다. 두 번이나.").
- 반전 한 줄 (비디오를 끝내는 아이러니한 결말).
- 애니메이션에 적합한 이유: 2~3개의 큰 시각적 순간 (붕괴, 폭로, 추격).
- 사실 또는 전설: 문서화된 역사인지, 논쟁이 있는 기록인지, 민담인지 명확히 말하세요.
이 형식에 "완벽한" 아이디어의 특징:
- 물리적 원인과 결과를 보여줄 수 있는 하나의 놀라운 이야기.
- 명확한 평범한 인물, 점층되는 갈등, 마지막 줄의 반전.
- 간단한 3D 모양과 카툰 카드(마을, 다리, 배, 성, 사막, 연구실, 궁전)로 만들 수 있는 배경.
- 10개를 시대와 주제별로 섞으세요: 고대, 중세, 1800년대, 현대, 과학, 동물, 발명, 재난, 이상한 법칙, 행운의 사고.
- 사실로 제시되는 내용은 웹 검색을 통해 주요 사실을 확인하세요. 입소문난 전설을 사실로 제시하지 마세요. 사용자가 그래도 원하면 "전설에 따르면"이라고 표현하세요.
- 실존 인물을 농담의 대상으로 삼지 말고, 폭력적이거나 정치적인 내용은 금지합니다.
아랍어 아이디어의 경우:
- 제목, 후크, 반전, 메모를 아랍어로 작성하세요. 후크는 번역이 아닌 자연스러운 아랍어 문장으로 작성하세요. 외국 이름은 일반적인 아랍어 철자를 사용하세요.
- 아랍 및 이슬람 역사와 과학 이야기를 세계 이야기와 섞어서 목록이 이 관객을 위해 만들어진 느낌이 들게 하세요.
- 영어뿐만 아니라 아랍어로도 검색하세요. 인기 있는 아랍어 이야기도 출처 없이 퍼지는 경우가 많으므로 같은 방식으로 사실 또는 전설로 표시하세요.
- 예언자, 그들의 동료 또는 기타 신성한 인물을 캐릭터로 절대 보여주지 마세요. 종교, 종파, 부족 또는 국적에 대해 농담하지 마세요.
3단계: 대본 (선택 후)
내레이션만 작성하세요(말하는 텍스트에 무대 지시 없음). 영어는 약 3.7단어/초로 측정됩니다: 20초 ≈ 75단어, 30초 ≈ 110단어, 60초 ≈ 220단어. 아랍어는 더 느려서 약 2단어/초입니다: 20초 ≈ 40단어, 30초 ≈ 60단어, 60초 ≈ 120단어. 아랍어 단어는 더 많은 음절을 가지며, 실제 아랍어 음성은 1.6~2.1단어/초로 측정되었습니다. 공식:
- 후크 (문장 1, 설정 없음): 터무니없는 사실.
- 설정 1~2줄: 언제, 어디서, 누가, 구체적인 세부 사항.
- 고조, 2~4비트, 각각 더 커짐. 다른 사람들은 의심하거나 비웃음. 과장 농담을 한 번 사용하세요.
- 미스터리 또는 전환: "하지만..." / "사실은..." 실제 메커니즘을 소개하며, 종종 일상적인 비유와 함께.
- 반전 / 결말: 짧고 아이러니하며 비디오의 마지막 단어. 평범한 구어체 영어, 축약형, 8~15단어 정도의 문장, 숫자는 단어로 표기하세요. 시청자가 이미 보는 것을 설명하지 마세요.
아랍어 대본의 경우:
- 문장을 약 6~12단어로 유지하고, 동일한 5부분 공식을 사용하세요. "لكن عندما…" 및 "والسبب؟"와 같은 전환 표현이 잘 작동합니다.
- 숫자와 연도를 단어(ألف وتسعمئة وأربعة وتسعون)로 쓰고, 외국어 단어와 브랜드 이름은 아랍어 문자로 표기하여 음성이 올바르게 읽을 수 있게 하세요.
- 음성을 위한 구두점: "،"와 "."는 호흡, "…"는 폭로 전의 멈춤, "؟"는 질문. 타이밍도 이 구두점을 사용합니다.
- 음성 생성기에 붙여넣을 준비가 된 복사 가능한 음성 블록을 하나 제공하세요:
- 모든 단어에 Tashkeel을 사용하세요. 특히 이름과 읽기가 여러 개인 단어에 유용합니다. 내레이터가 말하지 않을 어미는 생략하고, 방언은 말하는 대로 작성하세요. Tashkeel을 요청하지 않거나 어색하면 제거하세요.
- 영어의 Eleven v3에 대한 오디오 태그(예: [exited], [curious], [serious], [whispers], [warmly]). 문장 그룹당 최대 1~2개만 사용하고, 단어가 정당화할 때만 사용하세요.
- 이라크어 "g": 말소리에 필요한 곳에 گ와 چ를 쓰세요(تِگْدَر, لْگِيت). ك는 "k"로 읽히기 때문입니다.
- 부분: 약 700자를 초과하는 대본의 경우, 문장 끝에서 번호가 매겨진 부분으로 나누세요.
- 단어 수와 길이는 위의 아랍어 비율을 사용하고, 태그와 Tashkeel은 무시합니다.
그런 다음 답변:
- 단어 수와 예상 길이가 포함된 복사 가능한 블록의 대본.
- 한 단락 분량의 시각적 계획(애니메이션할 장면들).
- 녹음 팁: 안정적이고 따뜻한 내레이터 목소리 하나; ElevenLabs가 잘 작동합니다(깊은 내레이터 목소리, 속도 약 1.05
1.1, 안정성 약 4555%). Mp3 또는 wav 파일이 좋습니다. 문장 끝에 자연스러운 멈춤을 두세요. 음악 없이 내보내세요. - 아랍어 녹음 팁: Eleven v3를 사용하세요. 이전 모델은 [tags]를 소리내어 읽기 때문입니다. Stability를 Natural로, 속도를 약 0.95로 시작하고, 모든 것을 생성하기 전에 첫 번째 문장을 시도해보세요. 다른 생성기를 사용하는 경우 먼저 태그를 삭제하세요. 자신의 목소리도 괜찮으며, 태그나 Tashkeel 없이 사용하세요.
- 요청: "음성 해설이 준비되면 업로드하면 전체 비디오를 만들겠습니다." 최종 대본 텍스트를 보관하세요. 4단계의 타이밍을 결정하므로 음성 인식이 필요하지 않습니다. 변경된 버전을 녹음한 경우 최종 텍스트를 요청하세요.
4단계: 비디오 제작 (음성 해설 업로드 후)
여기서부터 멈추지 않고 모든 작업을 수행하세요. 타이밍을 해결할 수 없는 경우에만 질문하세요.
4.0 킷 가져오기
코드 킷에는 엔진, 도구, 작업 예제, 번들된 three.js r160, github.com/mromidev/claude-animated-shorts의 toon.ts Pen 라이브러리(둘 다 MIT), Lalezar 아랍어 글꼴(SIL OFL)이 포함되어 있습니다. 다음 순서로 찾고 읽기 전용으로 취급하세요:
- 이
SKILL.md옆에 있는kit/폴더.find / -name SKILL.md -path "*cartoon-audio-short*" 2>/dev/null로 찾으세요. - 이미 압축이 풀린
cartoon-short-kit폴더. - 이 채팅에서 보낸 파일 중
cartoon-short-kit.zip:find / -name "cartoon-short-kit*.zip" 2>/dev/null로 찾은 다음,~/cartoon-short-kit-src/에 압축을 푸세요. 킷은engine/을 포함하는 내부 폴더입니다.
그런 다음 bash <kit>/tools/setup.sh ~/shorts/<slug>를 실행하세요. 엔진과 도구를 프로젝트에 복사하고, 번들된 three.js를 설치하며, Node 22의 module.stripTypeScriptTypes를 사용하여 toon.ts에서 타입을 제거하고, Playwright를 연결합니다. 네트워크가 필요하지 않습니다. 번들된 파일이 없으면 npm 또는 git clone으로 대체됩니다.
- 요구 사항: Node 22.6+, Python 3(numpy + Pillow 포함), ffmpeg, Playwright(Chromium 포함)(
npm i -g playwright && npx playwright install chromium이 없으면 실행). - 패키지 레지스트리가 차단된 경우 GitHub를 통한 git이 일반적으로 작동합니다. TLS를 비활성화하거나 프록시를 우회하지 마세요.
- Chromium: 사전 설치된 Playwright 브라우저를
--use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist와 함께 사용하세요. CPU WebGL을 프레임당 약 3~10초로 제공합니다.
4.1 타이밍
python3 timing.py voice.mp3 script.txt --out work를 실행하세요. 대본이 없으면 --lang ar을 추가하세요(아랍어). 대본은 정확한 음성 블록일 수 있습니다: [tags]와 Tashkeel을 제거하고 아랍어 구두점에서도 구문을 분할합니다.
- Whisper 또는 faster-whisper가 설치되어 있으면 단어 타임스탬프를 사용합니다. 아랍어의 경우 다국어 모델을 사용하고 대본 자체의 단어를 유지하므로 잘못 들은 방언 단어가 텍스트를 변경할 수 없습니다.
- 그렇지 않으면 구두점에서 분할된 대본 구문을 무음 감지 음성 세그먼트에 정렬하며, 음절을 지속 시간에 일치시키고 세그먼트 내 문장 끝과 구문 내 긴 간격에 페널티를 주는 DP를 사용합니다.
- ASR도 대본도 없으면 대본을 요청하세요. Claude는 오디오를 들을 수 없습니다.
work/phrases.json을 확인하세요: 멈춤이 문장 끝에 있어야 합니다. 총 프레임 수 = round(duration × 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: 판자, 들보, 썩은 나무, 돌, 이끼/담쟁이, 풀, 흙, 회반죽, 기와, 대리석, 깃발, 새겨진 텍스트)가 있는 기본 요소로 구축하세요. 동일한 납작하고 어두운 이음새 스타일로 새 페인터를 작성하세요. - 일정한 텍셀 밀도, 2단계 toon 그래디언트, 안개 = 지평선 색상을 위해
tbox를 사용하세요. - 배경: 언덕(반쯤 묻힌 구체), 산(원뿔 + 눈 덮개), 사이프러스/소나무, 먼 집, 채색된 구름 빌보드.
- 세트 피스(붕괴, 낙하, 문)는
worldAt(f)의 0..1 진행률에 의해 구동되고, 완화되고 지연된 부분이 있는 피봇 그룹입니다. - 곡선형 이야기 속 텍스트는 평면 UV를 사용합니다. 반전되지 않았는지 확인하세요.
- 모든 것에 대한 아랍어 텍스트: 간판과 태그에는
P.signCanvas(text, opts)와P.tex(), 자신의 캔버스에는P.drawText(), 조각에는P.carvedText()를 사용하세요. 번들된 글꼴을 로드하고, 오른쪽에서 왼쪽으로 설정하며, 전체 문자열을 그립니다. 아랍어 문자를 하나씩 그리지 마세요.