100% 用程式碼製作影片 (Remotion + 本地音訊)
工作順序 (請勿更改順序)
- 先寫故事 (HyperFrames
story.md方法):唯一重點,3 條故事線,前 2 秒內要有鉤子,以百分比標示節拍,禁止使用生成的影片「提示」(所有元素必須同樣進入畫面,禁止無原因漂浮、卡片排成一行、漂浮的 Logo)。撰寫SCRIPT.md並加上時間碼。 - 配音 → 實際時間長度 →
timeline.json(場景、每句台詞的開始時間、事件、音樂段落)。音訊與影片讀取同一個 JSON。 - 主音訊 (音樂 + 音效 + 配音,包含 ducking,−15.5 LUFS,峰值 ≤ −1 dBTP)。
- 在 Remotion 中製作場景,一個
Film組合,每個場景使用<Sequence>;在渲染前檢查控制影格 (聯絡表單)。 - 逐場景渲染 (
--frames=a-b --muted) → 串接 → 用 ffmpeg 封裝 → 用提取的影格進行 QC。
引擎
npx create-video@latest --yes --blank --no-tailwind <dir>;npx remotion add @remotion/transitions @remotion/media @remotion/effects @remotion/noise @remotion/paths @remotion/shapes @remotion/motion-blur @remotion/fonts。- 無 GPU 沙箱:在
remotion.config.ts中設定Config.setBrowserExecutable(<chrome-headless-shell>)、Config.setChromiumOpenGlRenderer("swangle")、setConcurrency(2)、setCrf(18)、setPixelFormat("yuv420p")。 - 字型:使用
@fontsource[-variable]/*套件 (npm 可安裝;Google Fonts 不可用)。在捕獲前使用delayRender等待document.fonts.load()(需要字形的字元:áéíóúñ¿¡)。 - Remotion 規則:所有動畫都基於
useCurrentFrame();interpolate需 clamp;使用 Remotion 的random(seed);禁止使用 CSStransition/animation、Math.random、Date、計時器、useFrame。 - 成本估算 (2 CPU,1080p):空白場景 ≈0.1 秒/影格;2000 個 Canvas 精靈 ≈0.7 秒/影格;全螢幕
filter: blur()≈2.5 秒/影格。粒子:使用閉合形式 (位置 = f(種子,i,t))、預先模糊的徑向精靈、globalCompositeOperation: "lighter"。 - 一部 3 分鐘的短片 (5400 影格,1080×1920) 在 2 個 CPU 上約需 1 小時 30 分鐘。儲存 bundle (
npx remotion bundle) 並從中渲染。
可重複使用的套件 (不包含在此儲存庫中;作為待建構元件的清單)
anim.ts (依角色分類的 ease、閉合彈簧、keyedState、眨眼、漂移)、Camera2D.tsx (具有視差/伸縮效果的圖層)、Particles.tsx (雨、螢火蟲、灰塵、星星、噪點)、City.tsx (程式化生成霓虹城市 + 反射)、Text.tsx (動態文字、霓虹、逐字字幕、可變標題)、Post.tsx (暗角、閃光、寬銀幕、光線)、character/Mia.tsx (骨架:姿勢 + 表情 + 音素 A–H/X + 眨眼 + 呼吸 + 邊緣光 + 道具)、character/Lucero.tsx、Flat.tsx (具有沸騰效果的鉛筆繪扁平世界)、ChatScreen.tsx、lipsync.ts。工具目錄中的指令碼:voice.py、make_voices.py、asr.py、make_timeline.py、make_audio.py、render_all.sh、assemble.sh、sheet.py。
角色
- 骨架 = 數值參數 (姿勢、表情、音素) 可依影格混合;表情預設集;使用
keyedState進行轉換 (預期動作 → 動作 → 穩定)。頭部引導,身體跟隨;每 2–5 秒定時眨眼;永遠不要同時用同一條曲線移動所有部位。 - 嘴形同步:Rhubarb
-r phonetic -f json於 22 kHz 單聲道 16 位元 WAV 上執行 → 產生 A–H/X 提示 → 在提示之間混合嘴巴參數 (混合 50 毫秒)。輕聲說話時張開強度 ×0.7。 - 在開始動畫之前,先將角色表 (表情、音素、姿勢) 製作成靜止畫面。
配音 (西班牙語,本地)
- Kokoro-82M ONNX (
kokoro-onnx,語音ef_dora、em_alex、em_santa,語言es-419) 和 Piper (piper-tts,es_MX-claude-high、es_AR-daniela-high)。模型在 GitHub Releases 中 (thewh1teagle/kokoro-onnx,k2-fsa/sherpa-onnx)。 - 兒童:使用
rubberband -p N -F提高 +4…+6 個半音 (保留共振峰)。低音:−4。「由多種聲音組成的聲音」:疊加 −2 半音 (26%) + 延遲 12 毫秒的 +0.3 半音 (18%) + 大混響。 - 務必使用 ASR 驗證 (Parakeet-TDT 0.6B v3 透過 sherpa-onnx ≥ 2.0):計算 WER 與文字比對;若 > 5% 則重新生成或改寫句子。在套用效果前驗證 (混響會混淆 ASR 的語言偵測器)。ASR 產生的逐字時間戳記用於字幕。
- 如果使用者有自己的語音 (例如 ElevenLabs),則替換每句台詞的 WAV 並重新生成提示/時間軸,無需更動場景。
音樂與音效
- 使用
pretty_midi按段落作曲 (BPM、和聲進行、GM 樂器) →fluidsynth -ni -g 0.6 -r 48000 -F out.wav MuseScore_General_Full.sf3 in.mid→ 使用 pedalboard (高通濾波器、壓縮器、混響) → pyloudnorm。 - 視覺同步 = 相同的節拍算術 (每拍影格數 = fps·60/bpm,從其索引計算每個節拍)。
- 音效須有畫面中的原因;將峰值放在圖像之後 1 個影格;輪換音效取樣;對於不存在的音效 (嗡嗡聲、雨聲、鉛筆聲、閃爍聲、重低音) 使用 numpy 合成。
- 混音:語音 −20 dBFS RMS,音樂在語音下方 −8 dB (ducking 120 毫秒 / 700 毫秒),音效 −4 dB,主控 −15.5 LUFS,峰值 0.6。使用聲譜圖 (
ffmpeg showspectrumpic) 檢查是否有任何基底音效 (例如雨聲) 蓋過語音。
指導方針 (來自所閱讀的技能:Remotion、HyperFrames、iart-ai motion/kinetic/webgl、nolanx、anatomy、isometric-ops、taste-skill)
- 每拍一個動作;到達使用長尾曲線 (
bezier(0.16,1,0.3,1)),離開短 40–50%;攝影機使用inOut;標題在著陸後保持靜止;3–5 種有原因的轉場類型;在最快的影格上剪輯。 - 視差:背景 0.1–0.3 倍,中景 0.5–0.7 倍,前景 1–1.5 倍並帶模糊。無人機鏡頭 = 具有對數縮放的巢狀平面堆疊 (窗戶 → 立面 → 街區 → 地圖 → 雲層 → 行星)。
- 等距:單一投影;陰影 15–30% 平塗;頂部更亮。
- 字體排印:最多 2 個字體家族;標題高度佔畫面 4–9%;字母交錯 20–40 毫秒,單字 40–70 毫秒;使用可變字體調整粗細/寬度。
- 直式影片:關鍵內容在中央 80% 內;字幕位於下方安全區域上方 (≥ 110 像素);文字 ≥ 44 像素;逐字字幕,以便在沒有聲音時也能理解。