Reel — 分割畫面編輯(講者上方 45% 面板)
一個固定的奶油色面板填滿畫面上半部(1080 × split.panel_height,預設 864 = 45%),內部包含 UI 風格的元件——卡片、儀表、切換開關、終端機、標籤——精確圖解正在說的內容。講者位於下方,比例為 1,且從不移動。結尾:先以大字顯示留言關鍵字,再接追蹤卡片。實作範例:examples/split/(一個真實 100 秒影片的計畫稿 + 場景模組,內容關於五個 Claude 技能)。
引數:$ARGUMENTS
預設值(僅在使用者要求時修改)
優先讀取 reel.config.json(若無則回退至 reel.config.example.json)。
| 項目 | 預設值 |
|---|---|
| 分割 | "split": split.panel_height(864 → 面板 45%,講者 55%;960 = 50/50) |
| 講者 | 比例 1,無縮放、無移動;臉部居中於講者區域(speaker_y) |
| 安全框 | "safe": split.safe = [64, 160, 64, 32] → 場景內容位於 952 × 672 區域,從頂部向下 160 px 開始(Instagram 標題 / 手機狀態列會遮蓋頂部) |
| 字幕 / 音效 / 音樂 | 無。音訊 = 原始錄音的混音,由 finish.py 重新混流 |
| 原始片段 | 假設已剪輯、調色、加入音樂 → 直接使用。未剪輯原始檔 → 先詢問 |
| CTA | 留言關鍵字(單字或數字)以大型對話框卡片呈現;追蹤卡片 "handle": creator.handle,純文字,不使用人臉裁切 |
| 調色盤 | split_palette:奶油色面板、墨色文字、強調色填充;奶油色上的文字使用 accent_deep(對比色) |
輸入
從引數取得原始片段名稱與主題。僅在缺少以下資訊時,一次性地在單一訊息中詢問:原始片段是否已剪輯/調色/加入音樂、留言關鍵字、以及 Whisper 可能聽錯的名稱或術語(工具名與產品名)。
管線
PY = .venv/Scripts/python.exe -X utf8(Windows)或 .venv/bin/python -X utf8(macOS/Linux)。長時間步驟在背景執行。
| # | 步驟 | 指令 / 動作 | 檢查點 |
|---|---|---|---|
| 1 | 檢視 | ffprobe;聯絡表 ffmpeg -i raw/<take> -vf fps=1/5,scale=216:384,tile=9x2 -frames:v 1 work/<take>/sheet.jpg 並檢視 | 頭頂上方是否為空白牆面?是否已剪輯? |
| 2 | 轉錄 | $PY tools/transcribe.py <take> --prompt "<names, jargon>" | 校對工具名稱;間隔 > 3 秒 → 重新轉錄該視窗 |
| 3 | 人臉 | $PY tools/face_track.py <take> --split <panel_height> | 輸出 speaker_y |
| 4 | 節奏規劃 | 每段想法一個場景,通常 3–7 秒,每個元件固定於一個口說單字(提示點 = 單字開始)。場景改變內容,不改變佈局 | |
| 5 | 計畫檔 | work/<take>/showcase.json 來自 examples/split/showcase.json:video("../../raw/<file>")、split、speaker_y、safe、scenes_module、scenes[] {kind, start, end, cue{...}}、追蹤場景的 handle;_note 紀錄人臉編號 | |
| 6 | 場景 | tools/scenes_<slug>.py 來自 examples/split/scenes_5skills.py:每種 kind 對應一個 sc_<kind>(i, s) -> (html, js)、RENDER 字典、可選 CSS/JS。座標位於安全框內(寬 952);id 為 s{i}-*;提示點時間為絕對時間。sc_comment、sc_follow 是 CTA | |
| 7 | 建置 | $PY tools/showcase_build.py <take>;在 work/<take>/sc 中:npx hyperframes lint public → 0 錯誤;npx hyperframes snapshot public -o ../snaps --no-end --describe false --at <每個場景的中間時間>;讀取快照表、修正 | 文字位於面板內,不得超出標題 |
| 8 | 快速渲染 | $PY tools/finish.py <take> --seconds 12;讀取 work/<take>/sc/quick_sheet.jpg | |
| 9 | 完整渲染 | $PY tools/finish.py <take>(背景)→ final/<take>/,驗證,qa/sheet.jpg | 讀取快照表 |
| 10 | 報告 | 路徑、長度、場景數、驗證結果。若學到新事項,則加入本技能 |
面板規則
- 元件圖解「正在說」的句子:當提到儲存庫時顯示儲存庫卡片,比較時顯示儀表,說「不是這個」時顯示刪除線。
- 每個場景在下一場景開始前 0.25 秒淡出(建置器自動處理);場景內,元件在其提示點單字出現時入場。
- 畫面中的數字必須是原始片段中的實際計數。
showcase_build.py內建的場景種類(hook、repo、cta……)早於 45% 安全框,可能溢出;請改用tools/scenes_<slug>.py基於examples/split/scenes_5skills.py來撰寫種類。- 波斯語 / 阿拉伯語文字:使用
.fa類別(在元素上設定 RTL,絕不在<html>上設定dir="rtl")、letter-spacing: 0、透過fa()顯示數字、大型零使用拉丁字母0。 - 同一個屬性上不得有重疊的補間動畫,不得使用
Math.random/from:"random",滑入效果的起始狀態需包含autoAlpha:0。 - 若任何來源片段為 HDR(HLG),需先進行色調映射(
tools/story_assets.py中的TONEMAP)——finish.py遇到「HDR auto-promotion」會停止。 hyperframes snapshot不能證明渲染結果——步驟 8 才是。