Community程式設計與開發github.com

tianbester-ZA/edit

將原始素材剪輯為完成版 9:16 與 4:5 主影片(含聲音),適用於付費廣告與自然觸及短片,過程中會先詢問影片用途、聆聽每個片段、規劃每個節拍,並在粗剪後運行獨立的批評環節。

edit 是什麼?

這是一個專為 Claude Code 設計的 AI 剪輯技能,目標是將原始影片素材轉化為令人駐足、感受並行動的短影片。它能夠產出 1080x1920 與 1080x1350 兩種主規格,並確保音量標準約為 -14 LUFS。該技能的核心特色在於其結構化的工作流程:從檢查本地環境(透過 setup.py 腳本確保 ffmpeg 等工具就緒)、詢問使用者影片目標開始,接著進行詳細的聆聽與規劃(參考 Murch、Pearlman、Block 三本剪輯書中的原則),然後提供多種剪輯選項供選擇,最後由一個獨立的「批評者」代理來審視粗剪,確保剪輯品質符合原始目標。它支援 macOS 平台,使用 ffmpeg 進行渲染,並透過 Python 腳本管理文字疊加、節拍偵測、音量正規化等任務。此技能不允許更換原始腳本中的主張或創意,若需改動必須回到腳本環節。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/tianbester-ZA/butcherbird-skills/tree/main/plugins/bb/skills/edit

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

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

說明文件

/bb:edit

目標

將原始素材剪成一部陌生人會為之停下、從中感受到什麼、並採取行動的短影片:一個 1080x1920 的主影片和一個標準的 1080x1350 Feed 主影片,兩者音量約為 -14 LUFS,背後有一個編輯計劃,說明每個剪輯點為何位於該處。

在此之前:檢查這台 Mac

python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py" --data "${CLAUDE_PLUGIN_DATA}"

每個工具會輸出一行狀態,包含確切的修復方式,最後顯示 READY 或 NOT READY。可以安全地重新執行,一旦所有工具就緒,只需數秒。首次執行會建置 Python 工具,需要幾分鐘時間。

若顯示 NOT READY,請提供使用者修復指令並停止。如果只有模型缺失,請告知約需 490 MB,並在對方同意後在同一指令後加上 --download-models。OPTIONAL 行不會阻礙任何流程。

然後:詢問我們要做什麼

執行此技能的人掌握著上下文,他們在這裡說的話是讓作品出色的關鍵。我們曾有一則廣告因為沒有詢問而失敗;一個 Reels 則因為有人提供了真實背景而成功。

先查看已有的內容(素材、腳本、簡報、筆記),然後重新陳述,以便對方確認而非重新輸入。用一輪簡短的提問來詢問(有問題時使用 AskUserQuestion,否則在訊息中詢問)。

除非他們已經告訴你,否則務必先問:

  1. 我們想做什麼,這是什麼類型的影片?是品牌認知影片、展示 Reel、付費銷售廣告、UGC 或創始人談話、幕後花絮,還是其他類型?

然後只問缺失的部分:

  1. 目標觀眾是誰?希望他們看完後有什麼感受或行動?
  2. 什麼風格?最接近哪個參考?接著你會在真實素材上顯示選項供挑選。
  3. 素材、音效或音樂、長度,以及在哪裡播放。

如果是廣告,腳本的買方和階段會沿用,或者先執行 /bb:script。剪輯絕不能更換創意或主張;這必須回到腳本處理。

將答案寫入 job/brief.md,然後一路工作到結束。唯一的停靠點是步驟 2 中的選項。如果他們已經提供了所有資訊,或者說「直接做」,就不要問。如果沒有人能回答(無頭執行),請說明你會問什麼,並採取合理的判斷。

品味屬於該任務

問題 1 設定了任務:將其寫在 job/brief.md 的第一行。某人在一個影片中喜歡的東西不會轉移到另一個影片。自然觸及的 Reel 和廣告是不同的任務:廣告的目的是銷售。因此,廣告是根據其目標受眾、產品的賣點、證據和購買理由來評判,而不是根據自然觸及片子的笑點或感覺。從自然觸及剪輯中學到的教訓不約束廣告,反之亦然。

為什麼

