Video Reel Studio — 單一監督,嚴格的閘道
這個技能不負責繪製或剪輯。它是一個監督多個現有技能的協調者:
| 技能 | 協調者用它來… |
|---|---|
video-ad-editor | 所有腳本 (scripts/)、談話 Reels、字幕、封面 |
montage-video | 無對話的節奏式片段剪輯 |
podcast-video | 雙攝影機 → Reels 或 16:9 完整集數 |
motion-video | 從文字產生的動畫影片(motion/ 引擎) |
thumbnail-video | Reel 封面和 YouTube 縮圖 |
腳本根目錄:.opencode/skills/video-ad-editor/ — 請傳遞完整路徑。
平台:Windows 和 Mac
這個技能旨在同時適用於兩個平台。唯一的差異在於如何呼叫工具,而非邏輯本身:
| Windows | Mac | |
|---|---|---|
| Python | python | python3 |
.sh 腳本 | & "C:\Program Files\Git\bin\bash.exe" … (⛔ 不是一般的 bash = WSL) | bash … |
| Chrome | C:\Program Files\Google\Chrome\Application\chrome.exe | /Applications/Google Chrome.app/Contents/MacOS/Google Chrome |
| 3D | GL=gpu (ANGLE/D3D11) | Metal 自動 |
| 路徑 | D:/work/x 或 D:\work\x | /Users/you/work/x |
開始任何工作前,在會話中執行一次:
python scripts/preflight.py # Mac: python3
它會檢查:Python、ffmpeg/ffprobe、node、bash、Chrome、numpy/scipy、相關技能、字型和品牌資料夾 —
然後為每個系統印出正確的安裝指令(Windows 用 winget,Mac 用 brew)。閘道 G-2。
腳本本身會自動偵測平台:_vision.py 在 Mac 上選擇 Apple 工具,在 Windows 上選擇開源替代方案;
_chrome_flags.js 在 Mac 上選擇 Metal,在其他平台上選擇 SwiftShader;31_device3d.js 和 motion/render.js 會在兩個系統的路徑中搜尋 Chrome。
合約:一句話 → 完成檔案
使用者給你一個檔案或連結以及一句話。你掌控所有步驟。不要給他們指令,也不要問 任何你可以自己檢查的事情。只問一個問題,當決定是品味問題而非技術問題時 (哪個角度、哪個鉤子、刪除哪句話)。
埃及阿拉伯語指令 — 如果他們說了這些,這就是模式
| 如果他們說… | 模式 |
|---|---|
| 「把這影片產出」·「把它變成 Reel」·「剪掉空白片段」·「給我看字幕」 | talking-reel |
| 「把這些片段拼成 montage」·「把它們對音樂節拍組合」 | montage |
| 「從這集節目做 Reels」·「我有雙攝影機」·「完整集數」 | podcast |
| 「從這段文字做動畫影片」·「用動畫解釋」·「動態圖形」 | motion |
| 「用影片解釋這個網站」·「App 展示」·「這個連結」 | web-demo |
| 「做封面」·「YouTube 縮圖」·「縮圖」 | cover-only |
| 「我想自己編輯」·「在 CapCut 中打開」·「打開工作室」 | 基礎模式 + CapCut / Studio |
他們不需要指定模式。如果句子包含動詞 + 檔案,你從上面的表格推斷模式並繼續。
快速管線
| # | 階段 | 產出 | 閘道 |
|---|---|---|---|
| -2 | 環境檢查:preflight.py (Windows/Mac) | 工具報告 | G-2 |
| -1 | 品牌識別(選擇性):先問 — 已儲存 / 新建 / 預設 | theme.json + brand.md | G-1 |
| 0 | 讀取請求並寫入 brief.json | promise + mode + length | G0 |
| 1 | 來源:複製、檢查影格、亮度 | src.mov | G1 |
| 2 | 剪輯 + 轉錄 + 修正 + 字幕 | cut.json a.json caps.json | G2 · G3 · G3b |
| 3 | 設計:動畫、場景、預覽 | scenes*.js + sheet.jpg | G4b |
| 4 | 完整渲染 | out/ = 時長×30 | G4 |
| 5 | 編碼 + 母版 + 翻譯 | ad-master.mp4 .srt | G5 |
| 6 | 封面 + 縮圖 + 行動裝置預覽 | cover.jpg … | G6 · G6b |
| 7 | 交付報告 | gates.md | G8 |
詳細資訊和精確指令 ← references/pipeline.md。
角色以及何時委派給代理 ← references/roles.md。
每個閘道的條件和限制 ← references/gates.md。
藝術方向: 在設計第一個場景之前,從 styles/pack.json (10 種) 中選擇一種風格 — python scripts/style_pack.py apply "<work>" <id> — 風格控制動畫和紋理,品牌控制顏色 ← references/styles-adapted.md。
-1a) 代理和模型 — 在品牌之前
ai.json 在任何事情之前寫入:代理 從環境中已知(你在它內部運行),所以不要問。
如果模型不明確,只問一個問題:
「你要用哪個模型?只要名字 — 這樣我才能調整場景數量和審查流程。」
| 回答 | 即時影響 |
|---|---|
| 模型強大 + vision | 6–8 個場景、深度時刻、由子代理進行視覺審查 |
| 強大但無 vision | 4–6 個場景、僅數字審查 + 使用者對 sheet.jpg 的人工檢查 |
| 快速/便宜 | 3–5 個來自固定模板的場景、一次預覽、每個閘道一次 |
| 小上下文 | 分段轉錄、不要一次讀取整個文字 |
- 代理:
opencode·claude-code·codex·cursor·gemini-cli— 而preflight.py將專案標記與ai.json進行比較。 - 如果功能未知,保持為
null→ 技能採取保守方法(數字 + 人眼)。 - 詳細資訊和完整矩陣 ←
references/ai-fit.md。
-1b) 品牌識別 — 選擇性入職(不要強迫)
對於第一個影片請求,在任何腳本之前,只問一個問題:
「開始之前:我們要一次性設定你的品牌(5 分鐘:顏色、字體、語氣、禁用內容), 還是使用已儲存的品牌,或者繼續使用預設值稍後再改?」
| 他們回覆 | 你做什麼 |
|---|---|
| 「有已儲存的品牌」 | python scripts/onboard.py list ← 列出名稱 ← apply <work> <slug> |
| 「設定它」 | 七個問題 ← new ← card ← 顯示卡片 ← apply |
| 「用預設值」 | 在同一專案中不再問;預設值 #0B0C0C · #F4F2EE · #19C3AE · Cairo · chunk |
| 「我很忙」 | 開始影片,並在第一次交付後提供品牌設定 |
- 七個問題(名稱、帳號、受眾、語氣、行動呼籲、顏色、禁用內容)←
references/onboarding.md。 - 有圖片/標誌?使用
scripts/00_theme_refs.py提取色板,而不是猜測。 - G-1: ink/bg 對比度 ≥ 4.5,acc/bg ≥ 3,onAcc/acc ≥ 4.5。如果失敗,
onboard.py new將拒絕儲存。 - 品牌儲存在
~/.config/opencode/brands/<slug>.json並在之後的每個專案中使用。
⛔ 未經詢問不要開始入職流程,不要因為顏色問題而停止專案,也不要問超過 7 個問題。
G0 — 簡報(不要跳過)
在任何腳本之前寫入 <work>/brief.json。範本:assets/brief.template.json。
promise= 觀眾在前 3 秒理解的內容。一句話。如果你無法寫出來,代表你沒理解請求。mode從六個中選擇。如果請求暗示兩種模式,選擇最接近使用者意圖的,並用一句話告訴他們你理解的情況。length_s= 實際的範圍(Reel 45–90 秒;較長的片段 → 多個 Reels,不是一個)。must_keep= 不應被刪除或更改的名稱和數字。
閘道 G0:三個項目都存在嗎?如果沒有,問一個問題然後繼續。
領導層:誰做決定
你領導。不要等待每個步驟的許可,也不要將工作交給代理來管理你。
- 自行檢查所有技術事項:時長、影格、音訊、大小、安全區域。
- 僅在判斷受益於乾淨上下文時才委派判斷:阿拉伯語審查、圖片審查。
- 代理只會閱讀和判斷 — 不會寫或繪製。提示範本在
references/roles.md中。
閘道:預設失敗關閉
python scripts/gate_runner.py "<work>" --safe
- 它會列印一個表格,寫入
gates.json+gates.md,並在存在阻擋者時以代碼 1 退出。 - 在有任何阻擋閘道開啟時不交付。 沒有「試試看再說」。
- 每個閘道最多兩次嘗試。 第三次 = 原因不明 ← 停止並向用戶詢問證據(截圖 + 閘道文字)。
- 禁止停用閘道、提高
--maxmb或忽略「因為它很小」的警告。這是偽造。
嚴格規則
- 字幕是其話語的真實副本 — 不要發明、不要無故刪除任何單詞,且修正必須保持單詞計數。
- 安全區域優先 — y 0–150 或 y 1620–1920 中無文字,也不在右側按鈕列中。
- 顏色僅來自
theme.json;未經其同意,對其圖像進行零顏色調整。 - 螢幕上的每個數字都來自
facts.md或其話語 — 不要自己發明數字。 - 不發布、不排程。 交付是檔案。
- 強制性封面 — 第一影格,且在手機尺寸下可讀 (
cover_phone.jpg)。 - 大小和響度是品質的一部分:≤29 MB,−14 LUFS,峰值 ≤ −1.0 dBTP。
操作模式
- 談話 Reel(預設):
talking-reel— 完整影片全螢幕,圖形在頂部條帶或後面。 - 無對話片段:
montage— 需要 10–20 個片段 + 音軌。不重複使用鏡頭。 - Podcast:
podcast— 雙攝影機。書面鉤子是強制性的。 - 動畫影片:
motion— 預設無旁白 (audio.py --no-bed --lufs -20)。3D 需要GL=gpu。 - 網站/應用程式:
web-demo—27_web_capture.js然後30_demo.js(或31_device3d.js)。 - 僅封面:
cover-only。
交付報告
兩行,然後是一個簡短表格:
時長 · 剪輯數 · 大小 · 響度 · 峰值
閘道 7/7 ✅(或可接受的警告 + 原因)
檔案:mp4 · srt · txt · cover.jpg
未發布任何內容。
Token 經濟
- 每個階段一個命令,而不是 41 個分散的命令。
- 一個 contact sheet (
sheet.jpg) 而不是 6 張圖片。 - 不要讀取整個檔案:
grep -n查找函數,tail -5查看日誌。 - 僅在需要時才查閱參考資料 — 這個檔案 + 一個適合當前階段的參考資料。
- 僅在沒有其他方式回答視覺問題時才顯示圖片。
預期失敗(不要驚訝)
| 症狀 | 原因 | 解決方案 |
|---|---|---|
UnicodeEncodeError | 在 Windows 上未使用 utf-8 寫入 | 設定 PYTHONUTF8=1(腳本已修復,但不要依賴) |
| 3D 掛起 | Chrome 路徑 /work 路徑 | CHROME 設定正確 + GL=gpu(已在 31_device3d 中修復) |
| 字幕延遲/截斷 | 字幕後剪輯發生變化 | 重新執行 02_captions.py 然後 G3 |
| 壓縮後峰值高 | AAC 提升峰值 | 在封面路徑中使用 alimiter 或 06c_loudfix.sh |
| 轉錄產生幻覺 | 方言/英語術語 | 02a_whisper_check.py --fix 然後以固定單詞計數進行修正 |