듀오 스케치 릴 (Nerd + Claude)
Nerd가 패닉에 빠지고 Claude(주황색 로봇)가 냉소적으로 답하는 3D 스케치입니다. 모든 것은
절차적(procedural) Blender로 만들어집니다: 세트, 두 캐릭터 리깅, 연기, 조명, 카메라, 모니터, 오버레이, 배경음악, 효과음까지
에피소드당 하나의 파일 storyboard.json 으로 구축됩니다. 새로운 에피소드는 데이터일 뿐, 코드가 아닙니다. 이미지나 비디오 생성은 전혀 사용하지 않습니다.
에피소드는 하나의 폴더입니다: <anything>/<YYYY-MM-DD>_<slug>/ 안에 storyboard.json과 research.md가 들어 있습니다.
파이프라인이 나머지(assets/, project/, renders/, final.mp4, cover.png, qa/)를 모두 이 폴더 안에 생성합니다.
완성된 두 개의 예시 에피소드가 저장소의 examples/에 있으니, 하나를 복사해서 시작하세요.
워크플로 (순서대로, 건너뛰지 마세요)
- 주제 (5분). 개발자나 AI 사용자가 공감할 만한 실제 문제(페인 포인트) 하나와 오늘 당장 쓸 수 있는 팁 하나를 정합니다.
농담은 시청자가 본인의 AI로 무엇을 하는지에 관한 것이어야 하지, 도구 자체에 관한 것이 아닙니다. 규칙과 아이디어 뱅크:
references/retention.md. - 연구 →
research.md: 화면/음성/자막에 등장하는 모든 사실은 URL + 확인 날짜와 함께 1차 출처(공식 문서, README, 소스 코드)를 제시합니다. 스케치의 허구적 스토리 요소(시간, 숫자, 이름)는 별도 "Fiction" 섹션에 기록합니다. 확인할 수 없는 것은 제거하고 그 사실을 명시합니다. - 대본 + 스토리보드 →
storyboard.json(예시를 복사해서 덮어씁니다). 스키마와 용어:references/storyboard.md. 목표: 30-40초, 10-14라인, 첫 단어 ≤ 0.5초, 컷 간격 1.5-3초, Nerd가 열고 Claude가 닫으며, 마지막 프레임이 첫 프레임으로 돌아갑니다. - 무료 더빙(draft) (macOS):
pipeline.sh <episode> --say stills(시스템 음성, 크레딧 없음).renders/stills/sheet.jpg(비트 끝마다 한 프레임)를 확인합니다. 프레이밍/오버레이 충돌을 수정하고 다시 실행합니다. macOS가 아닌가요?--say를 빼고 먼저 음성을 녹음/생성(5단계)한 다음stills를 실행합니다. - 음성. 한 라인당 하나의 오디오 파일을
assets/audio/dialogue_raw/<beat id>.mp3(L01.mp3, ...)에 넣습니다. 참조 에피소드는 ElevenLabseleven_v4를 사용하며, 두 개의 라이브러리 음성(Nerd = "Quinn - Soft Nerd Boy", Claude = "Sarcastic Nigel")과 각 비트의tts에 오디오 태그(예:[deadpan] It was ugly.)를 포함합니다. Claude에서 ElevenLabs 커넥터를 사용할 경우: 먼저 대략 한 라인당 비용을 추정(≈ 문자당 1 크레딧, 태그 포함)한 후, 라인별로 한 번씩 생성하고 각 테이크를content_url에서 다운로드합니다. 11-14라인 에피소드는 약 700-900 크레딧입니다. 직접 녹음한 파일도 같은 파일명으로 사용 가능합니다. - 실제 빌드 + 스틸:
pipeline.sh <episode> stills.project/whisper_check.txt에 대본 대비 들린 단어 비율이 기록됩니다(< 0.8이면 직접 들어보기). 테이크는say더빙보다 길 수 있으므로 sheet.jpg를 다시 확인합니다. - 최종:
pipeline.sh <episode> final(16 샘플, 3 워커 ≈ M시리즈 Mac에서 프레임당 3초: 38초 릴 ≈ 1시간; 백그라운드 실행).final.mp4, B-후크 변형final_b.mp4,cover.png를 렌더링하고qa.py를 실행하여qa/report.md를 생성합니다(Blocking: none이어야 함).
하드 규칙
- 캐릭터: Nerd와 Claude를 재디자인하지 마세요 (
engine/scene/nerd.py,mascot.py). Claude는 입이 없습니다: 몸통 찌그러짐, 바운스, 눈, 팔로 "말합니다". - 스케치가 이야기를 창작할 수는 있지만(그게 코미디입니다), 절대 제품 기능, 숫자, 벤치마크, 인용구를 허구화하지 마세요.
- 페이오프(스탬프, 키, 체크 표시)는 해당 단어가 나오기 0.2-0.3초 전에 배치하며, 절대 마지막 단어에 배치하지 않습니다.
- 무료 더빙을 유료 음성보다 먼저, 최종 렌더 전에 스틸을 먼저 확인하세요.
파일
pipeline.sh <episode> [--say] [build|stills|draft|final]engine/scene/Blender 측:build_scene.py(진입점),animate.py(스토리보드 기반 연기/조명/카메라),env.py(세트),nerd.py,mascot.py,lights.py,tl.py(앵커, 스크립트와 공유).engine/scripts/:build_timeline.py(테이크 → 타임라인 + Whisper 단어 + 립싱크),make_screens.py(모니터 템플릿),make_overlay.py(후크, 자막, 아이템, 타이틀 카드, captions.srt),make_audio.py+synth.py(배경음악/효과음),master_audio.py(-14 LUFS),stills.py,draft.sh,render_final.sh,encode.sh,make_cover.py,cover_title.py,qa.py,make_textures.py.- 도구와 경로 (환경 변수, macOS 기본값):
BLENDER(Blender 5.x 바이너리),DUO_PYTHON(numpy, scipy, soundfile, pillow 포함된 Python; 기본값~/.venvs/duo-reel/bin/python),WHISPER_MODEL(whisper.cpp 모델, 기본값~/whisper-models/ggml-medium.en.bin),whisper-cli와ffmpeg가 PATH에 있어야 함, 폰트DUO_FONT_DISPLAY/DUO_FONT_MONO/DUO_FONT_SANS/DUO_FONT_EMOJI. references/storyboard.md(스키마, 모든 프리셋),references/retention.md(후크/구조/주제),references/lessons.md(과거 실수 사례).