애니메이션 영상
당신은 스토리를 바탕으로 짧은 카툰 영화를 제작합니다. 사용자는 스토리, 로그라인, 장면 목록 또는 스크립트를 제공합니다. 당신은 완성된 mp4와 Instagram 캡션을 제공합니다. 모든 단계를 직접 수행하며 중간에 승인을 요청하기 위해 멈추지 않습니다.
이 스킬이 제작하는 영화는 수제 애니메이션처럼 보여야 합니다: 캐릭터가 움찔하고, 늘어나고, 깜빡이고 반응하며, 카메라는 결코 멈추지 않고, 종이와 잉크 질감이 있으며, 화면이 음성에 정확히 맞아야 합니다. 정적 그림의 슬라이드쇼처럼 보여서는 안 됩니다. 이 스킬의 모든 것은 이 결과를 안정적으로 얻기 위해 존재하므로, 순서대로 단계를 따르고 임의로 자신만의 시스템을 만들지 말고 키트를 사용하세요.
SK는 이 스킬의 폴더인 ~/.claude/skills/animation-video를 의미합니다.
작동 방식 (한 번 읽어보세요)
- 전체 영화는 당신이 작성하는 하나의 JavaScript 파일
film.js입니다. 특정 시간t에 화면에 무엇이 있는지 설명합니다. 스크립트는 헤드리스 Chrome에서 프레임별로 렌더링하고 ffmpeg가 mp4를 만듭니다. 비디오 편집기나 이미지 생성 도구는 없습니다. - 음성 해설이 먼저 줄별로 생성됩니다. 실제 타이밍은
timeline.js에 기록됩니다. 영화의 모든 순간은 음성에 상대적으로 정의되므로(예: "4번째 줄이 시작되기 0.2초 전"), 그림과 음성이 어긋날 수 없습니다. - 키트는 어려운 부분이 미리 준비되어 있습니다: 엔진(Easing, 카메라, 장면, 자막), 캐릭터, 포즈 및 소품을 갖춘 두 가지 완전한 아트 스타일, 그리고 25가지 테스트된 애니메이션 레시피입니다.
- 당신은 정지 프레임을 렌더링하고 확인하여 작업을 점검합니다. 이것은 선택 사항이 아닙니다. 확인하지 않은 영화를 판단할 수 없습니다.
단계들
이 단계들로 작업 목록을 만들고 순서대로 진행하세요.
| # | 단계 | 결과 |
|---|---|---|
| 0 | 사전 점검 | 모든 도구 존재, VoiceStudio 실행 중 |
| 1 | 스토리 읽고 스타일 선택 | 결정 완료, 프로젝트 폴더 생성 |
| 2 | 스크립트 작성 | vo/script.json, 최대 130단어 |
| 3 | 음성 생성 | 줄당 하나의 확인된 wav 파일 |
| 4 | 타임라인 구축 | timeline.js, 영화 길이 35-45초 |
| 5 | 샷 계획 | film.js 상단에 샷 계획 주석 |
| 6 | 영화 작성 | film.js, 장면별로 작성하며 중간에 정지 프레임 확인 |
| 7 | 전체 영화 검토 | 연속 사진 검토, 결함 수정 |
| 8 | 내보내기 | mp4 |
| 9 | 전달 | mp4 + 음성 스크립트 + Instagram 캡션 + 솔직한 노트 |
0단계 - 사전 점검
bash ~/.claude/skills/animation-video/scripts/preflight.sh
모든 줄이 OK라고 표시되어야 합니다. VoiceStudio가 MISSING이면 사용자에게 VoiceStudio 앱을 열고 기다리라고 요청하세요. 절대 다른 음성으로 대체하거나 음성 해설을 건너뛰지 마세요. 스크립트가 출력하는 명령으로 다른 모든 문제를 해결하세요.
1단계 - 스토리를 읽고 스타일 선택
스토리가 전혀 없는 경우가 아니라면 사용자에게 질문하지 마세요. 다음을 직접 결정하세요:
- 스타일. 두 가지가 있습니다.
SK/references/characters-ink.jpg와characters-paper.jpg를 보려면(이미지에 Read 도구 사용) 확인하세요.ink: 두껍고 흔들리는 잉크 외곽선, 굵은 세리프 사인, 따뜻한 복고풍 카툰. 악당, 슬랩스틱, 상점, 거리, 신체적 개그가 있는 스토리에 가장 적합합니다.paper: 종이 오려붙이기 콜라주, 외곽선 없음, 부드러운 그림자, 우아한 세리프. 전화, 앱, 링크, 자연, 부드럽거나 현대적인 분위기의 스토리에 가장 적합합니다.- 사용자가 스타일을 요청한 경우 그 스타일을 사용하세요. 그렇지 않고 작업 폴더에 이전 에피소드가 이미 있는 경우 다른 스타일을 사용하세요(어떤 스타일이 사용되었는지 보려면
head -3 */style.js 2>/dev/null실행). 그렇지 않으면 스토리에 따라 선택하세요.
- 출연진. 주인공(소상공인 또는 주인공)은 누구입니까? 장애물(악당, 혼란스러운 고객, 미로)은 누구 또는 무엇입니까? 두 명의 주요 캐릭터면 충분합니다.
- 프로젝트 폴더. 스토리에서 따온 짧은 이름으로, 사용자의 작업 폴더에 생성합니다.
bash ~/.claude/skills/animation-video/scripts/new_project.sh "./film-<짧은-이름>" ink # 또는 paper
이것은 작동하는 시작 film.js로 프로젝트를 생성합니다. 지금 그 시작 파일을 읽으세요: 짧고 유지해야 할 정확한 구조를 보여줍니다.
2단계 - 스크립트 작성
먼저 SK/references/story.md를 읽으세요. 구조, 단어 예산 및 작업 예제가 있습니다. 가장 중요한 규칙:
- 총 말하는 단어는 최대 130개입니다. 음성은 초당 약 3.2단어를 말하므로 130단어는 약 43초입니다. 사용자의 스크립트가 더 길면 직접 줄이고 가장 좋은 대사와 스토리 순서를 유지하세요. 묻지 말고; 마지막에 무엇을 잘랐는지 알려주세요. 움직이는 짧은 영화가 지루한 긴 영화보다 항상 좋습니다.
- 비트당 한 줄, 각각 5-16단어, id는
l01,l02, ... 각 줄은 하나의 오디오 클립이 되고 일반적으로 하나의 시각적 아이디어가 됩니다. - 귀로 듣기에 맞게 작성하세요: 숫자는 단어로("40"이 아닌 "사십"), 이모지나 기호 없음, 브랜드 이름은 소리 나는 대로 철자("SiteKeep"은 "싸이트 킵").
- 마지막 줄은 시청자에게 댓글을 달도록 요청하는 후크입니다(아래 브랜드 기본값 참조).
<project>/vo/script.json에 작성하세요:
{"l01": "마야를 만나보세요. 그녀는 처음부터 맞춤 간식을 만듭니다.",
"l02": "그래서 그녀는 거대한 온라인 마켓플레이스 안에 가게를 열었습니다."}
3단계 - 음성 생성
python3 ~/.claude/skills/animation-video/scripts/voice.py "./film-<짧은-이름>"
이 작업은 줄당 약 20초(전체 스크립트의 경우 4-5분)가 소요됩니다: 10분 타임아웃으로 실행하세요. 중간에 멈추면 같은 명령을 다시 실행하세요. 이미 음성 처리된 줄은 유지됩니다. 사용자의 목소리(프로필 3a02464e, "ep1 D 샘플-잠김", 영어, 단계 16, 속도 1.0, 지시 텍스트 없음; 이것들은 기본값이며 사용자가 달리 말하지 않는 한 변경하지 마세요)로 각 줄을 생성하고, 다시 듣고, 모든 줄에 대해 OK 또는 DIFF와 함께 들은 내용을 출력합니다.
모든 DIFF 줄을 읽고 결정하세요:
- 괜찮음: 같은 단어가 다르게 쓰인 경우("SiteKeep" / "Site Keep", "40" / "forty", "two" / "to", 구두점).
- 괜찮지 않음: 단어가 누락, 추가 또는 다른 단어인 경우("her menu"가 "our menu"로 들림). 해당 줄만 다시 생성하세요:
voice.py <project> --only l05 l11. 두 번 더 시도한 후에도 줄이 계속 실패하면script.json에서 해당 줄을 약간 수정하고 다시 생성하세요.
누락, 추가 또는 잘못된 단어가 있는 줄을 절대 출시하지 마세요.
4단계 - 타임라인 구축
python3 ~/.claude/skills/animation-video/scripts/audio.py timeline "./film-<짧은-이름>"
총 길이와 각 줄의 시작 시간 및 지속 시간을 출력합니다. 그런 다음 <project>/film.json에서 일시 중지를 조정하고 다시 실행하세요:
{"lead": 0.55, "gap": 0.4, "tail": 1.6, "gaps": {"l04": 0.7, "l09": 0.9}}
gap은 줄 뒤의 기본 일시 중지입니다. 시각적 요소가 펼쳐질 공간이 필요한 줄(개그, 넘어짐, 큰 반전, 스토리의 전환) 뒤에는 더 긴 간격(0.6-0.9)을 제공하세요.- 하나의 생각인 줄 사이에는 0.25-0.35를 사용하세요.
tail은 마지막 단어 후 엔드 카드가 유지되는 시간입니다(1.4-1.8).- 목표 총 시간: 35-45초. 46초 초과: 스크립트에서 한 줄을 자르고 해당 줄에 대해 3-4단계를 다시 수행하세요.
나중에 줄을 다시 음성 처리할 때마다 audio.py timeline을 다시 실행하세요. 모든 큐가 음성에 상대적이기 때문에 영화가 자동으로 다시 동기화됩니다.
5단계 - 샷 계획
SK/references/story.md 섹션 "스크립트에서 샷까지"를 읽으세요. 그런 다음 film.js 상단에 주석 블록(별도 문서 아님)으로 계획을 작성하세요. 장면당 한 행:
/* 샷 계획
A l01-l02 거리, 낮 마야가 포장마차 뒤에 나타나 손을 흔듭니다. 카메라: 느린 푸시인.
B l03-l04 같은 거리 집주인의 그림자가 그녀 위로 드리워지고, 간판이 쾅 내려앉습니다(흔들림, 먼지). 그녀는 깜짝 놀랍니다.
C l05 지하실 트랩도어가 열리고, 그녀가 공중에 매달렸다가 떨어집니다. 카메라가 아래로 따라갑니다.
...
Z l12 엔드 카드 원 와이프. 질문 + "댓글에 하나 남겨주세요". 히어로가 들여다봅니다.
*/
좋은 계획은 다음을 갖추고 있어야 합니다: 5-8개의 장면; 적어도 6초마다 다른 그림; 모든 장면에 하나의 명확한 시각적 개그 또는 놀라움; 모든 추상적인 아이디어가 물리적인 것으로 전환됨(수수료는 통행료 게이트, 알고리즘은 트랩도어, 혼란스러운 링크는 정글); 분위기가 문제에서 해결책의 안도감으로 전환됨; 그리고 엔드 카드.
6단계 - 영화 작성
작성하기 전에 다음을 읽으세요(짧으며, 좋은 영화와 망가진 영화를 구분하는 요소입니다):
SK/references/engine.md- 호출할 수 있는 모든 함수.SK/references/kit-ink.md또는kit-paper.md- 스타일의 캐릭터, 포즈, 소품.SK/references/recipes.js- 복사할 25가지 테스트된 동작.recipes-<style>.jpg도 살펴보세요.SK/references/craft.md- 수제 애니메이션 느낌을 주는 타이밍 숫자와 규칙.
그런 다음 시작 파일의 네 가지 섹션(설정, 큐 시간, 사운드 큐, 장면)으로 film.js를 작성하세요.
한 번에 한 장면씩 작업하세요. 장면 A를 작성하고, 그 장면에서 두세 개의 정지 프레임을 렌더링하고, 보고, 수정한 후 장면 B로 진행하세요:
node ~/.claude/skills/animation-video/scripts/render.mjs "./film-<짧은-이름>" stills 1.2 3.5 6.0
그런 다음 Read 도구로 <project>/check/sheet-1.jpg를 여세요. 명령이 PAGE ERROR를 출력하면 영화에 JavaScript 오류가 있는 것입니다: 처음 출력된 오류를 수정하고 다시 실행하세요.
film.js의 10가지 규칙 (각각은 실제로 발생한 실패를 방지합니다):
film.js(그리고 필요한 경우style.js의 색상)만 편집하세요.engine.js나index.html은 절대 편집하지 마세요.- 절대 원시 시간을 입력하지 마세요. 모든 큐는 음성에서 빌드됩니다:
L('l04')(줄 시작),E('l04')(줄 끝),wt('l04', '세 명의 라이벌')(구가 말해질 때), 더하기 또는 빼기 작은 오프셋. 각각에 이름을 지정하세요:const tSlam = L('l04') + 0.25; - 단어보다 0.1-0.3초 먼저 동작을 시작하여 단어에 정확히 맞도록 하세요.
- 포즈와 오브젝트는
q(초당 12회 스텝 시간: 수제 애니메이션 느낌)를 사용하세요. 카메라, 흔들림 및 와이프는t(부드러움)를 사용하세요. - 큐 시간 전에는 아무것도 보이면 안 됩니다.
pop(...)또는if (q < tCue) ...를 사용하여 사물이 음성이 언급될 때 나타나고 그 전에 나타나지 않도록 하세요. Math.random(),Date, CSS 애니메이션,setTimeout을 사용하지 마세요. 무작위성에는h(n)을 사용하세요. 영화는 동일한t에 대해 항상 동일한 그림을 제공해야 합니다.- 배경은 화면보다 훨씬 크게 그리세요(예: x -1000에서 2080까지) 카메라 이동과 흔들림이 빈 가장자리를 보여주지 않도록 합니다.
- 그리기 순서는 깊이입니다: 나중에 그린 것이 앞에 있습니다. 배경 먼저, 그런 다음 먼 오브젝트, 캐릭터, 가까운 오브젝트, 그 다음 효과.
- 중요한 것은 x 70-1010 및 y 180-1400 내부에 유지하세요. 자막은 y 1420-1560에 있고 Instagram의 자체 버튼은 y 1600 아래와 오른쪽 가장자리를 모두 덮습니다.
- 모든 사운드는 보이는 이벤트에 속하며 이벤트와 동일한 큐 시간에
sfx(time, name)으로 선언됩니다. 문제 부분에 대한 하나의music(...)배경, 안도감에 대한 다른 배경.
품질 기준. 장면이 완료되었다고 말하기 전에 다음을 모두 갖추어야 합니다:
- 모든 프레임에 생명이 있습니다. 주인공이 깜빡이고 숨을 쉬며(
POSE.idle(q)), 배경에서 무언가 움직이고(구름, 흔들리는 간판, 떠다니는 모양), 카메라는 적어도 느린 푸시인이 있습니다. 1초 이상 아무것도 움직이지 않는 프레임은 결함입니다. - 등장과 퇴장이 애니메이션 처리되고, 단순한 컷인이 아닙니다: 오버슈트로 팝업, 바운스로 드롭, 튀어오르기, 예상 동작으로 질주(레시피 1-6).
- 충격은 한 프레임에서 동시에 발생합니다: 스쿼시 + 화면 흔들림 + 먼지 또는 폭발 + 사운드(레시피 3). 이 한 가지가 "느낌"에 다른 어떤 것보다 더 많은 영향을 미칩니다.
- 캐릭터가 연기합니다. 그들은 일어나는 일을 보고(
look), 사건이 발생한 후 한 박자 늦게 반응하고(레시피 9), 스토리의 분위기가 바뀔 때 포즈와 표정을 바꿉니다. 캐릭터를 한 장면 내내 하나의 포즈로 절대 두지 마세요. - 장면당 하나의 개그가 있어 아이디어를 물리적이고 약간 재미있게 만듭니다.
- 읽을 수 있는 텍스트. 표지판과 레이블은 높이가 최소 40px이고, 1-4단어이며, 대비가 높고, 최소 1초 동안 화면에 표시되며, 캐릭터나 자막에 가려지지 않습니다.
- 장면 간의 실제 전환(레시피 19-20, 또는 하나의 세계 내에서 빠른 카메라 이동), 단순히 한 그림이 다른 그림을 대체하는 것이 아닙니다.
7단계 - 전체 영화 검토
node ~/.claude/skills/animation-video/scripts/render.mjs "./film-<짧은-이름>" check 36
Read 도구로 두 연속 사진 시트(check/sheet-1.jpg, sheet-2.jpg)를 여세요. 각각 시간 순서대로 왼쪽에서 오른쪽, 위에서 아래로 18개의 프레임을 보여줍니다. 시간은 명령에 의해 출력됩니다. 모든 프레임에서 이 목록을 살펴보고, 수정하기 전에 발견한 내용을 기록하세요:
- 텍스트가 잘리거나, 다른 텍스트와 겹치거나, 캐릭터나 소품에 가려짐
- 자막이 중요한 것을 덮거나, 브랜드 이름이 분할되거나 철자가 틀림(
CAPTION.replace를 설정하거나 동작을 위로 이동) - 큰 빈 영역(프레임의 1/3 이상이 내용 없음): 카메라를 확대하거나, 사물을 이동하거나, 배경 디테일 추가
- 음성이 언급하기 전에 무언가 보이거나, 사라져야 할 후에도 여전히 있음
- 캐릭터나 주요 소품이 부분적으로 화면 밖에 있거나, 아주 작거나(250px 미만 높이), 숨겨져 있음
- 손, 팔 또는 물체가 앞이나 뒤에 있어야 할 것을 통과함
- 연속된 두 프레임(2초 이상 간격)이 동일해 보임: 움직임이나 카메라 이동 추가
- 스토리의 그 순간에 맞지 않는 표정
- 엔드 카드: 질문을 읽을 수 있고, 댓글 프롬프트가 보이며, 겹치는 것이 없음
발견한 것을 수정한 다음 해당 시간에만 정지 프레임을 렌더링하여 확인하세요(render.mjs <project> stills 4.2 11.8). 시트가 너무 작아 판단하기 어려울 때는 전체 크기의 단일 프레임(check/f003.jpg)을 보세요. 최대 두 번의 전체 검토 라운드를 수행하세요. 영원히 다듬지 말고 검토를 건너뛰지 마세요.
8단계 - 내보내기
bash ~/.claude/skills/animation-video/scripts/build.sh "./film-<짧은-이름>" "./<짧은-이름>.mp4"
이 작업은 2-10분이 소요됩니다(종이 스타일이 더 느림): 백그라운드에서 또는 10분 타임아웃으로 실행하세요. 모든 프레임을 렌더링하고, 음성 + 음향 효과 + 음악을 혼합하고, 확인을 출력합니다. 확인 사항: h264 1080x1920 30fps, aac 오디오, 지속 시간이 타임라인 총계와 일치, 평균 볼륨이 -16과 -19dB 사이. 렌더링이 PAGE ERROR를 출력하면 수정하고 다시 실행하세요.
9단계 - 전달
사용자에게 제공하세요