Reels 完成,在你的電腦上渲染
只要一句「幫我做一個關於跑步新手常犯的 3 個錯誤的 Reels,給我的跑步帳號」,你就能交出完成的 Reels:鉤子、分鏡腳本、旁白、音樂,以及在本機端使用 Remotion 渲染的 1080x1920 直式 MP4。完全不需要上傳到任何剪輯 App。
影片是字體排印風格:深色背景搭配柔和光暈,場景包含大標題、編號列表、動態數字、Before/After 卡片,以及結尾的「留言:關鍵字」區塊,字幕會在正中央逐字顯示,並在粗體和斜體之間切換。
<skill> 指的是此技能所在的資料夾(也就是這個 SKILL.md 所在的資料夾)。
前置需求
- Node 18 或更新版本 (
node -v)。必要。 - ffmpeg(選用)。僅用於平衡音樂音量。沒有它,音樂會原樣輸入。
Mac:
brew install ffmpeg。Windows:winget install ffmpeg。Linux:sudo apt install ffmpeg。 - ElevenLabs 金鑰(選用)。沒有它,Reels 就沒有配音,只會有動畫字幕和音樂。
- 大約 600 MB 可用空間給 Remotion(只需安裝一次)以及它在第一次渲染時下載的瀏覽器。第一次渲染需要網路連線,以下載 Google Fonts 的字型。
流程,共 7 個步驟
1. 快速訪談(一次對話)
一次問完所有問題,並在括號中提供預設建議,讓使用者可以一行回覆。如果他們已經在需求中說過某些內容,就不要重複詢問。
- 利基和帳號類型:這個帳號的主題是什麼?
- 觀眾:誰在看?(該領域的初學者)
- Reels 的目標:觸及、儲存,還是要產生留言以提供素材?(留言)
- CTA:使用者要留言什麼關鍵字,以及他們會收到什麼?(例如:「留言『指南』,我傳送指南給你」)
- 語氣:直接、教學性、挑釁性、輕鬆?(直接)
- 配音和音樂:你有 ElevenLabs 金鑰嗎?你有音樂(你自己的 MP3 或來自免版稅庫)嗎?想要特定的顏色嗎?(無配音,無音樂,深色主題搭配黃色強調色)
永遠不要要求使用者把金鑰貼到對話框裡。他們會去編輯 .env 檔案(步驟 4)。
2. 鉤子和腳本
在寫任何程式碼之前,先寫好腳本並以區塊方式呈現:鉤子、編號場景(類型 + 螢幕顯示內容 + 口白)以及預估時長。在生成旁白之前要先取得使用者同意,因為旁白會消耗 ElevenLabs 的點數。如果沒有旁白,且使用者只要求「直接做」,則可以直接繼續。
鉤子(場景 1,最多 2 秒)
- 口說文字最多 6 或 7 個單詞。如果需要更多,那就不叫鉤子,而是開場白了。
- 畫面在第一幀就完整顯示鉤子(
gancho類型就是做這個)。 - 能抓住注意力的格式:帶有痛點的問題(「每天練習卻完全沒進步?」)、違反直覺的主張(「每天發文反而害了你」)、具體的數字(「阻礙你第一個 5K 的 3 個錯誤」)、後果(「這會讓你在私訊中流失客戶」)。
- 不要用「嗨,大家好」、「在這支影片中」、「你知道嗎」或自我介紹。
腳本(總長 20 到 45 秒)
- 4 到 8 個場景。每個場景 1.5 到 6 秒:以每秒 2.9 個單詞的速度計算,每個場景的口白約 5 到 17 個單詞。
- 口白要連貫,不能斷斷續續。 所有場景的文字,依序唸出來時,必須聽起來像一個人在連續說話:每個場景都接續前一句話或想法。不要使用單字短句、用刪節號表示「停頓」,或沒有動詞的清單。先寫好完整的連續文字,然後再依場景拆分。
- 一個場景一個想法。螢幕顯示簡短版本(標題、項目、數字);口白則提供解釋。
- 口白中的短數字使用阿拉伯數字(「23 小時」、「1.6 克」),讓字幕更簡潔。
- 只承諾真實的事情。不要編造統計數據:如果沒有來源,請改用其他類型的場景。
- 最後一個場景永遠是
cta,而且口白要唸出關鍵字(「留言「指南」,我傳送步驟給您」)。
3. 建立工作室(一次)和 Reels 資料夾
工作室是一個裝有 Remotion 的資料夾;每個新的 Reels 只是一個包含其 cenas.json 的子資料夾,因此 npm install 只需執行一次。
# 第一次
cp -R <skill>/template ~/reels-estudio
cd ~/reels-estudio && npm install
# 每個新的 Reels(將 <slug> 換成短名稱,例如:3-erros-corrida)
mkdir -p ~/reels-estudio/reels/<slug>/public
撰寫 ~/reels-estudio/reels/<slug>/cenas.json(格式如下)。工作室根目錄下的 cenas.json 只是一個在 Studio 中開啟的範例;不需要修改它。
4. 旁白(僅在使用 ElevenLabs 金鑰時)
金鑰放在 ~/reels-estudio/.env(從 <skill>/.env.exemplo 複製):
ELEVENLABS_API_KEY=your_key
ELEVENLABS_VOICE_ID=voice_id # 選用
腳本會從環境變數或這個 .env 檔案讀取,並且永遠不會印出金鑰。不要讀取、顯示或複製金鑰到任何其他地方。
cd ~/reels-estudio
node <skill>/scripts/narrar.mjs --projeto reels/<slug> --simular # 驗證,顯示成本,不呼叫 API
node <skill>/scripts/narrar.mjs --vozes-pt # 列出公開庫中的 pt-BR 語音
node <skill>/scripts/narrar.mjs --projeto reels/<slug> # 實際生成
- 務必先執行
--simular。它會驗證cenas.json並顯示旁白將消耗多少個字元(點數)。 - 語音:讓使用者選擇。
--vozes-pt會列出公開庫中的巴西葡萄牙語語音;要使用其中一種,使用者需要在網站的 Voice Library 中將其「新增到我的語音」,然後你可以傳入--voz <id>或將ELEVENLABS_VOICE_ID放入.env。--vozes列出帳號中已有的語音。如果沒有選擇,腳本會使用 ElevenLabs 預設的、能以非母語口音說葡萄牙語的語音:請告知使用者這一點。 - 整個文字會在一次 API 呼叫中送出(
/v1/text-to-speech/{voice_id}/with-timestamps),以確保持續的語調。每個字元的時間點會轉換為每個單詞的時間(同步字幕)和每個場景的時間。 - 輸出:
reels/<slug>/public/narracao.mp3和public/palavras.json,並且cenas.json會指向它們。使用相同文字和語音再次執行不會消耗點數;要重新生成,請使用--refazer。--velocidade 1.08可加速(範圍 0.7 到 1.2)。 - 在旁白生成後修改了口白?請再次執行
narrar.mjs。 字幕來自音訊。
沒有金鑰:跳過此步驟。Reels 將沒有配音,字幕會根據預估的口白時間(每秒 2.9 個單詞)進行動畫,並加上音樂(如果有的話)。
5. 音樂(僅在使用者提供時)
音樂由使用者提供:他們自己的音樂或來自免版稅庫(YouTube Audio Library、Pixabay Music)的音樂,需遵守每個音樂的授權。絕對不要從「MP3 下載」網站、YouTube 影片或任何授權不明確的來源下載音樂,也不要建議這樣做。 沒有音樂,Reels 就沒有背景音樂。
node <skill>/scripts/mixar.mjs /path/to/music.mp3 --projeto reels/<slug>
node <skill>/scripts/mixar.mjs /path/to/music.mp3 --projeto reels/<slug> --inicio 12 # 跳過前奏
如果有 ffmpeg,腳本會將音樂裁剪到 Reels 的長度(如果音樂太短則重複),平衡音量,並加入淡入淡出效果。如果沒有 ffmpeg,則按原樣複製。渲染時,音樂音量會降低,並且在有配音時自動降低(組合中的簡單 ducking)。音量:cenas.json 中的 volumeTrilha,範圍 0 到 1(有旁白時預設 0.3,無旁白時預設 0.8)。
如果使用者在旁白生成之後才提供音樂,請在 narrar.mjs 之後執行 mixar.mjs,以便裁剪使用實際的影片長度。
6. 檢查、檢視和渲染
cd ~/reels-estudio
node <skill>/scripts/checar.mjs --projeto reels/<slug>
修正所有 ✖(錯誤)並閱讀所有 !(警告)。然後,在渲染之前檢查 3 個關鍵幀(鉤子、中間、CTA)。從 narrar.mjs 的輸出中取得時間點,或將秒數乘以 30:
npx remotion still Reel out/<slug>-q1.png --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public --frame=30
npx remotion still Reel out/<slug>-q2.png --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public --frame=<middle>
npx remotion still Reel out/<slug>-q3.png --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public --frame=<end-20>
打開圖片檢查文字被裁切、孤兒行和重疊的問題。然後進行渲染:
npx remotion render Reel out/<slug>.mp4 --props=reels/<slug>/cenas.json --public-dir=reels/<slug>/public
一個 30 秒的 Reels 需要 1 到 4 分鐘。在效能較差的機器上,加上 --concurrency=2。若要快速預覽,使用 --scale=0.5(輸出為 540x960)。
7. 使用檢查清單交付
交付 MP4 的路徑(~/reels-estudio/out/<slug>.mp4)、最終腳本以及貼文建議說明。在此之前,請確認並告知你已經檢查過:
- 對比度:字幕在背景上清晰可讀(
checar.mjs會測量;最低 4.5:1)。 - 沒有任何畫面靜止超過約 3 秒:沒有場景超過 6 秒,也沒有長時間沒有字幕的停頓。
- 鉤子在 2 秒內出現,並在第一幀可見。
- CTA 在結尾,同時出現在畫面和口白中,且使用正確的關鍵字。
- 長度在 20 到 45 秒之間。
- 有配音時:字幕與口白同步(在 MP4 中檢查中間的一段)。
-
out/中的預覽 PNG 可以刪除。
cenas.json
{
"cores": { "fundo": "#0E0F12", "texto": "#F4F4F2", "destaque": "#FFC94A", "suave": "#9A9CA3", "sobreDestaque": "#0E0F12" },
"fonte": "Inter",
"fonteItalica": "Instrument Serif",
"legenda": true,
"narracao": null,
"palavras": null,
"trilha": null,
"cenas": [
{ "tipo": "gancho", "titulo": "Treina todo dia e nada muda?", "destaque": "nada muda",
"fala": "Treina todo dia e nada muda?" },
{ "tipo": "titulo", "titulo": "O problema não é o treino.", "subtitulo": "É o que acontece nas outras 23 horas.",
"fala": "O problema quase nunca é o treino, é o que você faz nas outras 23 horas." },
{ "tipo": "lista", "titulo": "Os 3 vilões",
"itens": ["Dormir menos de 7 horas", "Comer pouca proteína", "Repetir a mesma carga"],
"fala": "São três vilões: dormir menos de sete horas, comer pouca proteína e repetir a mesma carga por meses." },
{ "tipo": "numero", "de": 0, "ate": 1.6, "decimais": 1, "sufixo": " g", "rotulo": "de proteína por quilo de peso, por dia",
"fala": "Uma referência comum para quem treina é 1,6 grama de proteína por quilo, todo dia." },
{ "tipo": "antes-depois", "antes": "Treino novo toda semana", "depois": "Mesmo treino, carga subindo",
"fala": "Em vez de trocar o treino toda semana, mantenha o mesmo e suba a carga." },
{ "tipo": "cta", "chamada": "Comenta", "palavra": "PLANO", "promessa": "que eu te mando o checklist das 23 horas",
"fala": "Comenta PLANO que eu te mando o checklist das 23 horas." }
]
}
同一個範例也可以在 <skill>/exemplos/cenas.exemplo.json 找到。
場景類型
所有場景都包含 fala(必要)和 duracao(以秒為單位,選用;僅在沒有旁白時使用)。
| 類型 | 欄位 | 用途 |
|---|---|---|
gancho | titulo, destaque | 第一個場景。特大標題;destaque 是以強調色顯示的斜體部分。如果標題與口白相同,則字幕不會重複。 |
titulo | titulo, subtitulo, destaque | 一個強而有力的陳述。標題最多約 50 個字元。 |
lista | titulo, itens(2 到 5 個) | 項目逐一進入的編號列表。每個項目最多約 30 個字元。 |
numero | ate, de, prefixo, sufixo, decimais, rotulo | 數字會動態增加到目標值。例如:"prefixo": "R$ ", "sufixo": "%"。 |
antes-depois | antes, depois, rotuloAntes, rotuloDepois | 兩張卡片;「之後」的卡片會在中間以強調色進入畫面。 |
cta | palavra, chamada, promessa | 最後一個場景。在一個區塊中顯示「留言」+ 關鍵字 + 使用者會收到的內容。關鍵字最多 9 個字母。 |
顏色和字型
cores:任何#rrggbb顏色。預設為中性深色搭配黃色強調色。若要使用淺色主題,請互換fundo和texto的顏色,並選擇一個夠深的destaque顏色。checar.mjs會檢查低對比度。fonte和fonteItalica:Google Fonts 的字型家族名稱(例如:"Montserrat"、"Playfair Display")。fonte需要有 weight 900。使用"sistema"則不下載任何字型。如果該字型家族不存在或沒有網路連線,渲染會使用系統字型。legenda: false會關閉逐字字幕效果。
常見問題
- 「palavras.json 來自 cenas.json 的其他版本」:口白在旁白生成後被修改了。請再次執行
narrar.mjs。 - ElevenLabs 401:金鑰錯誤或沒有 text-to-speech 權限。404:該語音不存在於帳號中;請透過 Voice Library 新增。
- 文字超出畫面:請縮短標題或項目;
checar.mjs會警告過長的內容。 - 渲染緩慢或卡住:使用
--concurrency=2、關閉瀏覽器,並檢查磁碟空間。 - 第一次渲染時間較長:Remotion 會下載一個無頭瀏覽器(只需一次)。
此技能不包含的功能
- 不拍攝或使用錄製的影片、圖片或頭像:Reels 是字體排印風格(文字、數字、卡片)。若要編輯影片素材,請使用其他工具。
- 不進行語音複製,也不會在使用者沒有提供 ElevenLabs 金鑰的情況下生成語音。
- 不選擇或下載音樂:背景音樂總是由使用者提供。
- 不發佈到 Instagram 或排程貼文。
- Ducking 功能是簡單的(有口白時音樂降低音量);不能取代專業混音。