Communitygithub.com

fabrica-videos-reels

從腳本到 MP4,為客戶製作 Reels:先批准劇本與分鏡,再進行錄製、動畫與語音同步,最終渲染輸出。

fabrica-videos-reels 是什麼?

此技能為「Fábrica de Vídeos Agêntica」系列中的一個專門工作流程,專注於「腳本優先」的短影片(Reels)製作。它引導 AI Agent 按照嚴謹的步驟:從與客戶溝通撰寫腳本、製作分鏡、使用 Remotion 構建動畫、與實際錄製的語音同步,到最終渲染高品質 MP4 檔案。此技能支援葡萄牙語對話,並整合了多項自動化工具(如語音轉字幕、基於語音錨點的動畫同步、自動裁切與渲染),以確保影片的設計一致性與高效率產出。它適用於 Claude Code、Codex 等支援 Markdown 技能定義的 AI Agent 平台,通過定義明確的階段性檢查點和命令,大幅降低影片創作的技術門檻。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/eduardogalbiati/fabrica-de-video-skills/tree/HEAD/.claude/skills/fabrica-videos-reels

在你喜歡的 AI 中提問

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

說明文件

/fabrica-videos-reels — 從腳本到 MP4

Fábrica de Vídeos Agêntica 的技能(請參閱 fabrica-videos 技能)。這是「腳本優先」的路徑:客戶在錄製前先批准腳本和分鏡。如果客戶在沒有腳本的情況下已經錄製,請使用 fabrica-videos-rapido 技能。

請使用簡單的葡萄牙語溝通(請求製作影片的人通常不會程式設計)。透過渲染的預覽畫面顯示進度,而不是程式碼。 在撰寫 Remotion 程式碼之前,請先閱讀 CLAUDE.md(設計系統規則、每個檔案的位置和指令),如果已安裝官方的 Remotion 技能,也請閱讀 remotion-best-practices。 完整且已獲批准的範例是 Exemplo 影片:roteiros/exemplo*.{md,json} + src/videos/Exemplo.tsx。請複製其結構。

所有指令都在終端機中執行,位於專案根目錄。在以下表格中,TRABALHO 指的是 trabalho 資料夾(位於 git 之外)。

0. 找出影片處於哪個階段

選擇一個簡短的 slug(例如:minha-ideia),然後查看已存在的內容:

存在…那麼前往
無1. 腳本
roteiros/<slug>.md 已批准,沒有 -animacoes.md2. 分鏡
分鏡,沒有 src/videos/<Nome>.tsx3. 建構
組合就緒 + 新的錄製檔案(他會告知儲存位置)4. 錄製
TRABALHO\out\<slug>-final.mp45. 交付

用一句話說明目前所處的階段,然後繼續。階段 1 和 2 是對話:提出方案、聆聽、修改;只有在他批准後才能繼續。

1. 腳本 → roteiros/<slug>.md

  • 在此處構建腳本,與客戶進行對話。詢問:主題(或參考連結/影片)、支柱(品牌的主題之一)、目標時長(30–60 秒 ≈ 2.5 字/秒)。
  • 結構與 roteiros/exemplo.md 相同:包含估計開始時間、口白、卡片的區塊;如果觀眾是門外漢,則需附上類比字典;供錄製用的連續文字;需要的截圖;已附上連結的事實查核。
  • 語調(根據對象調整;對象的規則由品牌方提供)​​:第一人稱、短句、具體數字;前 3 秒必須有鉤子;永遠不要使用「革命性」/「未來已來」;結尾以提問加上 CTA。警報應轉化為提問,而非陳述。不要捏造新聞。

2. 分鏡 → roteiros/<slug>-animacoes.md + roteiros/<slug>.ancoras.json

  • 按拍點(每 2–3 秒一個視覺變化):時間、短語、上方區域顯示的內容(1080×960 區域)。
  • 在建立新的零件之前,先重複使用 src/pecas/ 中的零件:RedeNeural + Bisturi(AI 的「大腦」)、GradeConexoes、LoopPensando、Lupa、ContadorBarra、TrocaPrints、TextoRiscado(模式 riscar/somar)、OlhoRiscado、LinhaVersoes;輔助工具 TituloCena、Halo、RotuloMono、aparece 在 util.tsx 中。
  • ancoras.json:{ "cena": "該場景中說的第一句話" } 按照說話的順序。避免在錨點中使用專有名詞(Whisper 會出錯:"Qwen"→"quen", "Claude"→"clou", "OpenAPI"→"OpenAI", 以及 "Vercel", "MCP", "JSON")。場景內部的拍點(例如:劃掉的時機)也應作為錨點。

