Stickman Story Reels은(는) 무엇을 하나요?
전제를 완성된 60~90초 세로 릴로 바꿔줍니다: 시청 시간을 위해 설계된 후크 우선 스크립트, 코드로 그린 스틱맨 장면, 단어별 자막이 포함된 음성 해설, 사운드 디자인, 그리고 사람들이 댓글을 달고 2부를 기다리게 만드는 두 가지 선택지 투표. PlotVote 인터랙티브 스토리(@plotvote)의 워크플로우를 기반으로 제작되었습니다.
파이프라인은 결정론적입니다: episode.json(스크립트, 타이밍, 모션)과 scenes.js(드로잉)를 작성하면 scripts/reel.py가 나머지(음성 → 사운드 → 빌드 → 체크 → 렌더)를 처리합니다. 이미지 모델, 스톡 영상, 음성 외 유료 도구는 사용하지 않습니다.
설정 (기기당 한 번)
python3 --version(3.9+), ffmpeg -version, node --version(18+)을 확인하세요. 첫 번째 렌더링에서 npx를 통해 HyperFrames와 헤드리스 Chrome을 다운로드합니다. 정상이며 1분 정도 걸립니다. 음성의 경우 사용자는 프로젝트 폴더의 .env 파일에 ELEVENLABS_API_KEY=...를 넣거나(또는 export)합니다. 키를 절대 출력하지 마세요. 키가 없어도 --draft 모드에서 모든 기능이 작동합니다(무음, 실제 속도 타이밍).
터미널 세션당 한 번 이 셸 함수를 정의하세요(함수여야 하며, 문자열 변수가 아니어야 함; zsh와 bash 모두에서 작동). 아래 명령어에서 이를 사용합니다:
reel() { python3 "<이 스킬의 폴더>/scripts/reel.py" "$@"; }
워크플로우
1. 요청 이해하기
- "이 이야기를 만들어줘" 명확한 전제 포함 → 강력한 스크립트 하나를 작성하고 제작합니다.
- "선택지를 줘" 또는 "스크립트 아이디어" → 세 가지 전체 옵션을 제시(플레이북 §10 참조), 선택을 기다린 후 제작합니다.
- "다음 편" 또는 "X가 투표에서 이겼어" → 시리즈를 이어갑니다: 결과부터 시작, 마지막 단서 해소, 진짜 답변 제공, 긴장 고조, 새로운 투표(플레이북 §9). 시리즈 바이블이 있으면 읽습니다.
- 스크립트만 (또는 셸 사용 불가) → 스크립트 테이블과
episode.json,scenes.js를 제공합니다(직접 렌더링할 경우).
2. 스크립트 작성
매번 references/viral-script-playbook.md를 먼저 읽으세요. 여기에는 사람들이 3초 이상 머물게 할지 결정하는 규칙이 있습니다. 전제, 시리즈 또는 시즌을 창작할 때는 references/story-engines.md도 읽으세요.
스크립트는 테이블 형식(# · 음성 · 대사 · 화면)으로 작성하며, 약 210~230단어(집중 속도 기준 약 85초)를 목표로 합니다. 플레이북의 사전 음성 체크리스트를 실행하세요. 사람들이 가장 자주 실수하는 부분: 1번 프레임은 움직여야 함; 5초 이내에 어디서, 언제, 누가인지; 모든 결정은 12세 테스트를 통과해야 함; 캐릭터는 자신의 반전을 1인칭으로 말해야 함; 투표는 양쪽에 비용이 있는 두 가지 물리적 한 단어 행동이어야 함; 투표 후 속삭이는 단서는 이전에 심은 것을 가리켜야 함.
사용자가 옵션을 요청했거나 크레딧 사용 전 승인을 원할 경우, 스크립트 테이블을 보여주고 기다리세요. 그렇지 않으면 계속 진행합니다.
3. 릴 초안 만들기
reel new reels/<슬러그>-part1 --title "<제목> — 1부"
이 명령은 작동하는 작은 스타터에서 episode.json과 scenes.js를 생성합니다. 둘 다 여러분의 스토리로 교체하세요.
4. 장면 그리기 (scenes.js)
references/drawing-kit.md를 읽고 examples/sundown-part1/scenes.js를 패턴 라이브러리로 열어보세요(밖으로 몸을 내미는 생물체, 축소 지도, 한 줄씩 드러나는 규칙 벽, 스톱모션 생물체, 창문 근접 실수, 말하는 라디오, 나무 사이의 손전등, 선택 분할, 표지).
스크립트 테이블의 각 장면당 하나의 함수입니다. 각 함수는 키트 헬퍼(defs(), sky(), forest(), cabin(), room(), water(), stick(), kid(), creature(), phone(), radio(), chip(), ring(), splitChoice()…)로 구축된 1080×1920 SVG를 반환합니다. 키트에 없는 배경(워터파크, 기차, 사막 등)은 정상입니다: rect, path 및 헬퍼를 사용하여 드로잉 키트의 "새 배경 만들기" 섹션을 따라 그리세요. 움직이거나 단어에 나타나야 하는 모든 것에 id를 부여하세요. 얼굴이 자막 영역(y 1180–1380)과 오른쪽 140px을 침범하지 않도록 하세요. 표지(제목 아래에 주제 배치)와 투표 카드 삽입용 mode를 추가하세요.
5. 에피소드 연결 (episode.json)
references/episode-format.md를 읽으세요. 모든 장면에 대해: draw, say 라인, kenburns, 그리고 발화 단어에 맞춘 animate 항목("at": "faster"). 그 다음: 음성(fx와 다른 캐릭터용 자막 tag 포함), 시계가 있는 HUD 알약, 단어 위에 수동 배치된 sfx, bed 큐, 투표 장면(두 옵션, 삽입 이미지, 단서 라인), cover, post(caption에 {vote_line} 포함, 고정 댓글, posts_at). 음성, 사운드 및 자막은 references/sound-voice-posting.md를 참조하세요.
6. 초안 패스 (무료)
reel voice reels/<슬러그> --draft # 무음, 실제 속도 타이밍
reel sound reels/<슬러그>
reel build reels/<슬러그>
reel check reels/<슬러그>
reel snap reels/<슬러그> --at scenes # 장면당 두 장의 스틸 (또는 --at 0.5,12,30.5 초)
reels/<슬러그>/snaps/의 모든 스틸을 살펴보세요. 드로잉 키트의 가독성 규칙이 경고하는 내용을 수정하세요: 너무 어두워서 읽기 힘든 것, 자막 아래 얼굴, 너무 작은 주제, 잘못된 타이밍의 공개. check는 "Check passed"를 출력해야 합니다(all은 통과하지 않으면 렌더링 전에 중단). 다음 경고는 예상되며 괜찮습니다: "nested structure", "track too dense", "composition file too large", 그리고 삽입 이미지가 "overflowing" 크롭.
7. 음성 및 렌더링
reel all reels/<슬러그> # voice(ElevenLabs) → sound → build → check → render
reel frames reels/<슬러그> --every 2 # 전체 릴의 연락처 시트, 검토용
출력된 길이 확인(60–90초; 초과 시 설정 부분을 잘라내세요). renders/review.png 확인: 주제가 읽을 수 있고, 자막이 명확하며, 이름이 지정된 것이 해당 단어에서 움직이고, 투표 카드와 단서 삽입이 나타납니다. 1번 라인을 들어보세요; 단어가 잘못 들릴 수 있으면 단어를 바꾸고 음성을 다시 만드세요(변경된 라인만 크레딧이 소모됩니다).
8. 전달
사용자에게 renders/<슬러그>.mp4, renders/cover.png 및 POST.md(캡션, 고정 댓글, 대체 텍스트, 투표 마감 시간)를 제공하세요. 시리즈인 경우, 릴 폴더 옆에 bible.md를 작성하거나 업데이트하세요: 출연진, 규칙, 정식 설정, 단서, 그리고 다음 편이 어떻게 시작되는지에 대한 투표 옵션당 한 줄(story-engines §4).
명령어
| 명령어 | 설명 |
|---|---|
reel new <dir> --title "…" | 릴 폴더 초안 만들기 |
reel voice <dir> [--draft] | 음성 + 단어 타이밍 → timing.json, assets/audio/narration.wav |
reel sound <dir> | 19가지 음향 효과 + 앰비언트 배경 합성 |
reel build <dir> | index.html, cover/, POST.md 컴파일 |
reel check <dir> | HyperFrames 린트, 레이아웃 및 대비 게이트(실패 시 0이 아닌 값으로 종료) |
reel snap <dir> --at scenes | 장면당 두 장의 PNG 스틸(또는 --at 1,5.5,9 초) |
reel render <dir> [--draft] | −14 LUFS의 MP4 + cover.png + 연락처 시트 |
reel all <dir> [--draft] | voice → sound → build → check → render (check 실패 시 중단) |
reel frames <dir> --every 2 | 렌더링된 전체 MP4의 검토 시트 |
문제 해결
"word"가 해당 위치에서 발화되지 않음: 시간 참조는 자막 철자를 사용하며 해당 장면 내에서만 검색됩니다; 오류는 장면의 내용을 출력합니다. 두 번째 발생에는word#1, 다른 장면에는sN:word, 오프셋에는start+0.2, 절대 시간에는12.5s를 사용하세요.- 음성을 찾을 수 없음: 미리 정의된 이름(Liam, Brian, George, Daniel, Callum, Bill, Roger, Chris, Eric, Will, Harry, Charlie, River, Adam, Sarah, Matilda, Jessica, Alice, Lily, Laura, Bella) 또는 음성 ID를 사용하세요.
- 크레딧 소진: 이미 음성으로 변환된 라인은 캐시됩니다; 충전 후
voice를 다시 실행하세요. - 빈 장면 또는 검은 장면: 해당 세트의 JavaScript 오류입니다.
check에 표시됩니다; 수정 후 다시 빌드하여 함수를 테스트하세요. - 90초 초과: 설정 라인과 형용사를 줄이세요; 후크, 반전, 투표 및 단서를 유지하세요.
npx또는node오류: Node 18+를 설치하세요; 첫 실행 시npx가 HyperFrames와 Chrome을 다운로드하도록 하세요.
이 스킬의 내용
scripts/reel.py: CLI.scripts/synth.py: 19가지 음향 효과 및 배경(드론, 바람, 펄스, 험, 물), 모두 합성.assets/kit.js: 드로잉 키트.assets/runtime.js,assets/base.css: 자막, HUD 및 투표 카드.references/:viral-script-playbook.md(항상),story-engines.md(전제, 시리즈, 바이블),episode-format.md(명세),drawing-kit.md(드로잉),sound-voice-posting.md(음성, 사운드, 자막, 게시, 안전).examples/sundown-part1/: 완전한 89초 1부(episode.json+scenes.js).examples/starter/:new에서 사용하는 4장면 스타터.examples/script-pitches.md: 5개의 추가 전체 1부 스크립트(THE WHEEL, LAST CAR, LOW TIDE, 3:33, ROW ONE).