一般性的 AI 剪輯會跟著每個音樂拍子剪,給每個鏡頭相同的長度,對每個鏡頭都推近,並在最後一個字結束的那一刻停止。這裡的所有這些做法都曾被拒絕(參見 lessons.md)。剪輯書能更好地回答同樣的問題,所以我們根據每個決定來查詢它們:Murch 用於思考的結束點,Pearlman 用於節奏和開放性問題,Block 用於視線的落點。這些書是問題和段落,而非聲音。

什麼是好的剪輯

  • 第 0 幀在靜音狀態下就已經是一張成功的靜止畫面:產品、結果或驚喜,而不是標誌或問候語。
  • 在鉤子中打開一個問題,並保持開放直到回報。
  • 剪輯點落在想法或動作完成之處,而不是在格點上。至少有一個鏡頭的長度比周圍的短鏡頭更長,這樣看起來是刻意的暫停。
  • 每個鏡頭中最亮或移動中的物體就是視線的焦點。文字位於下巴下方或清晰的天空區域,絕不遮住嘴巴,也絕不與另一行說同樣話的文字堆疊。
  • 結尾比前一個鏡頭更平靜,訴求簡單明瞭。結尾要落地:音樂在其自己的結尾或真實的樂句處結束,絕不能在歌曲仍在進行時淡出,也絕不能在其最後的強拍上結束。
  • 包含真實聲音。影片中的人物聲音要能蓋過音樂,歌曲最重要的時刻要與畫面最重要的時刻重疊。
  • 素材看起來如同拍攝時一樣:iPhone 的原始色彩、穩定的構圖、僅對產品進行輕微的推近、無移動縮放、無鏡像填充、無黑邊。
  • 4:5 版本是從相同的 EDL 重新佈局,確保字幕和臉部保持在畫面內。

指令

參考檔案會簡短地寫入這些指令。Shell 狀態不會在指令之間保留,因此始終使用完整形式,並且也給批評者代理使用完整形式。

  • PY 代表 "${CLAUDE_PLUGIN_DATA}/venv/bin/python",即 setup 建立的 Python。每個 Python 腳本都用它來執行。
  • scripts/... 代表 ${CLAUDE_SKILL_DIR}/scripts/...。references/... 代表 ${CLAUDE_SKILL_DIR}/references/...。
  • search.py 代表 python3 "${CLAUDE_PLUGIN_ROOT}/skills/books/scripts/search.py"。

工作流程

工作資料夾:使用者所在資料夾中的 <client>-<job>/,或簡報中指定的資料夾(job/)。素材保持原位;只寫入渲染結果。

  1. 閱讀,並聆聽。 在規劃之前執行 PY scripts/listen.py clips <footage> --out job/sound:它會轉錄每個片段,並找出語音、笑聲、喊叫和音量峰值。閱讀所有內容。鏡頭外的台詞通常就是創意,它們告訴你一個鏡頭的真實內容(一個廣告的「應用」鏡頭其實是導演在說「你不需要應用任何東西」)。也執行 PY scripts/listen.py song <track> 並閱讀歌詞:它們可能與畫面衝突或有所幫助。然後閱讀任何客戶筆記、lessons.md、客戶自己的過去剪輯資料夾(僅限該客戶,參見 examples/README.md)、腳本或簡報。執行 scripts/probe.sh <footage> > job/footage-log.md,然後觀看片段並按時間碼添加最佳時刻。在其他操作之前,先用 scripts/proxies.sh 轉換 HDR。別人寫的素材日誌只是一個線索,不是事實:在將任何選定鏡頭放入 EDL 之前,先查看每一幀(scripts/sheet.sh <clip> <start> <len> job/sheets,這樣就不會在素材旁邊寫入任何東西)。將腳本或簡報中的每個主張與顯示該主張的片段時刻列出;任何沒有片段支持的主張現在就要修改或刪除,而不是由批評者來做。用一句話寫下氛圍,使用使用者自己的話。
  2. 規劃。 載入 references/plan.md、rhythm.md、eye.md、sound.md。使用 PY scripts/beats.py <track> 測量音樂:速度、第一拍和音量圖,後者顯示 music.start 處的音樂動向。針對每個節拍(鉤子、轉折、回報、結尾):要感受什麼、節奏、視線落點、聲音。每欄執行一次搜尋。撰寫 job/plan.md,每行附帶一個段落 ID。
  3. 選項。 每個部分大約三個處理方案(隨意、中等、極端),以圖塊形式呈現:每個方案一張圖片和一行說明。由使用者挑選。如果他們不在場,或說直接做,就挑選一個,在 options.md 中記錄原因,並保持其他選項可見;一個選項表格就足夠了。
  4. 粗剪。 載入 references/formats.md。撰寫 job/edl.json,然後執行 mix.py(聲音)和 cut.py --draft(使用代理檔案)。對結果執行 scripts/sheet.sh 和 listen.py cut,並閱讀報告及其波形圖。自己查看畫面、鉤子條和第 0 幀,並在靜音狀態下觀看一次。
  5. 批評。 一個全新的代理會獲得 job/brief.md(這樣它才能根據任務評判)、全尺寸的第 0 幀、所有畫面、條狀圖、聆聽報告、混音日誌、主張列表、references/critic.md 和完整的 search.py 指令。第 0 幀優先,因為縮圖可能誤導。不包括你的筆記或這個對話。它會回傳每個節拍的註解、最多三個附帶段落 ID 的修正方案,以及一個裁決。
  6. 最終。 修復批評者發現的問題(或寫下為什麼簡報勝出)。將 EDL 指向全品質 SDR 檔案,不帶 --draft 進行渲染,然後執行 reframe.py 產生 4:5 版本,接著對結果執行 check_cut.py 和 listen.py cut。修正每個 FAIL;閱讀每個 WARN。明確地說明沒有人聽過它: 報告是測量,不是聆聽,因此語音軌和混音需要由使用者親自聆聽。兩個主影片的畫面。README.txt 和交付方式如 formats.md 所述。 回覆時附上兩個檔案、第 0 幀、批評者之後每個節拍改變了什麼的一行說明,以及一句提及這些書的名稱。引用保持在 plan.md 中,絕不放在影片上。

