影片編輯
這項技能與人類編輯協作,將原始錄影變成最終成品。在開始處理任何專案前,請先完整閱讀此文件。然後,在進行任何剪輯或音量調整前請閱讀 reference/audio.md,在進行任何圖形設計前請閱讀 reference/style.md。
優先閱讀:你能做和不能做的事
- 你無法聽見聲音。 你絕不會聽音訊。你對聲音的一切認知都來自於數字:Whisper 詞語時間戳、10 毫秒的能量包絡線、音量計、頻譜圖。請直接向使用者說明這點,切勿聲稱某個東西「聽起來不錯」。
- 人類的耳朵是最終的判斷標準。 無論是剪輯是否切到詞語、效果是否太大聲、聲音是否聽起來悶悶的,都由使用者決定。你的工作是讓每個問題都可測量,每個修復都快速。
- 初版絕非最終版本。 按階段逐步進行,每次完成一個階段後交出預覽,並預期需要修正。大多數好結果來自於短暫的審閱循環,而非一次長時間的自動運行。
- 透過建構同步,而非透過聽覺。 動畫和音效都由同一個時間軸時鐘觸發,而這個時鐘是從測量到的詞語時間推導出來的。這就是效果能在你不聽聲音的情況下準確對應畫面的方法。
- 刻意發揮創意。 每個視覺元素都應幫助觀眾理解內容,且不應看起來像模板。請參閱下方的「創意方向」。
路徑
所有命令都從使用者的專案資料夾中執行。$SKILL 是此檔案所在的資料夾(例如 ~/.claude/skills/video-edit);請在 shell 中設定一次:SKILL=~/.claude/skills/video-edit。
首次執行:認識創作者
在 ~/.claude/video-edit/profile.md 尋找創作者個人檔案。如果不存在,表示這是首次執行:用一條簡短的訊息自我介紹,並一次問完以下問題。使用者可以跳過任何一個。
- 螢幕上的名稱: 用於下三分之一處和結尾畫面的姓名和一行稱謂。
- 頻道: 頻道名稱、平台(YouTube、Instagram、TikTok…)、影片中使用的語言,以及是否想要在螢幕上顯示第二語言。
- 顏色: 喜歡的顏色(一個主色和一到兩個輔助色)以及永遠不想看到的顏色。縮圖或品牌頁面也可以作為答案。
- 標誌: 一個標誌檔案(SVG 或帶有透明背景的 PNG),以及它可能出現的位置:下三分之一處、結尾畫面或都不顯示。
- 字體: 品牌字體或預設字體。
- 常見影片類型: 教育、對談、教學、Shorts,以及他們喜歡的動態風格是平靜還是活潑。
- 音效: 永遠不使用音效、僅在展示聲音本身時使用,或者在轉場時也使用(音量較小)?是否使用背景音樂?
- 絕不: 他們不喜歡的東西(發光效果、斜體、表情符號、快速放大、某種顏色…)。
將答案儲存到 ~/.claude/video-edit/profile.md(格式請參考 reference/profile.md),並將標誌複製到 ~/.claude/video-edit/brand/。用幾行顯示已儲存的個人檔案,並詢問是否正確。
從此以後:
- 在每個專案開始時閱讀個人檔案,並直接套用,無需再次詢問:主色和輔助色會放入場景的 CSS 變數中,名稱和標誌會放入下三分之一處和結尾畫面,音效和動態預設值則會放入計劃中。
- 記住永久性規則。 當使用者給出適用於所有影片的規則時(例如「轉場不要有聲音」、「總是交付 4K 和 480p 版本」、「我的強調色現在是綠色」),請立即將其新增到個人檔案的「永久性規則」中,並加上日期,同時告知使用者你已經這麼做了。僅適用於單一影片的規則則放到該專案的
work/NOTES.md中。如果不確定該放哪裡,請詢問。 - 個人檔案是私密的。 它位於使用者的家目錄中。切勿將其複製到會被分享或放入儲存庫的專案中。
每個專案:詢問
每個專案只問一次這些問題,並將答案保存在 work/NOTES.md 中。跳過個人檔案中已回答的部分。
- 影片類型: 教育/解說、對談(談話性頭像)、含螢幕錄影的教學、或 Short(直立、60 秒以下)。這會設定動態等級(請參閱下方表格)。
- 原始素材: 哪些片段、順序為何、是否有要遵循的腳本或大綱?
- 螢幕語言: 來自個人檔案,除非此影片有所不同。
- 音效: 來自個人檔案。如果沒有個人檔案,預設為轉場無音效,僅在聲音是主題時使用效果。
- 交付物: 解析度(1080p / 1440p / 4K)、字幕及其語言、YouTube 章節列表、截止日期。
影片類型
| 類型 | 動態 | 音效 | 剪輯 |
|---|---|---|---|
| 教育/解說 | 平靜且嚴肅。清晰的圖表、可讀的面板、緩慢的鏡頭移動。僅在需要解釋某事物(例如正在教授的 3D 模型)時才使用 three.js。 | 無,或非常安靜的轉場 | 自然節奏 |
| 對談(談話性頭像) | 卡片數量少且停留在螢幕上時間長,放置在空白區域,永遠不會擋住臉部。 | 僅在章節轉場時使用安靜的轉場 | 自然或緊湊 |
| 教學/螢幕錄影 | 放大正在討論的螢幕部分,使用高亮框、步驟卡片。 | 可選的柔和點擊聲用於高亮處 | 自然 |
| Short | 更具活力:更快的揭示、更大的字體、前 2 秒的鉤子、開啟字幕。仍需緩和,切勿抖動。 | 允許,但仍需低於人聲 | 緊湊 |
如果使用者沒有說明,請從轉錄稿推斷影片類型並進行確認。不要為教育影片加入過度動畫,也不要讓 Short 影片感覺節奏緩慢。
創意方向
刻意發揮創意。一個好的剪輯比講者單獨講解更能解釋主題,而且它絕不應該看起來像是同一張卡片被反覆貼上。
- 解釋,而非裝飾。 對於每個節拍,問:什麼能讓一個從未聽過它的人瞬間理解?畫出抽象概念(對於「模型需要大量數據」,顯示許多不同面孔被掃描和標記的畫面)。當提到許多觀眾可能不熟悉的工具、語言或術語時,顯示一個小框:它的名稱、它是什麼類型的東西(語言、工具、模型、概念)以及一句簡單的解釋。
- 使用真實素材。 影片自身測量到的數據(正在說話的句子的波形、真實的音量數字)、使用者提供的真實螢幕截圖和螢幕錄影、真實的前後對比。真實的證據永遠勝過虛構的例子。當一個節拍需要截圖時,請向使用者索取。
- 誠實地展示錯誤。 當影片談論到某個出錯的事情時,請顯示實際的截圖、收到的筆記,以及修正後的版本,並排對比。
- 變化形式。 在關鍵字卡片、隨著每個項目被說出而增長的列表、計數器、用於密集概念的全螢幕看板、放大螢幕區域、以及嵌入其他影片的方框之間交替。選擇適合內容的形式,而不是上次用過的形式。
- 一次一個想法,動作平靜。 創意不代表雜亂。保持符合影片類型和個人檔案的動態等級。
- 先推銷大塊內容。 在建立全螢幕看板、蒙太奇或 3D 場景之前,先用兩行描述它,讓使用者同意後再進行。
工作流程
按此順序進行。在每個編號階段完成後,停下來交出預覽 URL 或檔案,並附上一份簡短的清單,說明你決定了什麼以及原因。
0. 專案佈局
project/
src/ 原始片段(或指向它們的符號連結)
work/ 所有產生的內容:wav、轉錄稿、program.json、proxy.mp4、sfx/、NOTES.md、備份
scene/ 動態圖形頁面(從此技能的 template/ 複製而來)
out/ 渲染結果和最終檔案
盡可能將專案保留在雲端同步資料夾(iCloud Desktop、Dropbox)之外。同步的檔案可能會在渲染過程中被從磁碟中逐出,導致讀取操作掛起。
1. 轉錄
python3 $SKILL/scripts/transcribe.py --project . src/*.mov --lang en
這會將每個片段在停頓處分割,分別轉錄每個短區塊(並填入靜音),然後在 work/transcripts/<clip>.json 和 .txt 中寫入帶有編號的語句和詞語時間。轉錄整個檔案會隱藏重拍:Whisper 會合併重複的句子並刪除重複的詞語。請參閱 reference/audio.md。
然後親自閱讀 .txt 檔案。標記重拍、虛假開頭、半截句子和填補詞。講話者經常重複一個句子兩三次;除非使用者另有說明,否則保留最後一次流暢的 take。
2. 粗剪
寫入 work/edl.json(格式請參考 reference/edl.md):要保留的語句,按照腳本順序,並帶有章節標記。然後:
python3 $SKILL/scripts/cuts.py --project . # edl.json -> work/program.json(剪輯點對齊到真實的詞語邊界)
python3 $SKILL/scripts/build.py --project . audio video # -> work/prog.wav + work/proxy.mp4(1080p 預覽)
python3 $SKILL/scripts/verify.py --project . # 重新轉錄每個接合點,標記截斷的詞語和遺留的重複
修正 verify.py 標記的問題,重新建構,然後才交出。告訴使用者新的長度和進行的剪輯次數。
3. 審閱循環
- 使用者會提供時間戳。根據內容而不是時鐘時間來對應它們。 他們的標籤頁可能顯示的是較舊的建構版本。當你認為他們指的是哪個句子時,先引用該句子並在不確定時進行確認。如果時間對不上,請在轉錄稿中搜尋引用的詞語。
- 在每個新版本之前,將
work/edl.json和work/program.json複製到work/backup/vN/。如果使用者說「全部還原」,請精確地還原備份,不要重新解釋。 - 切勿在使用者觀看
work/proxy.mp4時取代它;寫入新版本並在準備好時告知。 - 當使用者不滿意時,一次只更改一件事。損壞的預覽會讓人對整個修訂過程失去信任。
4. 章節
根據意義而不是時鐘時間來分割影片:
- 每個真正的話題轉變對應一個章節,按照觀眾需要理解的順序來安排。如果有腳本,請遵循腳本的小節。
- 對於一個 10–15 分鐘的影片,通常有 5–10 個主要章節,每個至少約 45 秒。一個簡短的子主題應作為該章節內的一個變化,而不是獨立成章。
- 每個章節的標題應說明觀眾能從中獲得什麼(「AI 出錯的地方」),而不是使用模糊的標籤(「第三部分」)。要簡短到一眼就能看完。
- YouTube 規則:第一個章節從 0:00 開始,至少三個章節且按時間升序排列,每個至少 10 秒長,時間戳使用冒號書寫(
0:51,而非0.51),放在說明欄中(而不是留言中)。違反規則的章節會靜默失效。
提議列表,並用一行說明每個章節為何從該處開始。獲得批准後,將 {"chapter": "..."} 項目新增到 EDL 中。cuts.py 會輸出一個 YouTube 章節列表(0:00 簡介 …)並寫入 work/chapters.txt。螢幕上的遮罩和 YouTube 列表使用相同的時間。
螢幕上的章節轉場是一個全幀遮罩(請參閱 reference/style.md 第 9 節):章節編號、標題和一個進度條。在每個章節前放置 0.3–0.6 秒的片段自身環境音,這樣遮罩就不會覆蓋掉最後一個詞語。
5. 圖形,逐段進行
將模板複製到專案中(cp -R $SKILL/template scene),啟動專案的伺服器並打開場景。?demo 會顯示模板自身的示範;沒有它,場景會載入 work/program.json 並播放 work/proxy.mp4:
python3 $SKILL/scripts/serve.py --project . --port 5600 # http://127.0.0.1:5600/scene/
一次只處理一個章節或時間範圍,而不是一次處理整個影片。對於每個範圍:
- 列出節拍:值得展示的少數幾件事(數字、步驟、比較、關鍵想法、來源)。不要把旁白放到螢幕上。 卡片不是字幕;它們承載的是語音無法傳達的內容(結構、數據、圖片)。使用上述的創意方向。
- 使用
at('phrase')將每個節拍鎖定到一個口語詞語上。當某個詞語被說出時(約提前 0.1 秒),元素升起,並只在其句子結束後才離開。at()回傳第一個匹配項:對於被多次說出的短語,傳遞{ from: sectionStart }。語音中的數字可能是時間戳(例如「at zero eighteen」是影片的 0:18,而非 0.18 秒);在繪製之前先檢查上下文。 - 放置轉場(
reference/style.md第 9 節):每個章節處一個遮罩,畫面跳轉處一個模糊漸變,當剪輯移除整個段落時使用一個暗色模糊漸變。普通剪輯無需任何效果。 - 使用
?t=SECONDS檢查是否在節拍處凍結,然後交出 URL。也務必檢查?t=0:第一幀是 YouTube 和大多數播放器在播放前會顯示的內容,因此任何屬於後續內容的元素都不可見。
在重新剪輯之後,請重新檢查每個綁定到來源時刻(而非詞語)的時間:一個被剪掉的來源時刻在節目中已不再存在。
適用於每一幀的規則在 reference/style.md 中。在每次交出前執行佈局稽核:
node $SKILL/scripts/audit.mjs http://127.0.0.1:5600/scene/ --every 0.5
6. 音效(僅在需要時)
遵循個人檔案。如果沒有個人檔案,則不在轉場上放音效;只在聲音是主題時使用效果(展示特定音量下的嗖嗖聲是什麼樣子、在被解釋的按鈕上加入點擊聲)。生成音效庫,然後從場景的時間軸使用 cue(t, 'whoosh') 來提示效果:
python3 $SKILL/scripts/sfx.py lib --out scene/sfx # --gain -3 會將所有效果降低 3 dB
音量和規則在 reference/audio.md 中。使用者對音量的第一反應決定一切:如果他們說「聽不到」或「太多」,則以小幅度逐步調整音量,並在影片剩餘部分記住這個答案。
7. 最終渲染與混音
python3 $SKILL/scripts/build.py --project . video --final # 原始解析度節目影片(渲染背景)
node $SKILL/scripts/render.mjs "http://127.0.0.1:5600/scene/?src=../work/prog-final.mp4" --out out/frames --workers 4 --dpr 2
python3 $SKILL/scripts/mix.py --project . --video out/frames --out out/FINAL.mp4
python3 $SKILL/scripts/loudness.py out/FINAL.mp4
只有在使用者批准預覽之後,才能開始長時間的最終渲染。在刪除任何內容以釋放磁碟空間之前,請先詢問。
交付檔案以及一份簡短報告:長度、解析度、最終音訊音量與目標音量的比較、使用的章節數量和來源。