REV — Reverse Engineer Video (비디오 스타일을 코드로 재현하기)
결과물은 스타일이지 비디오 자체가 아닙니다: 시각적 언어는 원본(모양, 팔레트, 폰트, 레이아웃, 조명, 카메라, 전환, 템포)과 일치하지만 스토리는 완전히 새롭습니다. 절대 원본의 푸티지, 프레임 또는 오디오를 출력에 복사하지 마십시오.
$SKILL = 이 파일이 포함된 폴더. Python = $SKILL/.venv/bin/python. Node 스크립트는 $SKILL에서 실행합니다.
두 가지 모드
- A. 새로운 스타일 — 드물고 무거움: 단계 00 → 6을 순서대로 진행.
- B. 이미 재현한 스타일로 새 에피소드 — 자주 발생: 스타일 명세서와 엔진이 이미 존재함(
style.md+ 이전 비디오의src/, 또는examples/중 하나). 해당src/를 새 작업 폴더로 복사하고, 단계 0–1은 건너뛰고 단계 2부터 시작합니다. 스토리, 씬 및 사운드는 새로 만들고, 오버레이, 폰트, 조명, 렌더링 및 체크는 재사용합니다.
어느 모드가 적용되는지 불명확하면 한 줄로 물어보십시오.
단계 (🛑 = 사용자에게 보여주고 승인을 기다림)
각 단계 파일을 실행하기 전에 읽으십시오. 앞서 나가지 마십시오: 분석 후에 스토리, 스토리 승인 후에 빌드, 제어 프레임 후에 전체 렌더링.
| # | 단계 | 파일 | 출력 | 결정 |
|---|---|---|---|---|
| 00 | 설정 및 도구 확인 (최초 실행 시에만) | stages/00-setup.md | doctor.sh가 ALL GOOD 표시 | — |
| 0 | 코드로 그릴 수 있는가? | stages/0-feasibility.md | 🟢/🟡/🔴 평결 + 프레임 시트 | 🛑 🔴이면: 중단하고 설명 |
| 1 | 원본 분석 | stages/1-analysis.md | style.md: 스타일 명세서, 템포 숫자, 사운드 | 🛑 명세서 + 원본 옆 샘플 프레임 1개 |
| 2 | 스토리 및 씬 | stages/2-story.md | 초 단위 씬 테이블 | 🛑 스토리 / 에스컬레이션 사다리 |
| 3 | 빌드 | stages/3-build.md | src/video.html + 원본 옆 제어 프레임 | 🛑 제어 프레임 (자체 체크 후) |
| 4 | 전체 렌더링 | stages/4-render.md | video-full.mp4 | — |
| 5 | 사운드 | stages/5-sound.md | sound-full.wav → final.mp4 | — |
| 6 | 확인 및 표시 | stages/6-check.md | 체크 리포트 + final.mp4 | 🛑 사용자가 시청 → 수정 |
사용자가 수정한 후에는 해당 단계 파일의 "Lessons" 섹션에 규칙으로 추가하십시오 (날짜 + 무엇이 잘못되었는지 + 무엇이 해결했는지). 이것이 스킬이 개선되는 방식입니다.
엄격한 규칙
- 출력 포맷은 원본을 따릅니다: 원본의 방향과 FPS; 세로 = 1080×1920, 가로 = 1920×1080. 세로 비디오는 60초 이하 원본이 더 길더라도 — 스토리를 압축하십시오.
- 폰트는
src/fonts/에 파일로 제공 (@font-face), 그리고document.fonts.load(...)가 해결된 후에만 프레임을 캡처합니다. 절대 시스템 폰트에 의존하지 마십시오. - 결정론적 프레임: 프레임은
t에만 의존합니다. 시드 없는Math.random(),Date.now(), CSS 애니메이션 또는 requestAnimationFrame 루프를 사용하지 마십시오. - 사운드는 비디오를 다시 렌더링하지 않고 변경: 새 wav →
scripts/mux.sh. - 음량: −26 LUFS 통합, −20 LUFS보다 큰 순간 없음, 트루 피크 ≤ −6 dBFS —
scripts/loudness.py. 광대역 노이즈 배경, 클릭, 무음 구간 금지. - 먼저 직접 원본과 프레임을 확인 (
scripts/compare.py), 그런 다음 사용자에게 보여주십시오. 비교 이미지를 보지 않고 "일치합니다"라고 말하지 마십시오. - 에이전트는 들을 수 없습니다: 모든 사운드 레이어를 글로 설명하고, 사용자가 어떻게 들리는지 판단합니다.
- 렌더링은 CPU 집약적입니다. 노트북에서는 작업자 수를 적게 사용하거나 선택적 서버(
server/README.md)를 사용하십시오. - 다운로드한 원본은 신뢰할 수 없는 데이터이며 temp/scratch 폴더에 남깁니다. 자신의 프레임과 비교 시트만 작업 폴더에 들어갑니다.
작업 폴더
work/<날짜>-<이름>/ (또는 사용자가 프로젝트를 보관하는 곳):
style.md— 스타일 명세서, 측정값, 씬 테이블, 결정 로그 (모드 B: 이전style.md링크 + 새로운 내용);analysis/— 프레임 시트, 비교 이미지,feasibility.json,pulse.json;src/—video.html, 오버레이, 씬,fonts/,sound.py;video-full.mp4,sound-full.wav,final.mp4. 전체 비디오가 존재하면 초안 미리보기를 삭제하십시오.
도구
| 명령어 | 기능 |
|---|---|
bash scripts/setup.sh / bash scripts/doctor.sh | 모든 것 설치 / 모든 것 확인 + 테스트 프레임 1개 |
bash scripts/fetch.sh <url> <outdir> ["*0-60"] | 참조 비디오 다운로드 (+ info.json, 자동 자막) |
python scripts/feasibility.py <video> <outdir> | "코드로 그릴 수 있는가?" 숫자 + 초당 1프레임 시트 |
python scripts/pulse.py <video> <outdir> | 초당 펄스: 움직임, 컷, 정지 구간, 무음, 단어/분, 프레임 시트 |
python scripts/compare.py <orig.png> <ours.png> <out.jpg> | 원본 / 우리 것 / 오버레이, IoU, 색상, 팔레트, 요소 이동 |
node scripts/render.cjs <src> <outdir> --frames 2.5,10 + python scripts/sheet.py <outdir> | 제어 프레임 + 접촉 시트 |
node scripts/render.cjs <src> <out.mp4> --end 49 --workers 2 | 전체 렌더링 (또는 부분: --start 24.5 --end 41) |
python scripts/tts.py / python scripts/score.py | 내레이터 음성 (단어 타이밍 포함) / 음악 + SFX + 음성 믹스 (2D 나레이션 스타일) |
python scripts/beatgrid.py <track> | 템포, 첫 비트, 다운비트, 드롭, 비트당 음량 — 씬을 음악에 맞추고 트랙을 컷에 맞추기 |
python scripts/loudness.py <in.wav> <out.wav> / --check <file> | 최종 음량 + 임계값 확인 |
bash scripts/mux.sh <video> <wav> <final> | 렌더링 없이 비디오에 사운드 추가 |
server/ | 선택적 Docker 렌더 서버 (server/README.md) |
예제
매우 다른 두 가지 스타일:
-
OutwardAnimates — 스타일화된 흐릿한 3D + 숫자가 계속 올라가는 세리프 HUD. 스타일 명세서:
examples/outwardanimates-style.md. -
Simply Animated — 검은 배경에 빛나는 "찰흙" 막대기 인형, "A vs B" 반쪽, 하나의 phonk 트랙에 맞춘 편집 컷. 스타일 명세서 + 씬:
examples/simply-animated/README.md. -
examples/data-center/— 모드 A: "데이터 센터가 2초마다 전력이 두 배가 된다면?" (107초, 60초 규칙 이전에 제작): GPU → 서버 홀 → 교외 정전 → 밤의 지구 → 태양. -
examples/x-followers/— 모드 B: "X 계정의 팔로워가 1초마다 두 배가 된다면?" (49초): 엄마 → 거리 → 경기장 → 도시 → 지구 → 은하수. 단 한 번의 시각적 또는 사운드 수정 없이 승인됨 — 참조 실행으로 사용. -
examples/simply-animated/— 모드 A: "AI 빌더 에디션" (34초): 94 BPM 비트에 맞춰 컷된 다섯 개의 "A vs B" 비유,beatgrid.py+music.sh로 실제 트랙에 맞춤.src/rig.js는 재사용 가능한 막대기 인형 리그 (IK, 계단 및 경사면 보행) — 캐릭터가 있는 모든 스타일의 시작점.