Reels
從長篇影片(或專門作為 Reels 拍攝的獨立影片)中剪出的垂直短片。
設定:在此定義你的品牌
在首次執行前編輯這些設定一次。以下所有設定都透過名稱來引用它們。
| 設定 | 位置 | 預設值 |
|---|---|---|
| 強調色 | scripts/motion.html、scripts/thisorthat.html、scripts/hook.html 頂部的 --brand | #3b82f6 |
| 顯示字體(鉤子卡片、標題、關鍵字) | 相同檔案中的 --display-font | Anton(免費,Google Fonts) |
| 字幕字體 | scripts/caption.html | Montserrat ExtraBold 800(免費) |
| 攝影機 LUT | reel-params.json 中的 "lut",以及 preview_reel.py 的 LUT 環境變數 | <PATH_TO_YOUR_LUT>.cube |
| 新素材放置資料夾 | 步驟「新素材放置位置」 | <YOUR_FOOTAGE_DRIVE>/<INBOX_FOLDER>/ |
| B-Roll 庫 | 動畫風格,步驟 6 | <YOUR_FOOTAGE_DRIVE>/<shoot>/<cam>/full/ |
| Reel 追蹤器 | 步驟 0 | 你專案中的 drafts/social/reel-tracker.md |
| Whisper 模型 | WHISPER_MODEL 環境變數 | ~/.cache/whisper-models/ggml-small.en.bin |
| 評論關鍵字 CTA | 計畫項目中的 cta | 你自己的關鍵字(例如 GUIDE) |
| 背景音樂參考 | 音樂步驟 | 你喜歡的參考曲目(例如用於 SearchRecordings 的 Spotify 曲目 ID) |
字型:將 Montserrat 和你的顯示字體安裝到 ~/Library/Fonts(或保留每個 HTML 檔案中的 Google Fonts @import,並在線上渲染)。如果你的顯示字體有授權限制,請將其保留在儲存庫之外。
工具:whisper-cli (whisper.cpp)、ffmpeg、Node + puppeteer-core、Google Chrome、已啟用腳本功能的 DaVinci Resolve Studio(以及一個帶有 execute_resolve_code 的 Resolve MCP)、用於 cutout.swift 的 macOS。
步驟 0:先閱讀計分板
在挑選或剪輯任何東西之前,先閱讀 Reel 追蹤器。
- 填入統計數據:針對任何已上線超過 7 天且仍為空白的行。從你的分析工具(例如 Instagram Reels 的 Metricool
getAnalyticsDataByMetrics)擷取數據。觀看次數、平均觀看時間、3 秒留存率(如有)、分享次數、儲存次數、留言次數、追蹤數。 - 根據我們能控制的因素進行比較:格式、鉤子風格(卡片/建置/標題)、長度、CTA 類型、推近效果、主題。只有在每邊至少有 3 個 Reels 的情況下,才稱之為一種模式,並說明差距有多大。
- 在追蹤器中「數字目前說明了什麼」下方寫下結論,並標註日期。
- 將結論應用於這一批次並明確說明,在展示給使用者的 Reel 列表中註明(例如「建置鉤子在 3 秒處的留存率高出 1.4 倍,因此我在 8 個 Reels 中的 6 個使用了建置鉤子」)。如果一個獲勝模式與你鎖定的風格衝突,請在更改之前先詢問。
- 排程完成後,為每個 Reel 新增一行,說明它是如何編輯的。
最重要的規則:鉤子優先
前 3 秒決定了分發效果,多達一半的觀眾會在該視窗內離開,而且鉤子必須立即載入,而不是慢慢鋪陳。一個以「第二個提示是...」開場的 Reel 是注定失敗的。
所以不要剪輯時間順序的片段。將每個 Reel 建構成:
- 鉤子(2-4 秒): 最有力、能獨立存在的台詞,取自影片中的任何地方,包括結尾。
- 建置: 背景脈絡和解釋,以最易於理解的順序呈現。
- 回報: 如果有的話,一個簡短的結尾台詞。
按時間順序的片段會產生無力的鉤子。重新排列相同的素材,無需重新拍攝,就能解決這個問題。重新排列就是主要工作。
好的鉤子模式例如:「我們不再跳過練腿日了」、「你跳過的計劃根本不是計劃」、「每天 10 分鐘就是一年 60 小時」。簡短、陳述性、無鋪陳。
新素材放置位置
新的 Reel 批次會出現在 <YOUR_FOOTAGE_DRIVE>/<INBOX_FOLDER>/,通常是 untitled folder。先檢查那裡。一旦你知道裡面有什麼,將資料夾重新命名為日期在前,然後是名稱:例如 9-28-2026 gear reels。在重新命名前進行轉錄,然後修正 clips.ndjson 中的路徑。
獨立 Reels:動畫風格
對於作為 Reels 拍攝的影片(沒有長篇影片,沒有紙上編輯),動畫風格更具吸引力:產品在畫面中、照片卡片、按鈕上的箭頭或圓圈、上方的打字機註解、頭部上方的小圖片彈出、帶有小副標題的大膽鉤子。先建立一個並獲得批准,再進行批量處理。
- 無紙上編輯。 將
segments-v2.json寫為[],並為每個部分設定"raw": true, "exact": true。 - 不要信任這些影片的整段 Whisper 轉錄。 在台詞之間有長時間重設的鏡次會漂移 2-5 秒(Whisper 可能會將一個短語放在 5.4 秒的靜音中)。執行
GAP=0.18 SUF=.fine blobs.py <work> <clip>並在 blob 邊緣裁切部分。對於最後一個單詞,檢查 50ms RMS 圖譜:單詞中間的下降可能是摩擦音(如 "free" 中的 "f"),因此請重新檢查字幕結尾。在單詞尾部低於 -50 dB 後結束最後一個部分。Whisper 也會在最後一張卡片的裁切點之後發明單詞,因此請檢查 SRT 的最後一個提示與音訊是否相符。 - 推近節奏: 在原生垂直素材上,交替使用廣角(縮放 1.25,傾斜 0)和推近(縮放 1.6,傾斜 -90)的部分。如果說話者傾斜,則平移任何部分(例如鉤子:平移 180)。
- V2 上的動畫層:
motion.json(元素列表,時間與reels-built.json中的單詞對齊)->render_motion.mjs(逐幀渲染,30 秒約需 50 秒)。元素類型在motion.html中有文件說明:單詞建置、猛擊、打字機註解、搖晃、產品去背圖(彈出/飛入/縮小)、按鈕上的脈衝圓圈、刪除線,以及一個B-Roll 卡片,可以播放真實素材(透過 ffmpeglut3d使用 LUT 進行調色)。每行一個視覺元素,全部位於頭部上方的帶狀區域(y 200-550;在 y 100 處,頂部的單詞會被裁切)。為了騰出空間,將每個部分的傾斜度比基本構圖再降低 100(廣角 1.25 / 傾斜 -100,推近 1.6 / 傾斜 -190)。關鍵字使用blue類別(它使用--brand),該類別會在填充色後方繪製一個粗白邊框,這樣強調色就不會在中性牆壁上消失。使用resolve_captions.py並設定"track": 2來放置。 - 產品圖片: 優先使用 Wikimedia Commons API,然後是品牌的 OG 圖片。使用
scripts/cutout進行去背,裁剪掉桌面反射。將它們保存在<work>/gear/中。 - 你用於 B-Roll 的素材:
<YOUR_FOOTAGE_DRIVE>/<shoot>/<cam>/full/。如果素材是 Log 格式,請使用全解析度檔案加上 LUT;已燒錄的代理檔案通常看起來很粗糙。 - A2 軌道上的音效:
build_sfx.py motion.json out.wav。它會優先使用video-reels/sfx/<name>.wav(彈出、咻、猛擊、滴答、點擊、打字、滑動、搖晃、縮小),否則使用合成的替代音效,因此無需任何檔案即可立即使用。ding始終使用scripts/ding.wav(隨附一個合成的叮噹聲;你可以用自己的挑選音效替換它)。合成的pop是相機快門聲(音高掃描的 pop 聽起來往往很「外星」),而MASTER = -3dB 可確保每個音效都略低於人聲。為了獲得更好的音效,請建立sfx/並放入你自有的授權音效,然後在LIBGAIN中調整每個檔案的增益。使用 Epidemic Sound 連接器:使用SearchSoundEffects搜尋,使用DownloadSoundEffect(WAV) 擷取,然後對assetUrl使用 curl。 7b. A3 軌道上的柔和背景音樂: 選擇一種氛圍並堅持使用(例如夢幻爵士/薩克斯風,無人聲)。使用 Epidemic Sound:使用query.externalID = {type: SPOTIFY_TRACK, id: <REFERENCE_SPOTIFY_TRACK_ID>}和vocals: false進行SearchRecordings,跳過任何標記為怪異/恐怖/無人機/管弦樂的曲目,並為每個 Reel 提供不同的曲目。然後使用targetDurationMs= Reel 長度 + 約 0.3 秒和forceDuration進行EditRecording,這樣曲目會結束而不會被截斷。使用 ffmpeg 將 -21 dB 和 1.2 秒淡出燒錄到 wav 中,因為 Resolve API 無法設定片段音量(SetProperty("Volume")回傳 False)。這會將背景音樂置於大約低於人聲 15 dB 的位置。 - 在 Resolve 審查前預覽:
preview_reel.py(相同的裁切、LUT、疊加層、音效、音樂)會在幾秒鐘內提供一個 mp4。將每個片段修剪到 Resolve 的精確幀數(fps,然後trim=end_frame,接著atrim=duration);單純使用-ss/-t輸入會導致長度約長 0.45 秒,並會切掉預覽的最後一行。使用 1.3 秒的聯繫表來驗證,並對最後 1.5 秒進行 Whisper 轉錄以確認結尾完整。 - 如果說話者在 CTA 之後添加了簽名台詞,請保留它:在其後的靜音處裁切,而不是在 CTA 單詞之後。
build_reels.py在音訊後填充 1 秒的靜音,否則 Whisper 會從字幕中遺漏最後幾個單詞。重新渲染會使用新檔案名稱(例如-v3),這樣 Resolve 就不會提供快取的舊片段。
批量處理獨立 Reels
先讓一個 Reel 的風格獲得批准,然後再並行處理其餘的:
- 每個 Reel 一個資料夾(
~/Movies/reels-<MMDD>/<NN>-<slug>/),包含符號連結的<clip>.wav/.json、clips.ndjson、segments-v2.json=[]。分開的資料夾可以防止 Reels 互相覆蓋彼此的reels-built.json。 - 寫一個簡短的簡報,指向已批准 Reel 的檔案(
motion.json、構圖、音效),然後啟動每個 Reel 的後台代理,一次 4 個(太多會使筆記型電腦在 4K 解碼時不堪負荷)。給每個代理該片段的轉錄稿、產品的確切型號名稱,以及任何需要剪掉的行(錯誤事實、重新開始、雜談)。 - 代理會在無音樂預覽階段停止。集中處理音樂(每個 Reel 編輯一次,使用不同的曲目),將電平調整到大約平均 -38 dB 並加入淡出,渲染最終預覽,然後一次一個 Reel 放置到 Resolve 中。
- 在開始建置之前,親自檢查每個代理的聯繫表。將所有最終預覽收集到一個
previews/資料夾中供審查。 - 構圖因設備設置而異。例如:在一個設置上,廣角縮放 1.2 / 傾斜 -190,推近 1.5 / 傾斜 -380;在較寬鬆的設置上,則是 1.25/-100,1.6/-190。檢查每個片段的靜止幀。
- 將每個代理的「待檢查」項目(聽錯、它剪掉的事實、螢幕上的聲明)收集到你的摘要中。Whisper 經常聽錯快速說話(例如將 "free" 聽成 "for you")。
從影片中取得每個 Reel
挖掘整個影片,絕不重複內容。
- 先盤點。 瀏覽整個逐字稿,列出每個可以獨立存在的想法單元:每個提示、故事、統計數據、腳本、自白、反主流觀點以及客戶成功案例。預期每1.2 到 1.5 分鐘的最終剪輯長度約可產生一個 Reel。
- 尋找這些鉤子類型:
- 一個數字:「300 條麵包」、「我雜貨帳單的 40%」、「從 5K 到 50K 粉絲」
- 一個自白:「我以前只會坐著希望他們會聯繫我」
- 一個反主流觀點:「不要只是送出去... 那是個糟糕的贈品」
- 一個內行人才知道的觀點:「沒人知道的秘訣」
- 一個客戶成功案例:有名稱的結果(需取得許可)
- 一個大聲說出的腳本:私訊、推薦請求
- 一個「從不」:「我從未聽過有人當面拒絕我」
- 鉤子必須點明主題。 「沒人知道的秘訣」單獨來看是失敗的,因為觀眾無法判斷它在說什麼。選擇能在第一秒就說出 Reel 主題的台詞。
- 同一句台詞不能出現在兩個 Reels 中。 如果鉤子和切入點不同,兩個 Reels 可以共享一個主題。
- 分層呈現: A 級列表用於建置,B 級列表作為備用,剩餘的列表則附上原因(例如「Reel 4 的後半段」、「沒有鉤子」、「在鏡頭前說話雜亂無章」)。由使用者挑選。
- 當它會開始重複時就停止。 超過那個點之後,每個 Reel 都會削弱其他的 Reel。
每個 Reel 遵循的結構
「鉤子需要鉤住人們,然後 Reel 的其餘部分解釋這個鉤子,解釋價值,也就是最重要的部分。」
- 鉤子: 停止滑動並點明主題。
- 解釋鉤子: 下一行回答了鉤子提出的問題。如果鉤子是「我沒去健身房就瘦了 20 磅」,接下來就要說是如何做到的。
- 核心內容: 實際的價值、操作方法、腳本、證明。這是 Reel 的大部分內容。
- 在回報台詞處停止。
一個很棒的鉤子後面跟著無法兌現其承諾的台詞,比一個平淡的鉤子更糟糕,因為觀眾會感覺被釣魚了。從兩個方面來評判每個 Reel:這個鉤子能否讓我停下來,以及它之後的所有內容是否合理並兌現了承諾?
流程檢查:在建置之前,以陌生人的角度閱讀
將每個 Reel 按順序寫成純文字句子,然後以一個從未看過長篇影片的人的角度來閱讀。 之後再查看時間。以下是手動修剪時一直遵循的規則:
- 在回報處結束,僅一次。 在最有力的台詞處停止。不要在它之後添加標語或再次強調要點。
- 沒有任何內容可以指向 Reel 中未設定的東西。 「我就只是問了他們,他們幾乎總是會分享」如果 Reel 中沒有「問了他們什麼」就必須刪除。檢查每個「她」、「他們」、「這個」、「那個」和「所以」,對照在 Reel 中先前出現的內容。
- 故事按故事順序進行。 一個成功案例作為口頭鉤子,但人物名稱稍後才出現,會讓聽眾感到困惑。先說出人物名稱,再說成功案例。文字卡片負責鉤住觀眾。
- 一個 Reel 一個想法。 兩個想法加上一個重申,應該變成一個想法加上一個證明。
- 剪掉關於說話者的題外話和部分內部的含糊不清。圍繞它們分割部分。
- 口頭鉤子要用文字點明主題。 「這也是接觸新社群的絕佳方式」中的「它」未定義。「當你繼續在週日備餐時...」則說明了 Reel 的主題。
- 目標為 20-35 秒。 超過 40 秒需要有理由。
剪輯得緊湊:沒有「嗯」,沒有空白音,沒有重新開始。 在建置之前:
- 領夾式/現場收音:使用
NOISE_DB=-30執行segments.py(來自paper-edit)。 ffmpeg 的 silencedetect 是基於峰值的,而領夾式麥克風上的環境噪音會高於預設的 -36,因此 0.5-0.8 秒的實際停頓在 -36 時無法被偵測到。 - Whisper 會完全忽略「嗯」,即使有填充詞提示。檢查每個部分的第一個有聲 blob:在該部分第一個真實單詞之前的一個短暫(0.2-0.7 秒)孤立 blob,在
segments.json中會看起來像是"text": "", "tokens": [50464, 518]。按一下鍵盤就能發現它:在reels-built.json中,將它的end提前到start之後 0.05 秒。