中文科普動畫(Remotion 全流程)
按順序執行十步。每步的產物都是下一步的輸入,禁止跳步後回補。
十條鐵律
- 時長由配音決定,不由文案決定。 參考文案只是意圖,先按實測語速(中文 TTS 約 3.3 字/秒)估算總長;超目標時長就壓字並改口語,再逐段合成、逐段量真實時長。
- BPM 必須實測,不採信用戶或參考稿給的數字。 librosa 常把 104 BPM 報成 51.7(劈半),必須用自相關或換 onset 參數獨立複核,取與聽感一致的一檔。
- 所有切點吸附重拍。 段落邊界 = 該段配音結束時刻向上吸附到最近重拍;幀號 =
round(beat * (60/BPM) * FPS),寫死進程式碼,不運行時計算。
- 確定性渲染。 禁
Date.now()、Math.random();一切擺動用 Math.sin(frame) 推導;同一幀任意次渲染必須像素一致。
- 時間軸單一事實源。 段落、幀號、配音偏移、SFX 釘幀只存在一個
timeline.ts;改文案字數 → 重跑生成腳本 → 同步 TS,絕不手改兩處。
- 字幕斷行按標點裝箱。 先按
,;:。 切 clause 再裝箱;行寬用固定像素容器(如 width: 1460 + whiteSpace: "pre"),禁止靠 maxWidth 讓內容反推容器。
- 音訊三層分離:BGM、人聲、音效各自獨立電平;人聲 0.8、BGM 0.24 起步,渲染後實測峰值,>0.95 即削波風險。
- 每鏡頭渲靜幀自檢。 用
npx remotion still 逐幀看構圖,成圖前不看就渲全片等於返工。
- Windows 三個硬約束:
--props 必須傳檔案(--props=props-nobgm.json),內聯 JSON 會被 shell 剝引號;ffmpeg 9 用 -fps_mode passthrough 而非 -vsync;改 TSX 後樣式不生效先刪 node_modules\.cache。
- 先交付,再評價。 已渲染的成片與已生成的圖先原樣交付給使用者,問題只記錄並說清,不擅自重生。
十步流水線
| # | 步驟 | 關鍵動作 | 產物 |
|---|
| 1 | 選題拆解 | 定知識點鏈條、目標時長、畫幅、受眾語氣 | 一句話選題 + 時長/畫幅約定 |
| 2 | 解說文案 | 按"鉤子→模型→推導→結論→啟示"壓縮到目標字數,改口語 | 分段文案(6 段左右,每段 50–70 字) |
| 3 | 配音 | 逐段獨立合成,同一音色同一參數;量每段真實時長與 f0 | s1..sn.wav + 段落時長表 |
| 4 | 字幕 | 由段時長生成 SRT,與畫面切點同源 | subtitles.srt |
| 5 | BGM | 選曲或自合成,實測 BPM 與重拍表;不合適就換 | bgm.wav + bgm.json(beats_sec) |
| 6 | 重排時間軸 | 段落邊界吸附重拍,算總幀數 | timeline.json + timeline.ts |
| 7 | 音效 | 關鍵動作逐一對應音色,程式碼合成,釘在重拍 | sfx/*.wav + 釘幀表 |
| 8 | 畫面工程 | theme / components / timeline + 逐段場景元件 | Remotion 工程 |
| 9 | 自檢渲染 | 逐段靜幀 → 全片 → 實測峰值 | out/*.mp4、QA 靜幀 |
| 10 | 發布物料 | 封面(程式碼渲染或設計工具)、標題、簡介、話題 | 封面圖 + 發布文案.md |
衝突處理決策
| 衝突 | 處理 |
|---|
| 文案字數與目標時長衝突 | 壓文案,不改時長。壓縮比 > 1.3 時改成口語短句,保留全部知識點 |
| 使用者給的 BPM / 時長與實測不符 | 按實測做,並主動告知差異(如"規範寫 110 BPM / 58s,實測 104 BPM / 53.65s"),另給一條"是否按規範重排"的選項 |
| 使用者指定曲目風格不匹配 | 先實測該曲的 BPM / 頻譜 / 峰值並給資料,再自合成替代,交付時揭露偏離原因 |
| 參考視覺規範與封面或平台風格衝突 | 兩件事分開:正文沿用使用者的視覺規範,封面按封面平台的傳播邏輯做,並說明取捨 |
交付清單
- 成片雙版本:帶 BGM / 無 BGM(平台自帶曲庫時用後者),同幀數同時長
- 字幕 SRT(可外掛,與畫面內嵌一致)
- 交付說明:成片表、BPM 與節拍口徑、段落邊界表、重拍落點表、文案、音效表、混音電平、工程結構、運行命令
- 封面(橫版 + 目標平台豎版)、標題多檔、簡介多版、話題標籤
參考檔案