Communitygithub.com

DrChunChihChen/procedural-cartoon-video

使用 Python Pycairo、Gemini 3.8 Flash TTS 與 FFmpeg 自動化生成高質感向量卡通導覽與教學解說短影片。當使用者提到「做影片」、「製作動畫」、「卡通影片」、「教學影片」、「短片製作」、「videokit」、「小半天影片」、「碳導遊」或需要從腳本、配音、角色繪製到最終 MP4 輸出的完整管線時使用。

¿Qué es procedural-cartoon-video?

procedural-cartoon-video is a Antigravity agent skill that 使用 Python Pycairo、Gemini 3.8 Flash TTS 與 FFmpeg 自動化生成高質感向量卡通導覽與教學解說短影片。當使用者提到「做影片」、「製作動畫」、「卡通影片」、「教學影片」、「短片製作」、「videokit」、「小半天影片」、「碳導遊」或需要從腳本、配音、角色繪製到最終 MP4 輸出的完整管線時使用。.

Compatible con~Claude Code~Codex CLI~Cursor✓Antigravity✓Gemini CLI
npx skills add DrChunChihChen/procedural-cartoon-video

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

程式化向量卡通影片製作套件 (Procedural Cartoon Video Kit)

本技能提供一套純程式碼驅動、無外部素材依賴(零失真純向量)的卡通教學與導覽解說短影片製作管線。結合 Python Pycairo 繪圖引擎、Google Gemini 3.8 Flash TTS 語音配音、自動字數時長對齊、智慧標點斷句字幕 與 FFmpeg 音畫合成,可在數分鐘內自動化算繪出 1280×720 (30 fps) 高清 MP4 影片。


系統環境需求 (Prerequisites)

以 macOS 為標準執行環境:

# 1. 系統依賴與字型(必要:Noto Sans CJK TC 繁體中文黑體)
brew install ffmpeg cairo pkg-config
brew install --cask font-noto-sans-cjk-tc

# 2. Python 依賴庫
pip3 install pycairo numpy pillow

# 3. OpenRouter API 金鑰(用於 Gemini 3.8 Flash TTS 語音生成)
# 將 API 金鑰寫入 ~/.openrouter_key,確保不含換行符
echo "YOUR_OPENROUTER_API_KEY" > ~/.openrouter_key
chmod 600 ~/.openrouter_key

驗證環境:執行 python3 example_ds2.py auto,若能正常產生 example_ds2/grid.png 即表示環境配置完成。


專案標準目錄結構

my_video_project/
├── engine.py                  # 核心引擎:畫布底層、字幕生成、BGM 合成、Episode 類別、FFmpeg 管道
├── dc.py                      # 共用視覺模板庫(開場、路線圖、問答、重點整理…)
├── atian.py (或 xd.py / aj.py) # 主持人角色定義(覆寫 dc.doctor 實現全局換角)
├── ep1.py                     # 當集畫面代碼(各場景繪製函式 s0, s1, s2...)
├── ep1/                       # 當集資產目錄
│   ├── script.json            # 旁白文字腳本(字串陣列)
│   ├── c1.pcm ~ cN.pcm        # 經 1.1x 加速處理後之各段語音檔(24kHz s16le PCM)
│   └── grid.png               # 自動產生的全片縮圖預覽表(每場景 2 格)
└── tools/
    ├── make_payloads.py       # script.json -> OpenRouter TTS 請求 JSON
    ├── tts.sh                 # 呼叫 OpenRouter 批次生成 24kHz PCM 語音
    ├── f0.py                  # 音高質檢腳本(中位數 Hz,檢出並重抽音高漂移段落)
    └── prep.sh                # 語音 1.1x 加速並重命名為 c1.pcm ~ cN.pcm

標準六階段製作流程 (SOP)

製作任何新的一集,嚴格遵循下列六個階段:

階段 1:腳本撰寫與場景劃分 (script.json)

  • 於 ep1/script.json 建立 JSON 字串陣列,一個字串即對應一個獨立場景 (Scene)。
  • 單段旁白字數建議在 30 ~ 80 字之間(朗讀約 6 ~ 15 秒),節奏最為舒適。
  • 標點符號請使用標準全形標點(,、。、!、?、:、;),引擎會自動依標點智慧斷句上字幕。

