編輯一個 Reel
這是已透過 WhatsApp Reel(references/ejemplo-whatsapp.reel.json)批准的流程。
目標是讓下一個 Reel 以同樣方式產出,而無需再次解釋:同樣的風格、
同樣的標準、同樣的檢查。請用西班牙語與使用者溝通,避免不必要的專業術語。
事前準備:個人資料與安裝
讀取 ~/.claude/skills/editar-reel/perfil.json(使用者姓名、品牌、結尾標誌以及儲存
剪輯的位置)。用姓名稱呼使用者,並在步驟 1 中使用他們的剪輯資料夾。
如果 perfil.json 不存在,或者環境中缺少任何工具,則表示這是此 Mac 的首次執行:在編輯任何內容之前,請先依照
INSTALAR.md(安裝所有項目並建立個人資料)進行操作。
環境(由 install.sh 準備好,請參閱 INSTALAR.md)
- HyperFrames CLI:
~/.npm-global/bin/hyperframes(已停用遙測)。始終匯出PATH="$HOME/.npm-global/bin:$PATH" HYPERFRAMES_NO_TELEMETRY=1 HYPERFRAMES_SKIP_SKILLS=1; Claude 的 shell 不會載入~/.zshrc。 - faster-whisper:
~/.venvs/whisper/bin/python(使用av<16;新版本的 PyAV 會破壞 faster-whisper)。 - FFmpeg 位於
/opt/homebrew/bin。系統的python3(3.9)適用於不含 numpy 的腳本。 - 音效庫:
~/Movies/Reels/_sfx/。原始的 13 個音效(whoosh_1/2, pop_1/2, tick, ding, message, counter, typing, clock, slide, hit, riser)會與圖形一起單獨播放;風格為「Apple 音效」:簡短、乾淨、 柔和。還有約 45 個音效(撞擊聲、whoosh 聲、收銀機聲、點擊聲、iPhone 聲……)可手動使用:目錄及使用 時機請參閱references/sfx.md。 - 此技能的腳本:
SK=~/.claude/skills/editar-reel/scripts。 - 結尾標誌:來自
perfil.json(cierre)。vinagre.tech 的向量標誌位於assets/vinagre-tech/; 其他品牌的標誌則儲存在assets/marca/中(請參閱INSTALAR.md)。
風格
使用者會透過風格來要求 Reels(「用風格 2 編輯它」)。如果未指定,則使用風格 1。
所有風格都共享以下流程(轉錄、剪輯、QA、音效、母帶處理);步驟 5–6 有所不同。
所有風格都以其品牌的標誌結尾(來自 perfil.json;1.6 秒,白色背景,使用 scripts/outro.py):影片絕不會
突然結束。預設情況下會出現(除非設定檔中 "cierre": null);在 reel.json 中設定 "outro": null 則移除它,
設定 "outro": {"bg": "#000"} 則更改其背景。
| 風格 | 說明 | 腳本 | 參考資料 |
|---|---|---|---|
| 1 · 卡片 | 每 2-3 秒在頂部顯示帶有深色卡片的標題圖形 + 底部顯示一行小字幕。 | build.py | references/ejemplo-whatsapp.reel.json |
| 2 · 短語 | 底部顯示大型白色短語(即將出現的內容為半透明),關鍵字以藥丸形狀顯示,內聯與浮動圖標,少數白色卡片與全螢幕圖形鏡頭。 | build_frases.py | references/estilo-frases.md |
| 3 · 電影 | 橫向剪輯以 16:9 電影條形式放置在黑色背景上(條帶區域清晰),暖色調,緩慢縮放,臉部兩側顯示小型小寫字幕,最後以大型大寫單字結尾。適用於近距離或情感豐富的影片。 | cut_cine.py + build_cine.py | references/estilo-cine.md |
**動畫 v2(2026 年 11 月 2 日批准,風格 1 預設):**參考 references/motion-reglas.md 中的規則
(滾動的標題、逐位滾動的數字、完整進入的圖形)。之前製作的 Reels
會在其 reel.json 中包含 "anim": 1,以便後續調整不會改變已經批准的動畫。
風格 1 和 2 還可以包含全螢幕動態鏡頭(Mac 終端機、帶有數字的點陣、卡片軌道),
位於 reel.json 的 "motion" 中:請閱讀 references/motion.md 以了解何時以及如何操作。
當使用者要求更改現有風格並批准後,請將更改儲存到該風格的腳本和說明文件中。
如果使用者想要新的東西,請建立一個新風格(4、5……),而不是修改已批准的風格。
先製作一個約 10 秒的樣本(reel.json 中的 "sample_end",適用於風格 2 和 3),然後再組裝整個 Reel。
每個 Reel 的結構
~/Movies/Reels/<短名稱>/ # 此 Reel 的專用項目(由你撰寫;格式請見 references/reel-json.md)
reel.json # 轉錄、剪輯、QA 幀、中間渲染
work/ # 項目資料夾(HyperFrames 項目(生成的 index.html + assets/)
proyecto/ # 最終交付檔案
reel-<名稱>.mp4 # Instagram 用的封面(步驟 8b)
portada-<名稱>.jpg # 封面圖片
流程
1. 找到剪輯
通常位於 perfil.json 的 clips 資料夾中(預設為 ~/Movies/CapCut/)或其子資料夾。如果有多個候選檔案且不清楚
是哪一個,請提供選項詢問(名稱、時長、日期);編輯錯誤的剪輯會花費大量時間。
使用 ffprobe 檢查解析度、fps 和時長。
2. 轉錄
mkdir -p ~/Movies/Reels/<n>/work
~/.venvs/whisper/bin/python -I $SK/transcribe.py "<clip>" ~/Movies/Reels/<n>/work medium es
建立 src.words.json(帶時間戳的單字)、fillers.txt(強制 Whisper 轉錄「呃」、「嗯」、「也就是說」等口頭禪的傳遞;通常它會忽略它們)和 silences.json。閱讀這三個檔案。
3. 決定移除哪些內容(由你判斷)
- 重複片段:如果句子被重複或開始後中斷,請保留最後一次拍攝,並移除之前的。
- 口頭禪:出現在
fillers.txt中但不在乾淨轉錄中的內容。 - 靜音:無需標記;
cut.py會移除 ≥0.2 秒的靜音,並在兩側保留 0.07 秒的空氣。 在reel.json的remove中記錄範圍(原始時間),以及source。如果沒有要移除的內容,則設定"remove": []並告知使用者(「沒有口頭禪或重複片段」,如果是這種情況:你已確認,不要假設)。
cd ~/Movies/Reels/<n> && hyperframes init proyecto --example blank --resolution portrait --non-interactive
python3 -I $SK/cut.py ~/Movies/Reels/<n>
建立 HyperFrames 項目(在剪輯之前:init 需要 proyecto 資料夾不存在),然後進行剪輯,
輸出 1080×1920 @ 30 fps,並將人聲標準化為 -14 LUFS,輸出為 proyecto/assets/cut_norm.mp4;
新的時間戳單字則保留在 work/cut.words.json 中。
4. 檢查取景
提取一組幀(ffmpeg -i proyecto/assets/cut_norm.mp4 -vf "fps=1/5,scale=270:-1,tile=6x1" -frames:v 1 work/contact.png),
然後定位人臉:在參考 Reel 中,垂直範圍約為 520 到 1160 像素,右側有空白牆面。
標題位於頭部上方(170 到 430 像素的卡片),字幕位於領夾式麥克風下方的襯衫上,
片頭標誌則放在頭部旁邊的牆上。如果此剪輯有不同的取景,請在 reel.json 中調整 layout 和 logos 的位置。
5. 在 reel.json 中撰寫內容
閱讀 references/reel-json.md 和 references/graficos.md。已確定的內容:
- 鉤子(0–2 秒):兩行大寫文字,黃色框搭配黑色文字。總結影片提出的痛點的問題或陳述, 而不是逐字引用。從第一幀開始就應該可見。
- 標題:2-5 個字詞,每 2-3 秒更換一次,總結該段落所說的內容,每個都帶有動態圖形。
- 標誌:每次提到工具或品牌時,都使用其真實標誌(來自 Simple Icons;如果沒有,則使用其
新聞資料包中的官方 SVG,位於
proyecto/assets/logos/<slug>.svg)。絕不使用虛構或近似的標誌。 - 字幕:小型、一行、置底,當前單字以強調色顯示。在
fixes中修正你看到的 Whisper 錯誤 (專有名詞、「una gente」改為「un agente」等)。 - 動態鏡頭(可選,每個 Reel 一個或兩個):當使用者提到向 Claude 請求某些內容或解釋自動化步驟時 →
terminal; 當說出一個數字時 →dots;當計算年度盈虧時 →months;「看看我組裝了什麼」 →orbit; 客戶寫信或收到訊息 →notify;說出收入或結果數字 →chart。這些鏡頭是可取的:它們為影片提供了喘息空間 (如果沒有,請提供一個)。請參閱references/motion.md。僅在它們能說明所述內容時才提出;如有疑問,請詢問。 - 最終呼籲:如果要求寫一個詞或提及品牌,最後一個區塊使用
"graphic": "logo"並在該詞處加上ding音效(位於sfx_extra)。 - 字面音效(可選):當使用者提到帶有特定聲音的內容時(金錢 →
cash,放下手機 →iphone_lock, 寫訊息 →phone_typing),在該詞處的sfx_extra中加入該音效。閱讀references/sfx.md; 每 10 秒最多一到兩個,且僅在使用者要求時才使用迷因音效。
6. 準備音效並生成合成
python3 -I $SK/prep_sfx.py ~/Movies/Reels/_sfx ~/Movies/Reels/<n>/proyecto/assets/sfx
python3 -I $SK/build.py ~/Movies/Reels/<n>
cd ~/Movies/Reels/<n>/proyecto && hyperframes lint
prep_sfx 會移除每個音效的開頭靜音(否則它會相對於動畫延遲播放),修剪較長音效並加入淡出,並將其峰值標準化為 -3 dBFS。riser 會被修剪,使其在最高點結束(目前檔案的 0.2–2.0 秒);如果檔案發生變化,請檢查其包絡線並調整 SPEC。
在 lint 中,以下錯誤是可預期的且會被忽略:nested_structure_needs_subcomposition 和 timeline_track_too_dense。
任何錯誤或其他類型的警告都應被修正。
7. 框架品質控制(始終在渲染之前進行)
從每個區塊的中間提取一個幀,在動畫完成後的中點:[code]
hyperframes snapshot --at <鉤子≈1.0>,<每個區塊:start+1.3>,... --no-end --describe false -o ../qa
[/code]
將它們組合成一張表格(ffmpeg -pattern_type glob -i 'qa/frame-*.png' -vf "scale=360:-1,tile=6x2" ...),仔細查看,並放大可疑區域(卡片和字幕的實際大小裁切)。尋找並修正:
- 文字被裁切或超出卡片 / 一個單字獨佔一行;
- 任何東西遮擋到人臉(在任何區塊中,也包含 1.08 倍縮放裁切);
- 對比度不足(淺色文字在白色牆壁上 → 需要深色背景);
- 字幕遮擋領夾式麥克風或襯衫標誌,看起來不美觀;
- 圖形難以理解或看起來很奇怪(第一個
head圖形發生過這種情況:需要重做)。 每次修正後重複快照。手部在字幕前揮動是無法避免的;這不是錯誤。
與黃金標準比較。 references/oro/ 包含每個風格的已批准 Reel 的 12 幀表格
(estilo1-whatsapp、estilo1-18k、estilo2-fras、estilo3-reto40)。渲染後(步驟 8),使用
python3 -I $SK/hoja.py <reel>.mp4 work/hoja.png 提取新 Reel 的表格,將其放在該風格的黃金標準旁邊,然後回答:哪一個
看起來更空曠、更平淡或圖形更小?如果是新的那個,這是要修正的首要問題。
當使用者批准一個看起來比其風格的黃金標準更好的 Reel 時,請將其表格添加到 references/oro/。
8. 渲染、檢查音訊並進行母帶處理
hyperframes render --fps 30 -o ../work/render_mix.mp4
~/.venvs/whisper/bin/python -I $SK/measure_sfx.py ~/Movies/Reels/<n> ~/Movies/Reels/<n>/work/render_mix.mp4
python3 -I $SK/master.py ~/Movies/Reels/<n>/work/render_mix.mp4 ~/Movies/Reels/<n>/reel-<n>.mp4
measure_sfx會報告每個音效相對於人聲的音量。目標:撞擊音 -6 dB,叮噹聲 -8,訊息聲 ≈-8, pop/whoosh/slide 音 -11 到 -13,滴答聲 -14,時鐘/計數器/rising 音 -16,打字音 -18 到 -20。如果任何音效偏差 >2 dB (例如,因為_sfx中的檔案發生變化),請使用sfx_vol進行修正並重新渲染。 音效比人聲還大是嚴重錯誤:它會掩蓋說話內容。master.py會將 Reel 的音量調整為 -14 LUFS(峰值 -1.5 dB),而不重新編碼影片。這是必要的,因為 HyperFrames 的混音器會將混音降低約 1.8 dB,使其落在約 -16 LUFS。- 驗證交付檔案:1080×1920、30 fps、預期時長、-14 LUFS。
8b. 封面
python3 -I $SK/cover.py ~/Movies/Reels/<n>
影片中一個乾淨的幀,包含黃色框中的鉤子,居中於 Instagram 在個人檔案網格中顯示的區域(3:4),以便在動態中
每個影片的內容都能被閱讀。輸出 portada-<n>.jpg 和
work/portada-feed.png(裁剪後的樣子)。標題應居中
(2026 年 11 月 2 日決定,即使遮擋部分臉部;在影片中,鉤子仍然位於頭部上方)。
檢查它:幀("cover": {"at"})必須表情良好且無任何裁剪。僅在使用者要求不同高度時才使用 "cover": {"y"} 或
python3 -I $SK/cover.py <reel> 560。使用者在發佈時,會在「編輯封面 → 從相機膠卷新增」中上傳它。
9. 交付
告知使用者 .mp4 和封面的存放位置,並用幾行總結:剪掉了多少(從 X 秒到 Y 秒,以及移除了什麼)、鉤子、
標題(或最具代表性的)、出現哪些標誌、你做了哪些字幕修正,以及你在
品質控制中修正了什麼。如果某個決定是有爭議的(例如,鉤子是總結而非逐字引用),請告知使用者並提供更改的選項。
10. 清理(僅在使用者確認 Reel 沒問題後)
每個 Reel 會留下約 150 MB 的中間檔案,且磁碟空間通常很有限。當使用者確認 Reel 沒問題時(在此之前不要:
你在調整時需要這些檔案),將所有可重新生成的檔案移動到垃圾桶(~/.Trash/reel-<n>-intermedios-<日期>/,絕不使用 rm:
這樣使用者可以恢復它們):
work/*.mp4、work/*.mov、work/*.png、qa/、已捨棄的 Reel 版本、index.html 不再使用的任何 assets/*.mp4,
以及 index.html 未引用的 assets/sfx/*.wav(prep_sfx 會複製整個庫,約 15 MB;
如果後續調整需要其他音效,則會重新執行)。保留 reel.json、work/*.json、proyecto/(包含 assets/cut_norm.mp4 和 sfx/)
以及最終的 .mp4:有了這些,無需重新剪輯即可進行調整。告知使用者移動了多少空間,並且這些空間將在清空垃圾桶時釋放。
如果在調整時 cut_norm.mp4 遺失,cut.py 會從原始剪輯重新生成(如果它仍在 CapCut 中)。
音樂
不要在影片中加入音樂。使用者在發佈時添加音樂……
[原內容在此處截斷,無法完整翻譯]