Communitygithub.com

Mert-Oezdemir/video-edit

編輯談話性頭像、教學、解說和 Short 影片,搭配 Claude Code 使用。實現逐字精準的原始片段剪輯、以 HTML + GSAP(可選 three.js)構建與口語同步的動態圖形、用 Python 合成音效、妥善處理音量,並提供幀級精確的渲染。首次使用時會詢問創作者姓名、顏色、標誌和偏好,並在後續所有影片中記住這些設定。

video-edit 是什麼?

這項技能允許 AI 代理(如 Claude Code)與人類編輯協作,將原始錄影轉變為完整的影片成品。它的核心優勢在於不依賴聽覺,而是透過 Whisper 時間戳、能量包絡線和音量計等數值數據來做出編輯決策,確保每次剪輯和效果都是可測量的。技能支援多種影片類型,包括教育/解說、談話性頭像、螢幕錄影教學和 Short 影片,並能根據類型自動調整動態、音效和剪輯節奏。它採用分階段工作流程:先轉錄和粗剪,接著透過短暫的審閱循環迭代,然後添加章節和動態圖形(使用 HTML、GSAP 和可選的 three.js),最後生成音效並進行最終渲染。所有動畫和音效都透過從測量到的詞語時間推導出的時間軸時鐘觸發,確保視覺與音訊精準同步。技能也強調有目的性的創意,要求每個視覺元素都應幫助觀眾理解內容,並避免使用模板化的設計。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Mert-Oezdemir/video-edit-workbench/tree/HEAD

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

影片編輯

這項技能與人類編輯協作,將原始錄影變成最終成品。在開始處理任何專案前,請先完整閱讀此文件。然後,在進行任何剪輯或音量調整前請閱讀 reference/audio.md,在進行任何圖形設計前請閱讀 reference/style.md。

優先閱讀:你能做和不能做的事

  • 你無法聽見聲音。 你絕不會聽音訊。你對聲音的一切認知都來自於數字:Whisper 詞語時間戳、10 毫秒的能量包絡線、音量計、頻譜圖。請直接向使用者說明這點,切勿聲稱某個東西「聽起來不錯」。
  • 人類的耳朵是最終的判斷標準。 無論是剪輯是否切到詞語、效果是否太大聲、聲音是否聽起來悶悶的,都由使用者決定。你的工作是讓每個問題都可測量,每個修復都快速。
  • 初版絕非最終版本。 按階段逐步進行,每次完成一個階段後交出預覽,並預期需要修正。大多數好結果來自於短暫的審閱循環,而非一次長時間的自動運行。
  • 透過建構同步,而非透過聽覺。 動畫和音效都由同一個時間軸時鐘觸發,而這個時鐘是從測量到的詞語時間推導出來的。這就是效果能在你不聽聲音的情況下準確對應畫面的方法。
  • 刻意發揮創意。 每個視覺元素都應幫助觀眾理解內容,且不應看起來像模板。請參閱下方的「創意方向」。

路徑

所有命令都從使用者的專案資料夾中執行。$SKILL 是此檔案所在的資料夾(例如 ~/.claude/skills/video-edit);請在 shell 中設定一次:SKILL=~/.claude/skills/video-edit。

首次執行:認識創作者

在 ~/.claude/video-edit/profile.md 尋找創作者個人檔案。如果不存在,表示這是首次執行:用一條簡短的訊息自我介紹,並一次問完以下問題。使用者可以跳過任何一個。

  1. 螢幕上的名稱: 用於下三分之一處和結尾畫面的姓名和一行稱謂。
  2. 頻道: 頻道名稱、平台(YouTube、Instagram、TikTok…)、影片中使用的語言,以及是否想要在螢幕上顯示第二語言。
  3. 顏色: 喜歡的顏色(一個主色和一到兩個輔助色)以及永遠不想看到的顏色。縮圖或品牌頁面也可以作為答案。
  4. 標誌: 一個標誌檔案(SVG 或帶有透明背景的 PNG),以及它可能出現的位置:下三分之一處、結尾畫面或都不顯示。
  5. 字體: 品牌字體或預設字體。
  6. 常見影片類型: 教育、對談、教學、Shorts,以及他們喜歡的動態風格是平靜還是活潑。
  7. 音效: 永遠不使用音效、僅在展示聲音本身時使用,或者在轉場時也使用(音量較小)?是否使用背景音樂?
  8. 絕不: 他們不喜歡的東西(發光效果、斜體、表情符號、快速放大、某種顏色…)。

將答案儲存到 ~/.claude/video-edit/profile.md(格式請參考 reference/profile.md),並將標誌複製到 ~/.claude/video-edit/brand/。用幾行顯示已儲存的個人檔案,並詢問是否正確。

從此以後:

  • 在每個專案開始時閱讀個人檔案,並直接套用,無需再次詢問:主色和輔助色會放入場景的 CSS 變數中,名稱和標誌會放入下三分之一處和結尾畫面,音效和動態預設值則會放入計劃中。
  • 記住永久性規則。 當使用者給出適用於所有影片的規則時(例如「轉場不要有聲音」、「總是交付 4K 和 480p 版本」、「我的強調色現在是綠色」),請立即將其新增到個人檔案的「永久性規則」中,並加上日期,同時告知使用者你已經這麼做了。僅適用於單一影片的規則則放到該專案的 work/NOTES.md 中。如果不確定該放哪裡,請詢問。
  • 個人檔案是私密的。 它位於使用者的家目錄中。切勿將其複製到會被分享或放入儲存庫的專案中。

每個專案:詢問

每個專案只問一次這些問題,並將答案保存在 work/NOTES.md 中。跳過個人檔案中已回答的部分。

  1. 影片類型: 教育/解說、對談(談話性頭像)、含螢幕錄影的教學、或 Short(直立、60 秒以下)。這會設定動態等級(請參閱下方表格)。
  2. 原始素材: 哪些片段、順序為何、是否有要遵循的腳本或大綱?
  3. 螢幕語言: 來自個人檔案,除非此影片有所不同。
  4. 音效: 來自個人檔案。如果沒有個人檔案,預設為轉場無音效,僅在聲音是主題時使用效果。
  5. 交付物: 解析度(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/

一次只處理一個章節或時間範圍,而不是一次處理整個影片。對於每個範圍:

  1. 列出節拍:值得展示的少數幾件事(數字、步驟、比較、關鍵想法、來源)。不要把旁白放到螢幕上。 卡片不是字幕;它們承載的是語音無法傳達的內容(結構、數據、圖片)。使用上述的創意方向。
  2. 使用 at('phrase') 將每個節拍鎖定到一個口語詞語上。當某個詞語被說出時(約提前 0.1 秒),元素升起,並只在其句子結束後才離開。at() 回傳第一個匹配項:對於被多次說出的短語,傳遞 { from: sectionStart }。語音中的數字可能是時間戳(例如「at zero eighteen」是影片的 0:18,而非 0.18 秒);在繪製之前先檢查上下文。
  3. 放置轉場(reference/style.md 第 9 節):每個章節處一個遮罩,畫面跳轉處一個模糊漸變,當剪輯移除整個段落時使用一個暗色模糊漸變。普通剪輯無需任何效果。
  4. 使用 ?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

只有在使用者批准預覽之後,才能開始長時間的最終渲染。在刪除任何內容以釋放磁碟空間之前,請先詢問。

交付檔案以及一份簡短報告:長度、解析度、最終音訊音量與目標音量的比較、使用的章節數量和來源。

相關技能