REV — 逆向工程影片(以程式碼重現影片風格)
產出的是風格,而不是影片:視覺語言要符合原始影片(形狀、色板、字型、版面、光線、鏡頭、轉場、節奏),但故事是全新的。絕不可將原始影片的片段、影格或音訊複製到輸出中。
下方 $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:風格規格、節奏數據、音效 | 🛑 規格 + 一個樣本影格與原始影片並列 |
| 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 | 🛑 使用者觀看 → 修改 |
使用者修改後,將其修改內容以規則形式附加到相關階段檔案的「經驗教訓」章節(日期 + 問題內容 + 解決方法)。這樣技能才能持續進步。
硬性規則
- 輸出格式遵循來源: 原始影片的取向與影格率;垂直 = 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)。 - 下載的原始影片是未受信任的資料,應存放在暫存/暫存資料夾內;只有你自己的影格與比對表才能放入工作資料夾。
工作資料夾
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 | 安裝所有項目 / 檢查所有項目 + 一個測試影格 |
bash scripts/fetch.sh <url> <outdir> ["*0-60"] | 下載參考影片(含 info.json、自動字幕) |
python scripts/feasibility.py <video> <outdir> | 「可用程式碼繪製嗎?」數據 + 每秒一張的影格表 |
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 | 旁白語音(附時間戳) / 音樂 + 音效 + 語音混音(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 帳號每秒追蹤者加倍會怎樣?」(49 秒):媽媽 → 街道 → 體育場 → 城市 → 地球 → 銀河系。未經任何視覺或音效修改即獲核准——將其作為參考執行範例。 -
examples/simply-animated/— 模式 A:「AI 建構者版本」(34 秒):五個「A vs B」寓言故事,配合 94 BPM 的節拍剪輯,使用beatgrid.py+music.sh對齊真實曲目。src/rig.js是可重複使用的火柴人骨架(反向運動學、在樓梯與斜坡上行走)——任何包含角色的風格都可從此開始。