首先,讓此技能保持最新狀態——靜默執行,無需詢問:
npx hyperframes skills update talking-head-recut。如果一切已是最新,這個指令會快速完成,不執行任何操作;否則,它會在此技能及其依賴的核心領域技能被使用前,先將其更新至最新版本。
Talking Head Recut 是做什麼的?
Talking Head Recut 會擷取一段本地影片,這部影片會完整播放,並在其上疊加一系列經過時間設計的 圖形卡片——包含動態標題、下方三分之一資訊條、數據引用、引言、側邊面板、子母畫面——並與影片中的對話內容同步。AI 代理會負責設計這些卡片(包括時間點與內容),並直接在對話中撰寫每張卡片的 HTML,然後將所有卡片組合成單一的合成 HTML,最後透過 hyperframes 渲染成 MP4 影片。這裡沒有固定的卡片類型列表,也沒有預設的卡片結構——疊加的卡片樣式完全取決於影片轉錄稿的實際內容。
在開始製作前,請先確認路線。 此技能是為現有的談話性頭像影片包裝 設計好的圖形卡片(標題、下方三分之一資訊條、數據引用、引言、側邊面板、PiP)。如果使用者想要的是純字幕/隱藏式字幕(將口語文字轉為文字顯示)→ 請使用
/embedded-captions;如果是一個單一、簡短的無旁白元素(例如一個Logo動畫/下方三分之一資訊條)→ 請使用/motion-graphics。原始影片會原封不動地播放——重新調整時間、重新上色、重新構圖、重新排序或調整音訊,這些都屬於非線性剪輯(NLE)的工作範疇,不在本技能的處理範圍內。如果是從 URL、主題或 PR 開始製作影片 → 請參閱其他建立影片的工作流程。不確定是疊加卡片還是字幕?請先閱讀/hyperframes。
本技能是
embedded-captions的圖形包裝版本。 字幕功能是將_口語文字_以可讀性高的文字形式顯示;而本技能則是在正在播放的影片上添加_設計好的圖形_。單純的字幕 → 請使用embedded-captions。從零開始建立影片 → 請參閱其他建立影片的工作流程(如product-launch-video/faceless-explainer/ …)。
可在工作目錄中檢查的中間檔案:
metadata.json— 影片的時長、寬度、高度、影格率audio.mp3— 提取出來的音訊transcript.json— 一個扁平的單字陣列[{ text, start, end }, …](由 Whisper 產生;沒有segments,也沒有words包裝)storyboard.json— 一個輕量化的卡片大綱(AI 代理的規劃)public/cards/card-XX.html— 每張卡片的 HTML 片段public/index.html— 最終組合完成的 HTML 檔案output.mp4— 渲染完成的影片
CLI 指令解析
# hyperframes — 轉錄(本機 Whisper)+ 將組合完成的 HTML 渲染成 MP4
npx hyperframes --help
此技能完全依賴於 hyperframes CLI 及系統中的 ffmpeg / ffprobe。轉錄功能是透過本機的 Whisper 模型,經由 hyperframes transcribe 完成——無需第三方服務、API 金鑰或任何速率限制的代理伺服器。
工作流程
1. 檢查環境
npx hyperframes doctor # 檢查 ffmpeg、無頭瀏覽器、渲染相依性
# 確認已打包的資源:
ls "<SKILL_DIR>/assets/fonts" "<SKILL_DIR>/assets/vendor/gsap.min.js"
必要條件:
ffmpeg/ffprobe(系統層級安裝)<SKILL_DIR>/assets/fonts/*.woff2、<SKILL_DIR>/assets/vendor/gsap.min.js(已打包在此技能中,在步驟 9 時會將其複製到工作目錄)
轉錄功能不需要任何金鑰 — hyperframes transcribe 會在本機執行 Whisper(步驟 4)。
在 macOS 上進行 hyperframes render 時,強烈建議設定以下環境變數:
export PRODUCER_BROWSER_GPU_MODE=hardware
2. 建立工作目錄
所有產出的檔案都會放在 videos/<project-name>/ 目錄下——這與其他影片工作流程(如 product-launch-video / faceless-explainer / pr-to-video)使用的慣例相同。請保持終端機的當前工作目錄(cwd)為工作區的根目錄;所有後續的指令都會在根目錄下的這個子目錄中進行操作。
VIDEO_PATH="/absolute/path/input.mp4"
WORK_DIR="videos/$(basename "$VIDEO_PATH" | sed 's/\.[^.]*$//')"
mkdir -p "$WORK_DIR"
3. 提取音訊與中繼資料
# 中繼資料 — 時長、寬度、高度、影格率
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height,r_frame_rate \
-show_entries format=duration -of json "$VIDEO_PATH" > "$WORK_DIR/metadata.json"
# 音訊
ffmpeg -y -i "$VIDEO_PATH" -vn -acodec libmp3lame -q:a 2 "$WORK_DIR/audio.mp3"
輸出檔案:metadata.json(讀取 width/height/duration;影格率即 r_frame_rate 這個分數計算後的結果,例如 30000/1001 → 29.97)+ audio.mp3。
4. 轉錄
npx hyperframes transcribe "$WORK_DIR/audio.mp3" -d "$WORK_DIR" --json --model small.en
使用本機的 Whisper 模型進行轉錄——無需 API 金鑰、無代理、無速率限制。此指令會在工作目錄中寫入一個單字層級的 transcript.json 檔案(每個字擁有 text + start / end 時間戳記)。請讀取此檔案以獲取驅動步驟 6 卡片時間點的單字/句子時間資訊;如果需要段落層級的區塊,可以根據標點符號或停頓自行將單字分組為句子。
請注意要將時間點限制在影片時長內。 Whisper 回傳的最後一個字的 end 時間戳記可能會略微超過實際的影片長度——請確保將每張卡片的 endSec 和 composition.durationSeconds 限制在 metadata.json 中的時長內,否則渲染出的影片會在原始影片結束後出現黑畫面。
5. 校正轉錄稿
transcript.json 是一個由單字物件組成的扁平陣列——[{ "text": "...", "start": s, "end": s }, …](沒有 segments 陣列,也沒有 words 包裝;每個單字的鍵是 text)。請讀取它並修正明顯的語音辨識錯誤:
- 同音異義詞、產品名稱、專業術語、標點符號
- 直接在該單字的
text欄位上進行編輯;保留其start/end時間戳記 - 沒有預先分組的
segments陣列——請自行將單字分組為句子(根據句尾標點符號/停頓進行分割),以便在需要段落層級的區塊來規劃卡片時間點時使用
6. 擬定輕量化的故事板(在對話中進行)
此步驟不涉及任何 CLI 指令。 請讀取 transcript.json + metadata.json 並直接設計卡片。storyboard.json 是給 AI 代理內部規劃用的產出檔案——沒有任何 CLI 指令會讀取它;它存在的目的是讓你能在撰寫每張卡片的 HTML 之前,先清楚地思考時間點和內容。請保持以下範例所示的大綱結構一致性,以便同一個大綱能夠驅動你在步驟 9 中撰寫的合成 HTML:
{
"schemaVersion": 3,
"composition": {
"fps": 30,
"width": 1080,
"height": 1920,
"durationSeconds": 121.2,
"layout": "portrait",
"themeId": "noir",
"seed": 42
},
"videoTrack": {
"sourcePath": "input-video.mp4",
"startSec": 0,
"endSec": 121.2,
"bounds": { "x": 0, "y": 0, "width": 1080, "height": 1920 }
},
"subtitles": { "enabled": false },
"cards": [
{
"id": "card-01",
"intent": "用講者當時在午夜提出的焦慮問題作為鉤子",
"startSec": 0.5,
"endSec": 13.0,
"accentIndex": 0,
"zone": "fullscreen",
"contentHints": {
"kicker": "一個誠實的問題",
"title": "那個在晚上 11 點提出的靈魂拷問",
"detail": "客戶長達 60 秒的語音訊息:'如果人民幣升值,這是否代表我的美元保單會虧損?'"
}
}
]
}
必要卡片欄位:
| 欄位 | 類型 | 用途 |
|---|---|---|
id | string | 用於卡片 HTML 及 GSAP 選擇器的穩定識別碼 |
intent | string | 以自然語言描述的說明;會提供給卡片合成步驟參考 |
startSec / endSec | number | 以秒為單位的時間點(endSec 必須大於 startSec) |
accentIndex | 0 | 1 | 2 | 3 | 4 | 指定此卡片從 5 種主題強調色中選用哪一種 |
zone | 列舉值(請見下方說明) | 卡片在畫布上的位置 |
contentHints | object | 自由格式的屬性包;AI 代理會將標題列/主標題/詳細說明/數據/引言等內容放在此處 |
archetype (可選) | string | 你可以附加的自由格式標籤,用來記住卡片的模式;若省略則表示自由格式,這是預設行為 |
transition (可選) | 列舉值: cut | fade | slide | wipe | 宣告式的卡片間轉場效果 |
五種 zone 值:
| zone 欄位 | 解析後的邊界 | 使用時機 |
|---|---|---|
fullscreen | 覆蓋整個畫布 | 關鍵時刻、大數字、座右銘 |
whiteboard-area | 內縮 40px 邊距(或直式影片高度的 45%) | 密集的數據/有註解的內容 |
lower-third | 底部 30% 的區域 | 在可見的影片上進行註解 |
side-panel | 橫式: 右側 42% ;直式: 底部 40% | 一側顯示數據,另一側顯示影片 |
video-overlay | 整個畫布,預期卡片背景為透明 | 在滿版影片上疊加註解 |
當你在步驟 9 組合合成 HTML 時,請根據上表將每張卡片的 zone 解析為卡片容器元素上的實際像素邊界。影片邊界在合成層級設定一次(videoTrack.bounds);如果想讓影片在不同卡片之間產生「移動」效果,請在合成 HTML 的 <script> 標籤中撰寫 GSAP 動畫來控制 #video-wrap 元素(請參閱步驟 9)。
沒有預設的卡片角色,也沒有預設的故事弧線。 卡片應根據影片實際內容來產生——可以是全引言或全數據,可以用一個數字開場,也可以用一個故事開場。讓轉錄稿來決定節奏。
需要多少張卡片?——根據影片時長與資訊密度自動推斷。 沒有固定的上限。請根據影片時長選擇一個基礎節奏,然後根據資訊密度進行調整。唯一的下限是固定的:最少 5 張卡片,即使是短片也要保持節奏感。
步驟 1 — 按時長決定基礎節奏(在中等密度下,每張卡片的建議時長):
| 影片時長 | 基礎節奏(秒/每張卡片) | 理由 |
|---|---|---|
| < 60 秒(短影片) | 6–8 秒 | 觀眾期望短格式內容有快速的節奏變化 |
| 60 秒 – 3 分鐘 | 8–12 秒 | 一般的社交媒體影片節奏 |
| 3 – 10 分鐘 | 12–20 秒 | 給觀眾喘息空間;每張卡片承載更多內容 |
| 10 – 30 分鐘 | 20–35 秒 | 長格式講座/訪談的節奏 |
| > 30 分鐘 | 30–60 秒 | 接近章節式、片段式的感覺 |
步驟 2 — 密度乘數(乘以基礎節奏):
| 轉錄稿中的跡象 | 乘數 | 效果 |
|---|---|---|
| 高密度 — 很多數字、不同的主張、急促的節奏、像列舉清單一樣、每 1–2 句話就是一個新想法 | × 0.7 | 切換更快,卡片更多 |
| 中等密度 — 數據與敘述混合的流暢節奏 | × 1.0 | 基礎節奏 |
| 低密度 — 一個延伸的故事、反覆重新詮釋、緩慢且反思性的節奏、單一論點逐步展開 | × 1.5 | 切換更慢,卡片更少 |
步驟 3 — 計算:
secPerCard = 基礎節奏 × 密度乘數
cardCount = max(5, round(影片時長秒數 / secPerCard))
舉例說明(請注意——沒有上限限制;較長的影片自然會產生更多卡片):
- 30 秒短片,單一重點(低密度) → 7 × 1.5 = 10.5 秒/卡片 → round(30/10.5)=3 → 限制為5張卡片
- 60 秒反思性獨白(低密度) → 10 × 1.5 = 15 秒/卡片 → 4 → 限制為5張卡片
- 121 秒談話式頭像,數據豐富(高密度) → 10 × 0.7 = 7 秒/卡片 → 17張卡片
- 5 分鐘訪談,混合密度 → 16 × 1.0 = 16 秒/卡片 → 19張卡片
- 10 分鐘深入探討,高密度 → 16 × 0.7 = 11 秒/卡片 → 55張卡片
- 30 分鐘講座,中等密度 → 28 × 1.0 = 28 秒/卡片 → 64張卡片
- 1 小時播客,低密度 → 45 × 1.5 = 67.5 秒/卡片 → 53張卡片
當一張卡片的持續時間超過約 15 秒時,建議規劃一個更豐富的卡片內容(例如數據區塊、多步驟揭示、幾個子重點配合錯開時間的動畫)——一個靜態的單行文字在超過 8 秒後會讓人感到無聊。對於較長的作品,如果許多卡片的持續時間都超過 30 秒,可以考慮將時間軸分成多個子合成(每個章節一個 .html 檔案,使用 data-composition-src 載入),這樣每個檔案的 GSAP 時間軸才能保持可管理性——請參閱 HyperFrames 的 timeline_track_too_dense 檢查警告。
content 可以是一個純字串(例如 "標題: 年化報酬率 5.69%\n備註: ...")或任何能夠擷取數據的 JSON 格式。AI 代理會根據每張卡片的需求決定其結構。
可選擇的結尾卡片。 此技能沒有內建固定的品牌結尾。如果使用者想要一個結束卡片,請自己設計一個中性的結尾卡片(一個文字商標 + 一行標語,持續約 1.5-2 秒,淡入 -> 短暫停留 -> 淡出),將其附加到 cards[] 陣列中,並將 composition.durationSeconds 擴展到該卡片的 endSec。否則,影片將在最後一張內容卡片結束時結束。
7. 決定渲染策略
先與使用者確認視覺方向(務必先執行此步驟)
在開始設計卡片或決定邊界之前,請先詢問使用者要選擇的輸出比例、版面配置、風格以及卡片密度預設值。畫面框會根據所選的版面配置 × 風格組合自動選取(請參閱下方的「自動選取畫面框」表格)。在提出問題之前,請先預先計算兩個事項:
recommendedRatio來自……
[翻譯內容截斷,後續文字省略]