Communitygithub.com

程式逐幀動畫短片

把一個主題或一份成稿做成可交付短片:先核對事實和分鏡,再用 Remotion 逐幀畫出來,可選配音,交付 MP4 和 SRT。

程式逐幀動畫短片 是什麼?

畫面不靠素材庫,也不靠生成式影片模型。每個鏡頭只有一個主角、一條對時字幕,並檢查空場。地圖講稿由此變成能交出去的成片。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/so2bin/anim-skill/tree/HEAD

在你喜歡的 AI 中提問

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

說明文件

anim-skill · 端到端動畫生成

一個主題進,一支片子出。畫面全部由程式碼逐幀繪製(Remotion + React),不依賴任何素材庫、生成式影片模型或外部圖片。

風格是插件,語音是插件,流程是固定的。 加新風格不改流程,換語音引擎不改流程。


何時用

  • "幫我做一支 X 的講解動畫"
  • "把這份文件/教案做成影片"
  • "給這個片子配上解說"
  • "換成 X 風格重做一版"
  • "檢查一下這支片子有沒有閃爍/空場"

不要用在:需要實拍素材、需要人物口播、需要 3D 渲染(走 Blender 那套)。


輸入:兩種模式,先判定

模式觸發條件多做的一步
A · 主題驅動使用者只給了一個主題詞或一句話先做調研(事實、數字、常見誤區),再進入設計
B · 文件驅動使用者已經給了主題文件(教案、白皮書、PPT 稿)先做細化與修正(補數據、統一術語、標出無法可視化的段落),再進入設計

判定後先複述一遍再動手:我按 A/B 模式、做 N 秒、什麼風格、給誰看。 這四件事裡有兩件不清楚就問,別猜。


六個階段(順序不可跳)

0 PREFLIGHT → 1 內容 → 2 分鏡 → 3 構建 → 4 配音 → 5 驗收交付
                                    ↑                ↓
                                    └── 返工 ←──────┘

0 · PREFLIGHT(一次性,2 分鐘)

node <skill>/scripts/preflight.mjs

檢查 node / npm / ffmpeg / 瀏覽器;打印本機可用的語音引擎。 任一項缺失就先說清楚,別到渲染時才發現。

1 · 內容(A 調研 / B 細化)

產出 research.md:一句話論點、3–6 個支撐事實、數字與出處、必須避開的錯誤說法、受眾已知與未知。

  • A 模式:查證為主。每個數字都要有來源,查不到就標"待確認",不許編。
  • B 模式:以原文為準,只補不改。原文裡無法可視化的句子要標出來(動畫只能畫動作、對比、變化)。

2 · 分鏡

產出 plan.md(格式見 references/storyboard.md):每鏡頭一行——幀區間、畫面、動作原語、字幕。

硬性判據(不滿足就重寫):

  • 每鏡頭一個主角,佔內容區高度 ≥1/3(圖形 ≥170px,大字 ≥96px 且整行 ≥300px)
  • 主角在第 1 或第 2 個節拍入場
  • 尺寸只有三檔:主角 ≥170 / 配角 60–110 / 說明 22–30
  • 全片 ≥1 處"高光時刻"(論點句、主角登場、收尾 payoff 三選一),不要靠堆裝飾湊

3 · 構建

node <skill>/scripts/scaffold.mjs <專案目錄> --title "標題" --style <風格id>

按風格 brief(styles/index.json)寫 src/scenes/*.tsx,用 <Series> 串幕。

鐵律(違反會毀掉渲染或讓片子崩):

  1. 一切由 useCurrentFrame() 推導。禁 Math.random()、Date.now()、setState 計數器。 隨機要確定性:hash(seed) = fract(sin(seed*127.1+311.7)*43758.5453)。
  2. 每個 interpolate() 必須帶 {extrapolateLeft:'clamp', extrapolateRight:'clamp'}。 少一個,鏡頭外的幀會飛出去。
  3. 禁 CSS transition / animation / @keyframes。動效只走 interpolate 與 spring。
  4. 不引外部素材與重依賴(three.js / GSAP / 圖片)。要畫面就畫 SVG 與 CSS 漸變。
  5. SVG 模糊原語同幀 ≤12 個,filter: blur() 元素 ≤15 個,否則渲染慢十倍。

4 · 配音(可選)

node <skill>/scripts/srt.mjs <專案目錄>            # 由分鏡生成 SRT
python <skill>/scripts/narrate.py <video> --provider edge|volc --voice <id>
  • 沒配音也能交付(課堂有老師講)。
  • 有配音時先出 SRT 再合成,時間軸取自渲染幀號,不靠估算。
  • 引擎是插件,見 references/voice.md。

5 · 驗收與交付

python <skill>/scripts/qc.py <video>          # 空場 / 主體尺寸
python <skill>/scripts/qc_flicker.py <video>  # 閃爍 / 硬切定位

兩條硬指標(見 references/qc.md):

  • 空場:內容區最大物體 <110px 持續 >45 幀 → 缺陷;<80px → 阻斷
  • 閃爍:亮度對局部中位數偏移 >6(0/1 跳變)→ 缺陷

交付清單:<slug>.mp4、<slug>.srt、plan.md、research.md、src/(可編輯專案)、 README.md(怎麼改、怎麼重渲)。


風格插件

styles/index.json 內置 15 種,每種是一條可執行的 brief(底色、墨色、七色、線寬、抖動、發光、紋理、字體、氣質、投影可讀性、適合什麼)。

呼叫方式:--style neon / --style paper / --style crayon …

加新風格:往 index.json 追加一條 + 在 styles/ 放一份 brief, 不需要改流程、腳本或模板。見 references/styles.md 的擴展契約。

選風格的經驗:先按"投影可讀性"篩(後排能不能看清),再按"氣質"篩。 紙藝/蠟筆適合幼兒,霓虹/極簡適合投影差的教室。


語音插件

內置兩家:

provider費用需要備註
edge免費無微軟 Azure 神經語音,偏播報
volc0.0003 元/字元APPID + API Key豆包語音,接近真人;新號有免費額度

加新引擎:實現 synthesize(text, voice) -> mp3 bytes 並註冊進 scripts/tts/<provider>.py,narrate.py 不用改。見 references/voice.md。


交付前自檢(逐條打勾)

  • remotion render 退出碼 0,ffprobe 幀數 = 設計幀數
  • qc.py 無阻斷項;qc_flicker.py 除章節硬切外無尖峰
  • 所有 interpolate 帶 clamp(grep -c "interpolate(" = grep -c "extrapolateLeft")
  • 無 Math.random / Date.now / CSS animation
  • 字幕與畫面能對上(抽 3 個節拍核對)
  • 中文字體在本機存在(否則渲染出方塊)

一頁速查

node scripts/preflight.mjs
node scripts/scaffold.mjs ./videos/my-film --title "標題" --style paper --seconds 20
cd videos/my-film && npm install
node <skill>/scripts/render.mjs . main out/my-film.mp4
node <skill>/scripts/srt.mjs .
python <skill>/scripts/narrate.py out/my-film.mp4 --provider volc --voice zh_female_cancan_uranus_bigtts
python <skill>/scripts/qc.py out/my-film-volc.mp4

細節在 references/:pipeline.md(每階段展開)、storyboard.md(分鏡模板)、 styles.md(風格目錄與擴展)、voice.md(語音與擴展)、qc.md(驗收判據)、 render-env.md(環境坑:Windows 沙箱、TEMP、瀏覽器路徑、ffmpeg 參數)。

相關技能