硬性限制

  • 更改主張或創意必須回到 /bb:script。如果素材或聲音扼殺了創意,請停止並重新進行診斷和腳本,並使用批評者;絕不能在剪輯過程中換上新台詞。我們曾有廣告在剪輯時更換台詞,最終在沒有觀眾和存在理由的情況下發佈。
  • 每次粗剪前必須提供選項。如果沒人在場,就挑選並記錄;絕不能跳過。
  • 絕不拖慢或加快人聲。cut.py 會在片段的播放速度不是 1 時靜音其自身音頻。
  • 無降噪、無模糊、無移動縮放、無鏡像填充、無黑邊。HDR 首先使用 avconvert 轉換為 SDR。不得對談話頭和 UGC 進行調色。只有在簡報要求時才進行輕微的調色(EDL 中的 look),並在回覆中明確說明。
  • 絕不能在沒有在計劃中寫明原因的情況下,關閉片段聲音並交付。
  • 一個鏡頭永遠不能證明比實際發生的更多:如果音頻顯示是模仿的,那就不是證據。
  • 字幕使用所說的語言,包含所有重要的詞語,絕不遮住嘴巴,絕不與提示文字堆疊。
  • 螢幕上的主張、價格和優惠來自簡報或客戶的即時網站,絕不能憑空捏造。
  • 未經使用者同意,不得將任何內容發送給客戶、發布或花費資金。交付到客戶的 Drive 和任何訊息都應由使用者起草;由他們發送。