階段 2:TTS 語音生成、音高質檢與 1.1x 語速優化

  1. 生成 TTS 請求檔:
    python3 tools/make_payloads.py ep1
    
    注意:風格提示詞(如道地台灣國語、活潑青年導遊)必須填入 instructions 欄位,嚴禁填入 input 否則會被唸出來。
  2. 批次請求語音:
    bash tools/tts.sh ep1
    
  3. 音高質檢 (F0 Pitch Check):
    python3 tools/f0.py tts_ep1/*.pcm
    
    • 男聲 Puck 正常中位數為 120 Hz ~ 160 Hz。
    • 音高嚴格守則:若檢測發現任何一段 超過 165 Hz(代表 Gemini 誤漂移成女聲),必須單獨重新請求該段直至音高正常。詳見 audio-tts-pipeline.md。
  4. 語速加速與格式化:
    bash tools/prep.sh ep1
    
    將檔案以 atempo=1.1 加速輸出至 ep1/c1.pcm ~ ep1/cN.pcm。

階段 3:主持人角色綁定與特色繪製

  • 角色模組必須符合標準函式介面: def my_host(ctx, x, y, s, t, mouth=0.0, wave=False, point=False, sweat=False, happy=True, look=0.0):
  • 透過在模組底端執行 dc.doctor = my_host,全局一鍵替換所有模板的主持人。
  • 完整繪製手法(眨眼計算、橡皮管手臂、音量 RMS 驅動嘴型開合)請參考 character-design.md 與 character_template.py。

階段 4:Pycairo 視覺場景代碼撰寫 (ep1.py)

  • 為每個場景撰寫對應函式 def s0(ep, ctx, u, T, m):
    • u: 本場景內的經過秒數。
    • T: 全片絕對秒數。
    • m: 即時語音振幅 (0.0 ~ 1.0)。
  • 使用 ep.kw(sc, "精確關鍵字") 獲取旁白唸到該關鍵字的精確秒數,驅動圖卡浮現。
  • 關鍵函式與佈局 API 詳見 engine-api.md。

階段 5:快速縮圖預覽與視覺質檢 (Preview & QA)

python3 ep1.py auto
  • 引擎會在 2 秒內快速抽樣全片每場景 2 格,拼合成 ep1/grid.png。
  • 重點查驗:
    1. 文字是否有豆腐方塊(缺字)。
    2. 內容是否超出畫布邊界或字串重疊。
    3. 底部圖卡是否侵入字幕區(不得低於 y=610)。
    4. 右側圖卡是否與常駐主持人碰撞重疊。

階段 6:完整影片算繪與 FFmpeg 解碼驗證

  1. 正式算繪 MP4:
    python3 ep1.py
    
    引擎自動合成 1280×720 H.264 影像、壓製字幕、混音 BGM(自動壓低)並封裝 AAC 音訊。
  2. 完整性無損校驗:
    ffmpeg -v error -i 輸出檔名.mp4 -f null -
    
    終端機無任何報錯即代表影音同步、封裝完美無缺。

核心 API 速查表

功能語法說明
進度計算prog(u, t0, d=0.5)自 t0 秒開始,經歷 d 秒由 0 變為 1
彈跳縮放pop(ctx, cx, cy, p)圍繞中心點彈跳出場(帶 back 曲線)
關鍵字對齊ep.kw(sc, "文字", nth=0)精確推算該字詞被唸到的時間(已自動提前 0.25 秒)
圓角矩形rrect(ctx, x, y, w, h, r)定義圓角路徑
填色描邊fillstroke(ctx, fill, stroke, lw=5)同時填色並深色描邊
單行文字text(ctx, s, x, y, size, col, align='c')繪製文字,可選靠左 'l'、置中 'c'、靠右 'r'
膠囊標籤chip(ctx, "標籤", x, y, p, col, size=30)彈出式膠囊圖卡
彈出面板if panel(ctx, x, y, w, h, p): ... ctx.restore()內容白底面板(需與 restore 成對)
右下主持人corner(ctx, T, m)於右下角繪製微縮版常駐主持人
章節大標卡station_card(ctx, u, 站號, "站名")章節開頭置中浮現大字卡(前 1.9 秒)
重點整理結尾outro_doc(ep, ctx, u, T, m, sc, 標題, 副標, rows)天女散花紙屑、重點條列與下集預告結尾場景

踩坑避雷三大守則 (Crucial Guardrails)

  1. 字幕安全界線:
    • 底部 y = 648 ~ 702 為自動字幕專用區。
    • 所有資訊面板、資料卡片、按鈕下緣嚴格禁止超過 y = 610!
  2. 特殊符號與 Emoji 禁令:
    • Pycairo 在 Noto Sans CJK TC 字型下無法渲染 Emoji(如 ✨、📜、🌱)與特殊 Unicode 箭頭(➔、➜),會變成難看的豆腐方塊。
    • 替代方案:箭頭用 -> 或調用 arrow() 函式;星星用 star() 函式;打叉用純英數符號 × 或 mark(ctx, x, y, False, p)。
  3. 關鍵字精確度:
    • ep.kw(sc, phrase) 中的 phrase 必須是 script.json 該段文字中的精確子字串,不可多字、漏字或添加標點符號,否則會造成程序中斷。

參考文檔與範例資源

Skills relacionados