3. 建構 → src/videos/<Nome>.tsx

  1. 複製 Exemplo.tsx 的骨架:zod schema(pilar, video, enquadramento, mostrarGuia, nome, cargo, prints, encerramento, tempos)、外層的 TelaDividida、每個場景一個 <Sequence> + <Cena>(6 幀淡入)、結尾 2 秒的 Encerramento。在 src/videos/index.tsx 中註冊,放在 <Folder name="Videos"> 內,並加上 calculateMetadata(時長 = duracaoFala + 2 秒)。
  2. 每個場景是一個獨立的組件,呼叫 useCurrentFrame()(絕對不要在父組件的物件/陣列函數中呼叫 hooks:幀數會出錯)。從 src\relogio.tsx 導入 useCurrentFrame、useVideoConfig 和 Sequence,而不是從 remotion 導入:幀是以 30 幀/秒寫入的,而時鐘會在影片以 60 幀/秒輸出時處理其餘部分。
  3. 新零件應放在 src/pecas/ 中(通用,帶 props),遵循 src/animacoes/tema.ts 中的 tokens。
  4. 作品中的截圖和圖像(小檔案):儲存在 public\<slug>\ 此資料夾中,然後執行 npm run preparar。
  5. 在實際錄製前用於測試的暫時口白:將連續文字錄製到 roteiros\<slug>.fala.txt(UTF-8)中,然後執行 npm run fala -- <slug> roteiros\<slug>.fala.txt → TRABALHO\public\previa\fala-<slug>.mp4(系統語音,1080×960)。 然後執行 npm run legendar + npm run batidas(第 4 節)以產生 src/videos/<slug>.tempos.json,並將 prop video 設為 "previa/fala-<slug>.mp4"。
  6. 驗證:執行 npx tsc 並檢查開啟了指南的聯絡表: npm run folha -- <Id> src\videos\<slug>.tempos.json → TRABALHO\out\folha-<Id>.jpg(每個場景結束時的一個幀)。 檢查圖片:紅色區域內無任何內容(頂部 270,底部 320,側邊 96,右側按鈕),無重疊,文字可容納。
  7. 渲染預覽:npm run renderizar -- <Id> "trabalho\out\previa-<slug>.mp4" previa(輕量,540×960;告知這是預覽)並發送給他。

4. 實際錄製 → 同步和構圖

  1. 找到新的錄製檔案(詢問他儲存在哪裡)。複製原始檔案到 TRABALHO\originais\(絕不移動或修改)並轉換: npm run converter -- "trabalho\originais\<arquivo>" <slug> → TRABALHO\public\gravacao-<slug>.mp4(直立,H.264,標準色彩,保持錄製的解析度和幀率:4K 60fps 仍然保持 4K 60fps,最終影片也以此規格輸出。HDR 是例外:會轉換為 SDR,轉換器會發出警告。在指令末尾加上 ate=12,則只轉換前 12 秒,用於快速測試)。 轉換器會用 ffprobe 檢查檔案,如果是 4K HDR(最新的 iPhone),則使用 zscale + tonemap 處理 HDR(否則顏色會變淡)。 在每次會話的第一次 HDR 錄製中,從轉換後的影片中抽取一個幀並展示給他以與手機進行比較。
  2. npm run legendar -- "trabalho\public\gravacao-<slug>.mp4"(背景執行,約 1–2 分鐘) → legendas/gravacao-<slug>.json。 如果錄製過程中有長時間停頓、錯誤或重複拍攝,請先清理(使用 fabrica-videos-corte 技能):之後的影片將是 gravacao-<slug>-limpa.mp4,轉錄內容也是清理後的影片的。
  3. npm run batidas -- legendas\gravacao-<slug>.json roteiros\<slug>.ancoras.json src\videos\<slug>.tempos.json "<vídeo>"。 如果缺少錨點,請閱讀轉錄內容並調整短語。如果他改變了口白的含義,請調整動畫(例如:「不只由一個人」 → 使用 TextoRiscado modo="somar" 而不是劃掉)並告知他。
  4. duracaoFala ≤ 影片時長(否則底部會有一段沒有圖像的瞬間):如果上述指令末尾有影片,batidas 會自行限制;如果沒有,請手動修正。
  5. 構圖(臉部需要保持在字幕帶區域 y 985–1125 和下方區域 y 1600 之間):在約 12 個時刻測試裁切,使用 ffmpeg -ss <t> -i <video> -frames:v 1 -vf "crop=1080:960:0:<offset>" "trabalho\out\enq-<t>.png" 並檢查每個圖像。 enquadramento = "50% <offset/960*100>%"(用於 1080×1920 來源)。 整個影片中頭部必須完整出現在畫面中。 下巴可以碰到下方區域;但嘴唇永遠不能。 也要測試他靠近鏡頭的情況,並使用頭頂從未離開的最大 offset。
  6. 檢查名牌:如果遮住了臉,它會放在上半部分(TelaDividida 的預設行為)。
  7. 在背景中進行最終渲染:npm run renderizar -- <Id> "trabalho\out\<slug>-final.mp4";使用 ffprobe 檢查時長/解析度,然後發送影片。
    • 進入的品質就是輸出的品質。 renderizar 會讀取錄製的解析度和幀率,最終輸出也與之相同:如果以 4K 60fps 錄製,則輸出為 2160×3840 60fps。不要在最終渲染時直接使用 npx remotion render:它總是輸出 1080×1920 30fps。
    • 僅在帶參數時降低品質,且僅當他在呼叫技能時要求(例如:/fabrica-videos-reels <slug> 1080p):1080p 降低解析度,30fps 降低幀率(npm run renderizar -- <Id> "<saída>.mp4" 1080p 30fps)。沒有參數就不要降低。
    • HDR 不在此規則中: Remotion 只繪製標準色彩。如果錄製內容是 HDR,請告知他最終輸出會是 SDR。
    • 以 4K 60fps 渲染需要繪製的圖像數量是 1080p 30fps 的八倍。請提前告知他這需要時間。

