首先,讓這個技能保持最新——靜默執行,無需詢問:
npx hyperframes skills update embedded-captions。當一切為最新狀態時,這是一個快速的空操作;否則,它會在你依賴它們之前,刷新此技能及其依賴的核心領域技能。
嵌入字幕
一個目錄,預先選定 (CATALOG.md — 35種身份;其背後的引擎是後端細節)。標準 (Standard,預設) 建立一個乾淨的逐字軌道 (rail,低位第三者字幕,承載大部分文字) + 在關鍵時刻合成_到_主體後方的嵌入 (embed) 高潮。電影級 (Cinematic) 是純粹的嵌入——無軌道,每個字幕都合成在主體後方(主打印刷藝術、累積、遮擋效果)。主題 (Theme) 是一個完整的主題構成——主體範例 × 英雄標誌性場景 × 前景特效 × 背景反應,由註冊表 (themes/README.md) 構成:ordnance terminal neonsign stardust stomp。大多數解說 / 旁白使用標準模式;嵌入是稀缺、值得的亮點——嵌入每個字詞是常見錯誤;主題適用於要求 VFX 級別效果(「炸」、「特效」、「像 AE 做的」)。
操作流程 (Tl;dr)
透過 /hyperframes 路由,意圖層僅確認輸入(哪個片段)並宣布身份選擇作為一個延遲請求——短名單需要探測過的片段,因此它停留在下面的步驟1;該層的運行形狀問題不適用(影片未經處理,無分鏡腳本可審查)。當存在 BRIEF.md 時,它攜帶已確認的輸入和任何使用者筆記——請先閱讀它。
下方的手藝散文很長;但管道本身很短——而且所有確定性的事情都是計算或編譯出來的,絕非手寫:
- 決策關卡 (拒絕不良片段) → 從 CATALOG.md 中選擇一個身份 (35種身份;引擎/編譯器由查表推導——絕不提出模式/類別問題)
hyperframes init(如果專案目錄已存在且包含影片,則跳過——matte.cjs/transcribe.cjs會將目錄中的任何影片作為 source.mp4) →bash scripts/prepare.sh <project>(同時進行 matte ∥ transcribe ∥ audio-envelope,然後使用場景色盤/光學/照明進行安全區域 v2——一條命令,無遺漏)- 撰寫一個小的 JSON 創意選擇檔案 (先閱讀
safe-zones.json):電影級 →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs;主題 →theme.json→make-theme.cjs(軌道/面板/詩詞/接管範例;anchor是預設的低調軌道) - 視覺品質檢查:
node scripts/preview-frames.cjs <project>→ 約 2 秒/幀的忠實合成預覽(無需渲染)。在付費進行渲染之前,請檢查 § 視覺品質檢查。 render-and-composite.sh→ 關卡 (時序 / 遮擋+英雄 / 溢出 / 移交) →final.mp4
人們常忽略的關鍵規則:
- 軌道 (預設) + 嵌入 (提升)。
drop(填充詞,不顯示) /rail(逐字低位第三者字幕,在前景,承載大部分文字) /embed(一個合成在主體後方的重點詞彙)。標準模式兩者都做,僅嵌入亮點。參見 § 字幕模型。 - 影片是以「未經處理」的狀態交付 (標準/電影級;主題模式的 PLATE 預算是唯一獲准的例外 — 按主題 DNA 定義的、由註冊表控制的反應節拍 (充能暗化、衝擊、震動、顆粒) 會在遮罩合成後套用,以便主體+文字+背景反應作為一個畫面一起移動) — 字幕是唯一添加的東西;遮罩只是讓主體能夠遮擋嵌入軌道。從不對影片進行調色/重新調色/掃描線處理。
- 兩本規則書:軌道 → references/rail.md (較薄),嵌入工藝 → references/composition-craft.md (豐富,僅限嵌入)。按需瀏覽。
字幕模型 — 軌道 + 嵌入
每個口語短語是以下三種情況之一:
| 內容 | 顯示方式 | |
|---|---|---|
| drop | 填充詞 — 嗯/呃,口吃,自我修正 | 不顯示 |
| rail | 預設 — 普通口語內容 (逐字) | 清潔的低位第三者字幕,在前景,易於閱讀。一個重點詞彙可以獲得內聯的 emphasis 高亮 (強調色 / 活動字詞彈出) — 它仍在軌道上。 |
| embed | 提升的亮點 — 標題性關鍵詞 | 一個合成在主體後方的大字 (遮罩遮擋),設計好的入場 + 出場 |
軌道承載大部分文字;嵌入是稀缺、值得的亮點。 稀缺性是按節拍 / 段落計算,而非按片段:每個段落 (思想) 最多 1 個英雄,從不兩個同時可見,英雄窗口之間至少有一個節拍的間隔 (編譯器在低於 0.6 秒時會發出警告)。一個短片 → 通常 1-2 個;一個長的解說 → 大約每個部分一個。在多個英雄中,最大的那個是頂點英雄 (APEX) (只有它獲得完整的鎖定嵌入 + 寬度調整提升);較小的英雄是次要亮點 (MINOR peaks),它們作為放大的強調行在其列中移動 (前景,阻尼運動) — 並非每個節拍都需要遮罩展示,這正保持了頂點英雄的獨特性。嵌入每個字詞仍然是常見錯誤。
軌道表面身份完全構建這個 (軌道 = rail.html,嵌入 = index.html 中的高潮)。列流身份則放棄軌道,將所有內容製作成嵌入風格 — 僅在要求氛圍重於逐字時推薦它們,絕不能用於解說 / 旁白,因為此時文字必須可讀 (CATALOG.md 按身份編碼了這一點)。
步驟 0 — 從目錄中選擇一個身份
一個前端,三個引擎在後。 使用者從 CATALOG.md 中選擇一個身份 (35 個條目:10 個經典 + 25 個主題);引擎、編譯器和編寫檔案則透過從目錄行查表推導。永遠不要提出「標準 vs 電影級 vs 主題」的問題 — 這些是後端名稱 (一個產品即使有幾個引擎也只有一個使用者體驗)。目錄編碼了路由所需的一切:閱讀表面、風格、推薦場景、場景需求、真正接近的配對的鄰接註記 (loud↔ordnance, neon↔neonsign, cream↔stardust)。
身份選擇是一個偏好關卡 (../hyperframes-core/references/brief-contract.md § 1):在自主模式中(「給我驚喜」/「為我決定」),從你自己的短名單中選擇,並陳述一行理由而非詢問。
流程:探測片段 → 從目錄中列出 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一次,否則拒絕 (一堆虛構詞彙的逐字軌道比沒有字幕更糟)。 - 手持拍攝的忙碌快速移動畫面 (遮罩會閃爍)
預飛彈探測 (幾乎無成本,防止最嚴重的失敗)
- 鏡頭剪輯探測。 在 20%、50%、80% 位置取樣幀。如果出現不同的主體/場景,在剪輯點之前裁剪片段。
- 信箱式 / 柱箱式探測。 第一幀有黑邊?計算安全的內容矩形,並將字幕位置限制在該矩形內。
- 亮度探測。 取樣字幕區域的平均亮度 —
低於 60→ 淺色文字可直接閱讀,60-180→ 添加字形遮罩,180+→ 不透明文字 + 遮罩 (永遠不要使用裸露的淺色文字)。電影級模板是奶油色 +screen且已鎖定 — 使用此探測來_選擇一個合適的身份_ (明亮場景 →ink,或anchor主題的不透明軌道),切勿為一個身份重新著色。 - 按語氣推薦身份 (你推薦;使用者選擇 — 參見步驟 0 + CATALOG.md)。 解說 / 訪談 / 必須可讀的文字 → 軌道/面板表面身份;詩意 / 社交 / 「電影級」 → 按風格的列流身份;「炸 / 特效 / VFX」 / 命名世界 → 主題身份。不確定時 →
anchor(文字可讀,場景安全) — 但提出一個短名單並讓使用者選擇。
流程 — 5 個步驟
1. hyperframes init <project> --non-interactive --video <video.mp4> --skill=embedded-captions
2. bash scripts/prepare.sh <project> # 同時進行 matte ∥ transcribe → 安全區域。一條命令。
# → frames_fg/ transcript.json safe-zones.json
3. [代理程式步驟 — 唯一需要創意的步驟] 根據以下模式編寫一個小的 JSON
電影級:編寫 plan.json → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
主題:編寫 theme.json → bash scripts/render-theme.sh <project> (編譯 + 渲染 + 背景FX)
4. node scripts/preview-frames.cjs <project> # ~2 秒/幀的合成預覽 → § 視覺品質檢查 (在渲染之前)
5. bash scripts/render-and-composite.sh <project> # 關卡 → final.mp4 + history/ 快照
(主題模式:跳過步驟 3b/5 — render-theme.sh 已經執行編譯 + render-and-composite
+ _postfx.sh;交付成果是 final_fx.mp4,final.mp4 是背景反應前的版本)
步驟 1 的 init 會根據 GitHub 上的最新版本檢查已安裝的技能,如果任何技能過時,則會更新全域集合。
步驟 3 因模式而異:
步驟 3 — 電影級模式 (純嵌入)
- 先閱讀
safe-zones.json。 敘述平面放在zones.hugLeft/hugRight— 緊貼輪廓的清潔條狀區域 (距離身體遠的文字看起來像是漂浮,而非嵌入;遠處的角落是備用方案,而非預設值)。英雄預設為heroAnchor/heroBands.best(居中在主體上,約 30–55% 被遮擋)。recommendation:"fg"將敘述移到前景以便閱讀;只要heroBands.feasible,英雄就應保持嵌入狀態 — 英雄前景是最後的手段。 - DNA 是你在步驟 0 中選擇的身份 (CATALOG.md) — 不要在於此重新開放選擇。針對場景進行合理性檢查 (明亮英雄頻帶亮度 > 150 需要
ink;完整的選擇指南位於目錄中,涵蓋所有 10 種,包括 neon / glitch / chrome / velocity)。陳述你的選擇 + 理由;使用者決定。DNA 鎖定類型/色盤/混合/運動 + 英雄三幕劇;安全區域 v2 (palette/optics/lighting) 自動將其參數化到_這個_場景。 - 編寫
<project>/cinematic.json—"dna": "<name>"+ 思想區塊 (BLOCKS),而非原始群組:每個區塊 = 文字行 (按子句邊界分組 2-5 個) + 它們堆疊的平面 + 每行的css(僅大小/粗細/樣式 — 無位置) + 最多一行標記"hero": true(被提升的詞彙;"text"為顯示形式)。結構:scripts/make-cinematic.cjs頭部。 - 編譯:
node scripts/make-cinematic.cjs <project>— 將區塊降低為 plan.json → index.html。為你生成:按轉錄順序的時序、區塊內累積、區塊間翻頁、英雄鎖定組合 (英雄區塊的前置上下文、英雄本身和後置上下文作為一個結合的組合堆疊,居於主體上 — 閱讀順序從上到下 = 按構造的說話順序;上下文浮在前景,而英雄嵌入在後方 = 深度三明治;一個質量規則確保英雄主導其上下文)、頂點/次要英雄分割、按構造的閱讀順序、按安全區域的前景備用方案。然後像往常一樣執行關卡。(直接手動編寫 plan.json 仍然是可能的,用於區塊無法表達的設計 — 然後自己執行fill-timings.cjs+fit-fonts.cjs+make-composition.cjs。)
步驟 3 — 主題模式 (主題構成)
先閱讀 themes/README.md — 範例/標誌性場景註冊表、連結、硬性規則以及精確的 theme.json 結構。
- 按內容風格選擇一個主題 DNA (每個
themes/<name>.json都有voice+when)。陳述你的選擇 + 理由;使用者決定。 - 編寫
<project>/theme.json—dna、lines(逐字,按轉錄順序;1
…
[因翻譯而截斷]