Communitygithub.com

白底简笔吐槽短视频系列

製作一系列白底黑線、大頭喜劇吐槽短片:選題、寫稿、畫分鏡、逐句配音、渲染輸出、製作 3:4 封面,並產出微信視頻號所需的標題、描述、話題標籤與置頂評論。

白底简笔吐槽短视频系列 是什麼?

這個 AI 技能專門用於生產一系列風格統一的白底簡筆畫喜劇吐槽短片,適合在微信視頻號等平台發布。它能自動化一條完整的創作管線:從選題定位、撰寫稿本(JSON 格式,含畫面描述與重點詞)、生成字幕與時間軸,到使用 TTS 配音、繪製分鏡畫面(基於 Python 繪圖基元)、渲染出片(1080×1440,30fps),最後製作 3:4 封面與平台發布物料。技能內建多項品質檢查,包括佈局重疊檢測(check_overlap.py)、字幕與配音一致性校驗(check_project.py)、渲染後的編碼與時序驗證(verify.py),確保每一集的視覺風格與聽覺體驗零漂移。支援 macOS 與 Windows 平台,並內建 TTS 限流重試機制。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/inhai-wiki/doodle-comedy-series/tree/HEAD

在你喜歡的 AI 中提問

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

說明文件

白底簡筆吐槽短視頻系列

一條影片 = 一份稿 + 一組分鏡 + 一條音軌 + 一張封面 + 一套發布物料。 全部用同一套繪圖基元和字體畫出來,所以系列裡每一集風格一致、封面和正片零漂移。

產出契約

每一集必須交付這 5 組檔案,缺一不可:

產出檔案規格
字幕版成片out/<標題>_簡筆吐槽_字幕版.mp41080×1440,30fps,H.264+AAC,約 68s
無字幕版成片out/<標題>_簡筆吐槽_無字幕版.mp4同上,去掉字幕層
字幕檔案out/<標題>.srt單行 ≤16 字,時間遞增不重疊
3:4 封面out/<標題>_封面.png1080×1440,與正片同一套線條和字體
視頻號物料project_*/publish.md + publish.json3 檔標題、1 版描述、5–8 個話題、1 條置頂評論

另附 out/<標題>_預覽.png(四格關鍵幀條),方便用戶一屏看完一集。

環境

Python 3.10+、Pillow、NumPy、ffmpeg/ffprobe。先建虛擬環境,不動系統 Python:

python3 -m venv .venv && .venv/bin/pip install -r "$skill_dir/scripts/requirements.txt"

macOS 上 ffmpeg 常不在預設 PATH,先 export PATH="/opt/homebrew/bin:$PATH"。 配音走 mcode-tools(MiniMax TTS/ASR),需要 mcode-tools-master 技能在 PATH 上。

如果 python3 報 You have not agreed to the Xcode license agreements(退出碼 69), 說明系統 Python 沒裝好,換一個能用的直譯器建環境,例如 /opt/homebrew/bin/python3.13 -m venv .venv,不要去動 Xcode 的授權。

流程

1. 定選題與系列定位

單集:給一個梗味方向就行。多集:先給每集一個互斥的梗味,不要同一種笑法換皮。

  • 自嘲荒誕流(自己越講越離譜)
  • 對話反轉型(兩人對話推進,最後一句翻盤)
  • 冷觀察流(旁觀式吐槽,克制冷幽默)
  • 荒誕設定流(把一個荒唐前提當真)

同一系列裡至少有兩種不同梗味相鄰,視覺語言可以共用,敘事節奏不要雷同。

2. 寫稿

讀 [references/writing-style.md]。硬指標:

  • 一句一鏡,約 40–45 句、480–520 字,落點約 68s(字數 ÷ 7.4 ≈ 秒數)。
  • 每個包袱必須有一個看得見的動作或道具變化兌現,不能只靠字幕說。
  • 結尾要翻轉角色關係,留一句能單獨截图的台詞。
  • 寫成 JSON:{"title": ..., "target_seconds": 68, "segments": [{"scene": ..., "text": ..., "red": [...]}]} scene 是畫面 id,red 是要標紅的詞(必須原樣出現在 text 裡)。