5. 交付

  • 使用 fabrica-videos-entrega 技能完成(技術檢查、封面、幀聯絡表和 NOTAS.md)。以下幾點是此流程特有的。
  • 如果他稍後要在編輯應用程式中加入字幕,請解釋字幕應放在哪裡:就在分隔線下方(使用支柱的顏色)(指南的綠色帶狀區域),最多 2 行。如果他希望字幕直接內嵌在影片中,請參閱 fabrica-videos-legendas 技能(使用 LegendaQueimada 組件,位置 faixa)。
  • 告知轉錄經常會出錯的名稱。
  • 貼文描述:如果他要求,請在 NOTAS.md 中撰寫一個建議(鉤子、2–3 句包含確切數字的句子、一個提問加上相同的口說 CTA、來源、最多 3 個表情符號、4–6 個主題標籤,不要誇大研究無法支持的內容)。
  • 記錄保存在 entregas\AAAA-MM-DD-<slug>\:NOTAS.md(組合 ID、使用的指令、錄製檔和最終檔案的路徑、時長、構圖、他口白中的變更)、capa.jpg 和聯絡表。最終影片保留在 TRABALHO\out\ 中。
  • 批准後,將錄製檔從 TRABALHO\public\ 中移除,並存放到 trabalho\arquivo\AAAA-MM-DD-<slug>\ 中(Remotion 每次渲染都會複製整個 public 資料夾;資料夾過大導致速度變慢)。在 NOTAS.md 中記錄新路徑。
  • 絕不發佈、排程或發送。 發佈是客戶的事情。

已解決的陷阱(不要再犯)

  • Halo:使用 <Halo>(帶 filter: blur 的 div),不要在透明元素上使用 box-shadow(會變成深色「藥丸」形狀)。
  • 多個單詞的強調:*10 tarefas* 需要作為一個片段處理,而不是逐字處理(請參閱 TextoImpacto/Destaque)。
  • 居中於點(例如:v1)的標籤需要額外的邊距,以免侵入 96 px 邊界。
  • PowerShell:直接在 --props='{...}' 中使用 JSON 會丢失引號。請寫入檔案並使用 --props=arquivo.json。
  • 專案內的錄製檔或影片會進入儲存庫:始終放在 TRABALHO 中。
  • Studio 的埠號是 3210。

系列(關於同一主題的多個 Reels)

  • 每集一個 slug(<serie>-<n>-<tema>),如果客戶要求,每集一個工作階段。並行的工作階段共用同一個資料夾: 每個工作階段只操作其 slug 的檔案;在 src/videos/index.tsx 中,編輯前先重新讀取,只新增自己的 <Composition>;不要修改共享的零件。
  • 適用於所有集數的事實和決策(已更改的數字、CTA、支柱)需要立即傳達給所有工作階段。否則,每個影片都會有不同的規則。
  • 系列的最終畫面:使用 src/pecas/TelaFinalReels.tsx 代替 Encerramento,在口白結束後 4 秒(時長 = duracaoFala + telaFinalSeg)。 兩個 9:16 的空白位置(400×711),由他在編輯應用程式中用 Reels 覆蓋:一個用於下一集(最後一集回到第一集),另一個用於引發該系列的 Reels。

音效(可選,僅當他要求或已批准時)

  • 在 public 內的一個音效資料夾中放置四個短音效(帶入你自己的音效,並有明確授權:儲存庫不包含音效):abertura.mp3(鉤子處的 riser,音量約 0.35)、tecla.mp3(每個項目進入時,約 0.3)、 whoosh.mp3(轉場/縮放時,約 0.2)、blip.mp3(當數字或最終答案出現時,約 0.3)。
  • 每個音效是一個短的 <Sequence>,包含來自 @remotion/media 的 <Audio>,綁定到與場景相同的時間點;路徑和音量放在 schema 的 props 中(空字串表示關閉)。
  • 渲染後,使用 ffmpeg -i <video> -af volumedetect -vn -f null - 測量峰值(應低於 0 dB,且音效低於語音)。你無法聽到:請告知他聽覺檢查是他的責任。

錄製經驗教訓

  • 沒有腳本錄製的人通常會一句一句地說話,有長時間停頓,在開始前熱身,重複他們不喜歡的句子,並在結尾時離開畫面。fabrica-videos-corte 技能可以解決所有這些問題。
  • 人們在錄製時常常會改變口白。在依賴錨點之前,請完整閱讀轉錄內容,並根據實際說出的內容調整畫面和貼文字幕。
  • 當口白比腳本短時,從腳本中刪除的細節和數字會顯示在畫面上。
  • 當更改一個事實(例如:已更新的數字)時,請在所有地方進行更改:口白、畫面、標題、貼文字幕和封面。

Individual skills in this repo

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

相關技能