技術知識

  • 文字: Homebrew 的 ffmpeg 沒有 drawtext 和 libass,因此文字是透過 scripts/text_png.swift(CoreText,由 cut.py 編譯一次)繪製為 PNG,然後使用 overlay 疊加。字型位於 assets/fonts/(Geist Black、Geist Bold、Playfair Display Italic);客戶自己的字型通過路徑放入 EDL 的 styles 區塊。
  • Whisper 是英文且會誤聽鏡頭外的語音。 listen.py 使用小型英文模型。透過閱讀畫面來檢查你要上字幕的每一行;若要更清晰地讀取有疑問的台詞,setup.py --download-large 會下載一個更大的模型(1.6 GB),listen.py clips --large 會使用它。
  • 速度: 最終渲染速度約為每秒 3 到 5 幀(1080x1920 從 1080p 來源,同時有其他編碼在運行);一個 30 秒的廣告需要 3 到 5 分鐘。粗剪時使用 --draft。長時間的渲染應作為背景任務運行。
  • 對齊拍子的剪輯: beats.py 從檔案測量 bpm 和 offset。測量整個軌道:它會檢查前半部和後半部是否一致,而在前奏處的短暫視窗可能鎖定到錯誤的脈搏。為音樂提供 bpm 和 offset(檔案中第一個強拍的秒數)或一個 beats 列表。使用 "snap": true 標記那些結束點應對齊拍子的鏡頭;預設只對齊這些鏡頭。cut.py --beats 會列印當前剪輯的格點。對齊轉折和回報,而不是每個剪輯點:check_cut.py 在超過 80% 的剪輯點位於拍子上時會發出警告。
  • 文字時序: 將文字綁定到鏡頭("shot": 2, "at": 0.3, "dur": 1.2)而不是絕對秒數,這樣當拍子對齊移動了剪輯點時,文字會跟隨鏡頭移動。
  • 音量: 兩次通過的 loudnorm 至 -14 LUFS(線性模式),然後在 4 倍取樣率下使用限制器;cut.py 會測量檔案,如果 AAC 將其推高超過 -1 dBTP,則以較低上限重新編碼。預設情況下,當任何鏡頭保留其自身聲音時,音樂位於片段音頻下方 14 dB;設定 music.gain_db 來更改它。
  • 4:5: reframe.py 將每個鏡頭精確地框定為 9:16,並為每個鏡頭取一個 1350 行的視窗(y45,預設 285)。文字保持其在畫面中的位置,並向內拉 40 px。將 9:16 文字保持在行 330 到 1590 之間,4:5 就不需要額外的工作。
  • 安全區域(9:16): 除全螢幕卡片外,上方不得超過行 270,下方不得低於行 1590;底部 12% 是 Meta 的按鈕區域。
  • 畫面: sheet.sh <video> [start] [len] 會寫入一個 40 幀的畫面(時間碼在其旁邊的 .txt 檔案中)、一個鉤子的 10 fps 條狀圖(或任何視窗)以及第 0 幀。閃爍幀會出現在條狀圖中,而不是畫面中。
  • 片段結尾: 當鏡頭的 out 超過畫面最後一幀時,cut.py 會發出警告並維持該幀,這樣主影片就不會因為音頻而顯得不足。如果凍結畫面會顯現出來,則將 out 往回拉。
  • 手持和推近: x 是每個鏡頭的一個數字,因此游走的手持主體會走出視窗,而推近會放大這種游走。在信任構圖之前,先觀看該鏡頭在運動中的視窗(sheet.sh <render> <shot start> <len> 會提供一個 10 fps 的條狀圖)。
  • 字詞時間漂移: whisper 的逐字時間可能偏差高達 2 秒。在放入字幕行之前,單獨轉錄該片段;如果任一端的字詞遺失,表示剪輯點錯誤。
  • 唇形同步: 手機複製的檔案可能使音頻提前約 0.1 秒。在剪輯前檢查一個片段;如果聲音領先,則調整畫面的 in,絕不能調整字詞。
  • 書籍搜尋: search.py "<literal words>" --job feel|rhythm|eye --book murch|pearlman|block --k 6,然後使用 --show <id> 來閱讀一個筆記。使用精確詞語;問題則無效。

參考檔案(根據決策載入)

  • references/plan.md:四拍計劃,每拍每欄一行,以及每欄的查詢。
  • references/rhythm.md:剪輯點落在何處、停頓、節奏變化、開放性問題。
  • references/eye.md:視線的落點、文字放置、安全區域、4:5 頻段。
  • references/sound.md:聆聽步驟、語音、音樂、效果、音量、結尾。
  • references/critic.md:評分標準,僅由批評者代理載入。
  • references/formats.md:EDL 形狀、腳本順序、輸出、最終檔案位置。
  • references/drawings.md:當簡報要求時,在剪輯上疊加手繪動畫。

經驗教訓

lessons.md 包含來自真實反應和結果的日期標記行。在步驟 0 時閱讀;批評者會根據最近五條經驗檢查剪輯。此資料夾在每次更新時都會被替換,因此客戶自己的經驗教訓應放在該客戶的資料夾中,而適用於所有人的經驗教訓則通過儲存庫(CONTRIBUTING.md)提交。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能