3. 切分鏡

"$python_bin" "$skill_dir/scripts/build_segments.py" --story story.json --out project_ep2

字幕按標點切成 ≤16 字一行;渲染器一行放不下 17 字以上。切分點挑「接近 10 字」的 標點,避免把詞劈開(「大型预付」不能切成「大型预」「预付」);引號裡的短句整段不拆, 不會切出以 」 開頭的行。腳本會校驗紅詞在字幕裡、切分沒丟字、沒出現純標點空字幕, 並列印預估時長:字數 ÷ 7.4 ≈ 秒數,偏離目標 ±10% 會給出警告——按提示加減句子, 不要靠改語速硬湊。

4. 畫分鏡

在 project_ep2/scenes.py 裡寫 scene_<id>(c, t, d) 函數,並在檔案末尾重新定義 SCENES 字典(只含本集的 id)。繪圖基元見 scripts/render/doodles.py。

  • person(c,x,y,s,expr,boss,pose,t,arms,legs):頭心在 (x,y),身體到 y+307*s,expr 取 dead/sad/happy/angry/shocked/sleep,pose 取 stand/shrug/point/phone/pockets/walk。
  • woman(c,x,y,s,expr,t):妈妈造型(髮髻 + 裙子)。
  • speech(c,x,y,w,h,tail,size):氣泡;c.text((x,y),'字',size) 是居中錨點。
  • c.curve 只接受 4 個控制點;c.text 不支援描邊和多行。

改完先過兩道門:

"$python_bin" "$skill_dir/scripts/check_overlap.py" project_ep2/scenes.py   # 靜態佈局審計
"$python_bin" "$skill_dir/scripts/check_project.py" project_ep2             # 接觸表目檢

check_overlap.py 抓文字壓人物、文字互相重疊、元素超出安全帶。它已經辨識兩種 「看起來重疊但其實不是」的情況:if/else 裡互斥的換字,以及白色底色塊蓋住舊元素。 所以報出來的基本是真問題——退出碼非 0 就先修,不要直接渲染。

check_project.py 先查字幕,再出接觸表:字幕拼起來必須和台詞是同一句話 (允許人工潤色過的標點,但不許多字、少字、換詞),也不許出現沒有字的空字幕; 不通過就直接退出,不會浪費時間去渲染接觸表。

確實要保留的重疊(例如畫在人物身上的掛牌徽章),在 scenes.py 裡顯式登記:

OVERLAP_ALLOW = {"three_years", "me_too"}

接觸表要逐鏡看:畫面和這句台詞對得上嗎?道具畫清楚了嗎?

5. 配音

"$python_bin" "$skill_dir/scripts/build_voice.py" --project project_ep2 --speed 1.5 --gap 0.10

逐句合成是這套流程的關鍵:每一句單獨 TTS,裁掉首尾靜音後用固定間隔拼接, 所以每句的起止時間已知,asr.json 直接按這些時間構造,字幕對齊零誤差, 不需要詞級 ASR。

  • 預設音色 lengdan_xiongzhang(冷淡學長),用戶指定別的就用別的。
  • TTS 有短周期限流(HTTP 429)。腳本用固定 10 秒間隔重試——固定間隔比遞增退避有效得多。
  • 單集约 40–45 句,全程約 15 分鐘,背景跑。
  • 合成完用 scripts/tts.py asr --file project_ep2/voice.wav 抽查一遍。
  • 近音誤識(「办事/办事时」)只改 ASR 結果裡的字,不改稿、不重錄。

6. 時間軸、渲染與驗收

"$python_bin" "$skill_dir/scripts/deliver.py" project_ep2 <標題> --target 68
"$python_bin" "$skill_dir/scripts/verify.py" project_ep2

deliver.py 會按目標時長反算 atempo(speed = 原始音軌 / (目標 - 尾留)), 生成時間軸、字幕、混音,渲染字幕版和無字幕版,並把成片和 SRT 歸檔到 out/。

verify.py 查:編碼參數、全片解碼、字幕時序與長度、ASR 回聽。 驗收全綠才算做完;解碼失敗、字幕時序有問題必須修完重渲。

7. 封面

