漫畫說故事
把主題做成 110–135 秒直式短影片:線稿被一筆筆描出來,對話泡泡逐個彈入,單口配音 + 大字幕。
產物 <專案>/out/final.mp4(1080×1920)。
聲音是主線。 把音軌單獨抽出來聽,必須是一條講得通的故事;畫面負責加戲,不是理解的前提。
五步做完
① 定故事 → <專案>/story.json
建目錄、拷模板:
mkdir -p <專案>/raw && cp templates/comic/story.example.json <專案>/story.json
先填檔案頭三行,填不出來就別寫格子:
"story_line": "誰 / 想幹什麼 / 卡在哪 / 結果,一句話說完",
"question": "開場砸出來的那個問題",
"answer": "最後一格給出、能答掉它的答案"
question 要挑「說不通」的點,不要挑「這是什麼」。答案不該是一串時間線。
然後寫每格的 narration(旁白)和 bubbles[].text(對話)。旁白 440–540 字,標點算字,按 4.0 字/秒反算。
python scripts/pipeline.py <專案> --stage script # 但不許往下走
① 的判定:三行齊全 → 字數在區間 → 每格有旁白 → 對話泡泡不出畫 → charts.py 裡的函數存在。
② 出圖 → <專案>/raw/<id>.png
先把所有 prompt 寫完,再一次性出圖。 出一張看一張會把出圖拖到一兩小時,中途改 prompt 還會讓畫風漂。
python scripts/comic_gen.py <專案> --list # 打印沒出過的 prompt,出過的自動跳過
按打印出來的 prompt 逐張生成,圖存進 raw/。必須圖生圖,參考圖用 assets/reference/01-style-anchor.png,相似度調 low。
python scripts/contact_sheet.py <專案> # 拼成一張總覽圖,看一次
python scripts/pipeline.py <專案> --stage image
② 的判定:總覽圖上只看兩件事——該在的人在不在、有沒有整片塗黑或空白。 其餘(圖上零星文字、身高差半個頭、線條髒、尾巴偏幾十像素)一律不看,直接往下走。
③ 製作 → final.mp4
python scripts/comic_run.py <專案>
依序跑:配音 → 泡泡層 / 資訊圖 → 淨化落版 → 逐筆渲染 → 合成直式 → 燒字幕。
單步重跑用對應的 comic_*.py。
④ 驗收
python scripts/verify_media.py --file <專案>/out/final.mp4 --expect <秒數>
ffmpeg -y -ss 3 -i <專案>/out/final.mp4 -vframes 1 <專案>/check/03.png
抽兩幀(第 3 秒、該格總長 × 0.75)比對:畫面在動嗎、底色對不對、字幕有沒有出畫。 再把音軌抽出來閉眼聽一遍:能說出「誰想要什麼、發生了哪幾件事、最後怎麼收」就算過。
⑤ 交付
<專案>/out/final.mp4。需要橫式版時用 out/story_flat.mp4。
十條硬規則
前三條管故事,違反就是「聽完不知道在說什麼」。後七條管製作,違反就是畫面或聲音錯了。
1. 先填 story_line / question / answer,填不出來不寫格子。
缺這三行,八格寫完才發現散,是最貴的一種返工。
2. 骨架按「主角和阻力是什麼關係」選,不要給所有主題套同一張格子表。
| 主角 vs 阻力 | 骨架 |
|---|---|
| 一個具體對手,一來一回 | 出招 → 化解 → 加碼 → 化解 → 最狠一招 → 化解 |
| 自己那條路走不通了 | 老本行快死了 → 試了幾樣都不成 → 意外冒出一件 → 押上去 → 成了 → 才明白賣的是什麼 |
| 一個說不通的現象,倒著查 | 反常的事 → 找到那個人 → 他當時的難處 → 他怎麼解的 |
| 爬到了頂,被不起眼的東西掀翻 | 巔峰 → 一道裂縫 → 誰都沒當真 → 押錯 → 塌 |
格數跟著故事走,5–9 格都行。
3. 並列的事不要編號成回合。 把「第一回合」換成「第一次」,故事不損失,那就不是回合,是貼上去的標籤——刪掉。 同理,不要用「加碼」「到頂」「攤牌」「老底」這類解說員行話,觀眾聽到的是暗號。
4. 旁白必須是一條聽得懂的完整故事,對話要念出來。 「他回了一句」「批了兩字」「一句話把他點醒」——聽眾只知道有人說了話,不知道說了什麼。 泡泡重複旁白不算錯,字幕本來就是聲音的重複。
5. 生成模型只畫線稿,字由程式疊。 prompt 裡寫「不要畫任何文字」,這是預防,不是出圖驗收標準。
6. 泡泡不進引擎。 引擎會把彩色二值化成黑塊。泡泡在合成時按時間彈,節奏更可控。
7. 不傳 element_plan。
傳了每個物體按 1.6 秒上限畫完即停,整格兩秒就畫滿。不傳時按 √面積分預算,總時長恆等。
8. 必須圖生圖,參考圖相似度調 low(0.3–0.5)。 相似度 high 時模型會照抄參考圖的姿勢,無視你寫的動作。
9. 角色寫進 characters,prompt 裡用 {名字} 引用;任意兩人至少三項不同。
頭飾、鬍鬚、衣服、體型各寫清。主角用異類頭飾(軟布巾 / 無冠),方冠冕冠頭盔留給對手和兵。
10. 底色用 colorkey + overlay;字幕燒 ASS 本體並宣告 PlayResX/Y。
用 blend=all_mode=multiply 底色會變螢光綠;SRT 交給 libass 會落到 384×288 座標系,字飛出畫面。
遇到問題查哪份
| 情況 | 讀 |
|---|---|
| 不知道怎麼把主題變成故事、每格該放什麼、結尾怎麼收 | references/story.md |
| 寫 prompt、定角色、泡泡排版、TTS、渲染與合成參數 | references/production.md |
| 畫面 / 聲音 / 時長出錯了 | references/troubleshooting.md |
| 寫 prompt 的具體模板和反向約束詞 | references/prompt-recipes.md |
| 配音音節 / 音色 | references/voice-design.md |
| edge-tts 報 403 | references/apiz-tts-fallback.md |
目錄
<專案>/
├── story.json 唯一配置:標題、三行故事、每格旁白/泡泡/prompt
├── charts.py 資訊圖格的繪圖函數(有 chart 格才需要)
├── raw/ 生成模型出的原圖 ← 你放進來
├── boards/ bubbles/ charts/ audio/ out/ ← 腳本產出
└── subs.ass
第一次用
bash scripts/setup.sh # macOS / Linux / Git Bash
powershell -ExecutionPolicy Bypass -File scripts/setup.ps1 # Windows
python scripts/self_test.py # 6 項自檢,跑一次就夠