內嵌字幕
一個目錄,前端挑選(CATALOG.md — 17 種身份;背後的三個引擎是後端細節)。Standard(預設)建構一個乾淨的逐字 rail(承載大部分文字的下方第三字幕) + 一個 embed 高潮合成 在 場景中主體之後。Cinematic 是純 embed — 沒有 rail,每條字幕都合成在主體之後(英雄字型、累積、遮蔽效果)。Theme 是一個完整的主題構成 — 主體範例 × 英雄場景 × 前端特效 × 圖層反應,由登錄檔組合(themes/README.md):ordnance terminal neonsign stardust stomp。大部分解說/旁白使用 Standard;embed 是稀缺、值得的高潮 — 每個字都 embed 是常見錯誤;Theme 適用於 VFX 等級的要求(「炸」、「特效」、「像 AE 做的」)。
操作流程(TL;DR)
以下的工藝散文很長;管線本身很短 — 所有確定性內容都是計算或編譯的,絕非手寫:
- 決策閘門(拒絕不良片段)→ 從 CATALOG.md 挑選一個身份(17 種身份;引擎/編譯器透過查表推導 — 絕不顯示模式/類別問題)
hyperframes init(如果專案目錄已存在且包含影片則跳過 —matte.cjs/transcribe.cjs會將目錄中的任何影片視為 source.mp4)→bash scripts/prepare.sh <project>(去背 ∥ 轉錄 ∥ 音訊包絡同時進行,然後安全區域 v2 搭配場景調色板/光學/照明 — 一條指令,無所遺漏)- 撰寫一個小型 JSON 創意設定檔(先讀取
safe-zones.json): Cinematic →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs; Theme →theme.json→make-theme.cjs(rail/panel/poem/takeover 範例;anchor是安靜的 rail 預設) - 視覺 QA:
node scripts/preview-frames.cjs <project>→ 約 2 秒/幀的忠實合成預覽(無需渲染)。在付費渲染前請檢查 § 視覺 QA。 render-and-composite.sh→ 閘門(時機/遮蔽+英雄/溢出/交接)→final.mp4
人們常忽略的關鍵規則:
- rail(預設)+ embed(提升)。
drop(填充詞,不顯示)/rail(逐字下三分之二字幕,在前方,承載大部分文字)/embed(合成在主體後方的高潮詞)。Standard 模式兩者都做,僅嵌入高潮詞。參見 § 字幕模型。 - 影片原封不動交付(Standard/Cinematic;Theme 模式的 PLATE 預算是唯一允許的例外 — 每個主題 DNA 定義的登錄閘門反應節拍(充電變暗、衝擊、搖晃、顆粒),在去背合成之後套用,讓主體+文字+圖層作為一個畫面移動) — 字幕是唯一添加的內容;去背只是讓主體遮蔽嵌入軌道。絕對不要對素材進行調色、重新著色或掃描線處理。
- 兩本規則書:rail → references/rail.md(簡潔),embed 工藝 → references/composition-craft.md(豐富,僅 embed)。依需要瀏覽。
字幕模型 — rail + embed
每個口語短語是三種之一:
| 是什麼 | 如何顯示 | |
|---|---|---|
| drop | 填充詞 — 嗯/呃、口吃、自我修正 | 不顯示 |
| rail | 預設 — 一般口語內容(逐字) | 乾淨的下方第三字幕,在前方,可讀。強調詞可以獲得內聯 emphasis 高亮(強調色/動態單字突出)— 它保留在 rail 上。 |
| embed | 提升的高潮 — 標題節拍 | 一個大字合成 在主體之後(去背遮蔽),設計進場+出場 |
Rail 承載大部分文字;embed 是稀缺、值得的高潮。 稀缺是 每個節拍/區塊(而非每個片段):每區塊(想法)≤1 個英雄,絕不兩個同時可見,英雄視窗之間至少一個節拍的間隔(編譯器在低於 0.6 秒時會發出警告)。短片段 → 通常 1–2 個;長解說 → 大約每個部分一個。在多個英雄中,最大的撰寫英雄是 APEX(它獨自獲得完整的鎖定 embed + 寬度適配提升);較小的是 MINOR 高峰,它們在其欄位中作為超大的強調行(前景,阻尼運動)— 並非每個節拍都需要去背展示,這正是讓 apex 成為事件的原因。每個字都嵌入仍然是常見錯誤。
Rail 表面身份完全建構這一點(rail = rail.html,embed = index.html 中的高潮)。欄位流程身份放棄 rail,讓所有內容都採用 embed 風格 — 僅在要求氣氛而非逐字內容時推薦它們,絕不用於解說/旁白(其中文字必須可讀)(CATALOG.md 為每個身份編碼了此要求)。
步驟 0 — 從目錄中挑選一個身份
一個前端,三個引擎在後。 使用者從 CATALOG.md 挑選一個身份(17 個條目:12 個經典 + 5 個主題);引擎、編譯器和撰寫檔案透過從目錄列查表推導。絕對不要將「Standard vs Cinematic vs Theme」作為問題提出 — 這些是後端名稱(一個產品即使有數個引擎也只有一個 UX)。目錄編碼了路由所需的一切:閱讀表面、聲音、推薦對象、場景需求、真正相似配對的鄰近註記(loud↔ordnance、neon↔neonsign、cream↔stardust)。
程序:探查片段 → 從目錄中簡短列出 2–3 個身份 → 推薦一個並附上一行理由 → 使用者選擇 → 撰寫該身份的檔案。身份是引擎鎖定的(無跨組合;開啟一個身份是一個驗證事件 — 參見 dna/README.md)。
始終先提出你的推薦,讓使用者選擇後再進行撰寫。不要默默使用預設值。
(完整的身份表位於 CATALOG.md — 路由的單一事實來源。以下的引擎文件描述了每個後端的撰寫合約。)
推薦啟發法:使用 CATALOG.md 中的「簡短列出啟發法」— 它們是身份層級的(例如「炸」會簡短列出 ordnance/stomp/terminal/loud 並根據什麼應該爆炸來選擇),絕非類別層級。不確定 → anchor。
- Cinematic → 為鎖定模板撰寫
plan.json,由make-composition.cjs編譯。 - Theme → 閱讀 themes/README.md,撰寫
theme.json,執行scripts/render-theme.sh(編譯 + 渲染 + 圖層反應 → final_fx.mp4)。
決策閘門 — 首先執行
在任一模式之前,先探查影片並分類場景。
ffprobe <video.mp4> # 規格
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # 在 20/50/80% 處
閱讀樣本。在以下情況拒絕:
- 多位說話者/硬剪輯(分割並渲染每個鏡頭,或拒絕)
- 無人類主體(此技能專為講話式頭像設計)
- 少於 3 秒、無語音、或臉部從未清晰可見 —
transcribe.cjs會在音訊接近靜音時發出警告(Whisper 會在無聲中幻覺出「Thank you.」等詞);注意警告並拒絕,而非為編造的詞添加字幕 - 來源已含有燒錄字幕/隱藏字幕/大量文字圖形 — 添加第二個字幕系統會產生衝突,且素材原封不動交付(無覆蓋/修補)。燒錄文字通常僅在片段中間出現:取樣一個 1fps 縮圖索引(
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png),不要相信 3 個隨機幀。 - 轉錄稿品質差 — 非母語/重口音語音可能被轉錄為看似正確的亂碼。在撰寫前先理智檢查
transcript.json;如果它無法解析為語言,則嘗試WHISPER_MODEL=medium一次,否則拒絕(一個逐字 rail 的編造詞比無字幕更糟)。 - 手持晃動且快速運動(去背會閃爍)
飛行前探查(無成本,防止最糟的失敗)
- 鏡頭剪輯探查。 在 20%、50%、80% 處取樣幀。如果出現不同的主體/場景,則在剪輯前修剪片段。
- 信箱黑邊/柱狀黑邊探查。 第一幀有黑條?計算安全內容矩形並將字幕放置限制在內部。
- 亮度探查。 取樣字幕區域的平均亮度 —
低於 60→ 淺色文字直接可讀,60-180→ 添加字形遮罩,180+→ 不透明文字 + 遮罩(絕不使用裸露淺色文字)。Cinematic 模板是 cream+screen且鎖定的 — 使用此探查來 選擇合適的身份(明亮場景 →ink,或使用不透明 rail 的anchor主題),絕不重新著色某個身份。 - 根據語氣的身份推薦(你推薦;使用者選擇 — 參見步驟 0 + CATALOG.md)。 解說/訪談/必須閱讀的文字 → rail/panel 表面身份;詩意/社交/「電影感」 → 按註冊表的欄位流程身份;「炸/特效/VFX」/命名世界 → 主題身份。不確定時 →
anchor(文字可讀,場景安全)— 但提出一個簡短清單讓使用者選擇。
管線 — 5 個步驟
1. hyperframes init <project> --non-interactive --video <video.mp4> --skip-skills
2. bash scripts/prepare.sh <project> # 去背 ∥ 轉錄(平行)→ 安全區域。一條指令。
# → frames_fg/ transcript.json safe-zones.json
3. [代理步驟 — 唯一的創意步驟] 依據模式撰寫一個小型 JSON;參見下方
Cinematic:撰寫 plan.json → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
Theme: 撰寫 theme.json → bash scripts/render-theme.sh <project> (編譯 + 渲染 + 圖層特效)
4. node scripts/preview-frames.cjs <project> # 約 2 秒/幀的合成預覽 → § 視覺 QA(在渲染之前)
5. bash scripts/render-and-composite.sh <project> # 閘門 → final.mp4 + history/ 快照
(Theme 模式:跳過步驟 3b/5 — render-theme.sh 已執行編譯 + render-and-composite
+ _postfx.sh;交付物是 final_fx.mp4,final.mp4 是預圖層反應)
步驟 3 因模式而異:
步驟 3 — Cinematic 模式(純 embed)
- 先讀取
safe-zones.json。 旁白平面位於zones.hugLeft/hugRight— 緊貼輪廓的乾淨條帶(遠離主體的文字看起來像浮動而非嵌入;遠角是備用方案,非預設)。英雄預設位於heroAnchor/heroBands.best(置中於主體,約 30–55% 被遮蔽)。recommendation:"fg"將旁白移到前方以提高可讀性;英雄只要heroBands.feasible就保持嵌入狀態