封面不用 AI 生圖,用正片同一套繪圖基元和字體重畫,風格零漂移。

在 project_ep2/cover.py 裡寫 illustration(c)(繪圖基元已注入命名空間), 在 project_ep2/cover.json 裡寫文案行:

{"lines": [
  {"text": "相親現場", "size": 146, "y": 170, "red": []},
  {"text": "我媽給我報了七個", "size": 96, "y": 312, "red": ["七個"]},
  {"text": "見家長見姥姥", "size": 64, "y": 1196, "red": []},
  {"text": "八十七了也不催生", "size": 64, "y": 1280, "red": ["催生"]}
]}
"$python_bin" "$skill_dir/scripts/make_cover.py" project_ep2

版面規則見 [references/cover-design.md]。封面必須單獨看一眼再交付。

8. 視頻號發布物料

先要素材,再寫文案:

"$python_bin" "$skill_dir/scripts/make_metadata.py" project_ep2

腳本會列印全稿、紅詞、高頻詞和結尾三句。據此寫:

  • 標題 3 檔,帶 emoji 鉤子,每檔 ≤22 字最好(超出仍可,硬上限 100 字)。
  • 描述 1 版定稿,2–3 行,第一行是鉤子,話題以 #話題 內聯在正文裡。
  • 話題標籤 5–8 個,必須都出現在描述裡(腳本會校驗)。
  • 置頂評論 1 條,引導補充或自嘲。

寫好後:

"$python_bin" "$skill_dir/scripts/make_metadata.py" project_ep2 \
  --titles "標題一" "標題二" "標題三" \
  --desc "描述正文 #話題1 #話題2" \
  --tags "話題1" "話題2" \
  --comment "置頂評論"

規則細節見 [references/publish-channels.md]。產物 publish.md / publish.json。

硬約束

  • 畫布 1080×1440(3:4),30fps,純白底,輪廓 4–6px 黑線,大圓頭細身體。
  • 主體集中在 y=400–1050,上方留白;字幕帶從 y=1084 開始,字號下限 54。
  • 字幕用行楷(Xingkai),白字加深色軟陰影,包袱關鍵詞標紅。
  • 字幕一行 ≤16 字,渲染器放不下更長的。
  • 不把正文燒進畫面,字幕單獨一層渲染。
  • 封面必須和正片同一套字體和線條,不允許換風格。
  • 保留已有成片;改稿用新項目目錄,不覆蓋已交付的集。

失敗處理

  • TTS 一直 429:腳本已固定間隔重試 40 次。仍失敗就降速到 1.4 再跑,或分批跑 (--limit N 續跑,緩存會跳過已合成的句子)。
  • prepare.py 報 ASR 不一致:說明 asr.json 和稿子對不上,通常是改稿後沒重配音。 重跑 build_voice.py,不要用 --allow-asr-mismatch 糊過去。
  • render.py 報字幕過長:某條 caption 超了 16 字,回 build_segments.py 改切分規則。
  • check_overlap.py 非 0:按報出的 scene id 逐個改座標,直到退出碼為 0。
  • 配音沒聽完就別說聽檢通過;沒完整看片別說完整觀看。交付記錄只寫實際做過的驗證。

參考

Windows (win32) platform notes

Windows 下的等價做法:

  • 虛擬環境:py -3 -m venv .venv,之後用 .venv\Scripts\python.exe 替代 $python_bin。
  • 依賴:.venv\Scripts\pip.exe install -r "<skill_dir>\scripts\requirements.txt"。
  • ffmpeg/ffprobe 直接裝進 PATH(winget install Gyan.FFmpeg),無需加 /opt/homebrew/bin; 但 scripts/deliver.py、scripts/make_preview.py、scripts/verify.py 裡的 ffmpeg 路徑是硬編碼的 macOS 絕對路徑,改成 ffmpeg / ffprobe 即可跨平台。
  • scripts/build_voice.py 依賴 mcode-tools 在 PATH 上,以及 curl;Windows 10 1803+ 自帶 curl,若缺失可用 Invoke-WebRequest -OutFile <path> <url> 代替。
  • 路徑分隔符:所有腳本用 pathlib 處理,傳參時給引號包裹路徑即可。

相關技能