← 網誌

CurioTails:用 ComfyUI 和 Qwen3-TTS 做一本繪本

2026 年 8 月 28 日 · 閱讀時間 6 分鐘

CurioTails 是一本以 AI 製作的有聲繪本,故事圍繞著一群色鉛筆風格的森林動物,目前仍在進行中。這篇分享到目前為止最花時間的四個問題:如何讓角色維持一致、讓畫風不跑掉、讓場景符合空間邏輯,以及讓聲音聽起來自然。

我是一名設計師,也很清楚手繪藝術和人工配音有它們無法被取代的價值。

真正的手繪作品有筆觸、偶然性和人的判斷;好的配音演員也不只是把文字念出來,他們會先理解角色,再決定一個停頓、一個語氣,甚至一句話應該怎麼呼吸。

所以,這個專案從來不是想證明 AI 可以取代這些事情。

我反而想知道另一件事:

如果我把 AI 當成一套需要被設計、控制和反覆挑選的工具,它能不能做出不像 AI Slop 的內容?

我想做的是一本真正可以閱讀的繪本。角色要有自己的個性,畫面要有一致的視覺語言,場景要符合基本的空間邏輯,文字和插畫之間要有關係,聲音也不能只是把文字機械地念出來。

更重要的是,最後的判斷仍然要由人來做。AI 可以生成很多東西,但生成得多不代表作品就好。對我來說,設計師真正能介入的地方,是決定什麼該留下、什麼該被丟掉,以及如何建立一套流程,讓好的結果可以被穩定地重複。

這也是 CurioTails 最主要的實驗。我把它當成一個小型的 AI production system:從角色、畫風、場景到聲音,盡可能把原本靠人工經驗判斷的事情拆開、測量,再重新組合。

這篇文章會分享其中最花時間的四個問題:角色生成、畫風一致性、合理的場景構圖,以及聲音設計。

放在木桌上的精裝繪本,封面寫著 CurioTails,畫著刺蝟與浣熊在樹樁旁。
紙本版的示意 mockup。封面插圖、標題排版和這張 mockup 照片本身,都是用專案自己的管線生成的。

重點摘要

  • 目標: 製作一套有固定角色陣容的繪本系列。每一集講一個故事、介紹一個概念,同一套美術素材還要能延伸成旁白影片、短影音與紙本繪本。
  • 做法: 讓兩個影像模型各自負責擅長的事情:一個處理結構,一個處理風格。先確定整體畫風,再建立角色。每一頁都拆成獨立圖層,修改其中一個部分時,不需要整頁重做。
  • 成果: 建立四個穩定的角色、一套頁面構圖系統,以及一系列自動檢查機制,在人工審稿之前就先把常見錯誤抓出來。第一集目前正在逐頁製作中。

一分鐘了解這個專案

如果要快速理解 CurioTails,可以想像成節奏更慢、內容更簡單的《魔法校車》。

每一集只介紹一個概念,每頁最多放三個重點物件,再由四隻森林動物帶著故事往前走:刺蝟、浣熊、狐狸和臭鼬。

但真正影響整個製作流程的,是一個很實際的限制:

同一套美術素材必須同時適用於長影片、直式短影音和紙本繪本,而且還要支援不同語言。

因此,每一頁從一開始就被拆成四個獨立部分:背景、角色、文字和聲音。

這樣一來,如果今天只修改一句對白,只需要重新排版那段文字,再重新錄製對應的音訊,不需要重新繪製整個頁面。

整條管線都跑在本地的一張消費級顯示卡上:影像透過 ComfyUI 生成(用 API 驅動,搭配 Z-Image、FLUX.2 Klein 與自訓的 LoRA),所有聲音則來自 Qwen3-TTS。

第一集完成的一頁:橡樹樹幹裡的廚房,右側紙面留白排著縮排的對白。
第一集完成的一頁:橡樹樹幹裡的廚房。畫面、角色、文字都是獨立圖層,最後才合成。

角色:讓不同模型各自做擅長的事

很快我就發現,沒有一個模型能把所有事情都做好。

Z-Image 比較擅長處理結構。 它生成的動物通常符合基本的解剖邏輯,姿勢也比較自然。但它預設的畫風太寫實,和我想要的兒童繪本風格有落差。

Klein 則比較擅長處理風格。 它能生成我想要的經典繪本質感:柔和的水彩搭配細緻的鉛筆線條,有點接近 Beatrix Potter 的作品。但我不希望讓它同時負責角色的身體結構。

同一段浣熊 prompt 的三張原始輸出:Z-Image Turbo、FLUX.2 Klein 4B、Qwen-Image 2512,各自在解剖與鉛筆質感上有不同取捨。
三個模型、同一段 prompt、同一個 seed 的原始輸出。Z-Image Turbo 解剖正確、鉛筆感中規中矩;Klein 的色鉛筆筆觸最真,但結構最鬆(數一下尾巴);Qwen-Image 毛髮畫得太細,反而不像手繪。這就是管線把結構和風格交給不同模型的原因。

Qwen 沒有被留下的原因很實際:成果和 Z-Image 只有些微落差,但模型重得多,在我的顯示卡上生成也明顯比較慢。而這個階段我要的只是給 Klein 當草圖的結構稿,Z-Image 就夠了。

所以最後的流程,就像讓兩位不同專長的畫家接力完成作品:

  • Z-Image 先畫草稿。 每個角色生成 12 種姿勢,每種姿勢各做兩個版本,再由人工挑出比較好的結果。
  • Klein 接手處理風格。 被選中的角色會重新繪製成我設定好的繪本風格,同時以原本的草稿作為參考。這個階段也可以順便修正細節,例如要求「把臭鼬的臉改成純黑」或「移除草地」。
  • 最後用 LoRA 固定角色。 重新繪製後的角色會成為每個角色專屬 LoRA 的訓練資料。完成之後,即使換成不同姿勢、不同場景,角色仍然能維持相同的辨識特徵。
ComfyUI 節點圖:參考圖經 VAE 編碼後透過 Reference Latent 掛進 conditioning,再由 Klein 4B 以四步採樣。
Klein 重繪步驟實際的 ComfyUI 節點圖(由 API 驅動):參考圖經 VAE 編碼後,透過 Reference Latent 掛進正負向 conditioning,Klein 才會重繪「這一張圖」,而不是自己想像一張。上面的實體書 mockup 也是同一張圖跑出來的。

最後形成的四個角色是:Roro the hedgehog、Washi the raccoon、Kiko the fox,以及 Ponder the skunk。兩個孩子、兩位長輩;每一組裡各有一個比較認真、一個比較活潑的角色。

四張 LoRA 產出的角色圖:刺蝟、浣熊、戴藍領巾的狐狸、披著針織披肩的臭鼬。
四位角色由各自訓練完成的 LoRA 畫出。這四張來自每個 LoRA 都要通過的固定驗證組。

每個角色也有自己固定的聲音。可以點下面的句子試聽,包括幾段選角時的情緒表現。這些聲音是怎麼被導演的,會在後面的聲音章節說明。

Washi · 浣熊

聲音:sohee,用導演指示推高到兒童音域。

Roro · 刺蝟

聲音:ono_anna,明亮,永遠稍微太大聲。

Kiko · 狐狸

聲音:ryan,溫暖、不疾不徐的大人。

Ponder · 臭鼬

聲音:serena,放慢到沉穩的節奏。

一致性:從 AI 最容易出錯的地方開始設計

這些角色看起來很簡單,而且這是刻意的。

我後來發現,角色設計的每一條規則,其實都來自 AI 曾經犯過的錯:

  • 不穿衣服,也不使用配件。 配件是最容易在不同圖片之間跑掉的元素。圍巾可能一下變色、一下變大,甚至莫名其妙多出一條。(兩位長輩後來各獲得一件衣物:素色領巾、素色披肩。柔軟、單色、無花紋,正是為了不會跑掉。)
  • 避免複雜圖案。 格紋、花紋之類的圖案,每次生成都可能被重新解讀,最後模型會把這個區域理解成「可以隨機變化」的地方。
  • 使用純色的珠狀眼睛,不畫眼白。 這本來就是經典繪本常見的表現方式,同時也能避免一整類眼神失控的問題。角色的情緒則交給眉毛、嘴巴、耳朵和姿勢來表現。
  • 所有東西都要數。 四隻腳、兩隻耳朵、一條尾巴,都直接寫進 prompt 裡,最後再一個一個確認。聽起來有點誇張,但要抓出 AI 多生成一隻腳這種問題,數數其實是最可靠的方法。

拿掉配件之後,角色的辨識度主要靠三件事情維持:輪廓、尺寸和顏色。四個角色的輪廓完全不同;長輩大約是孩子的兩倍大;顏色則分別是灰色、栗色加奶油色、橘色,以及黑白色。

還有一個同樣重要的順序:

一定要先確定畫風,再製作角色。因為 LoRA 學到的不只是角色,也包含角色所處的視覺風格。如果角色都訓練完成之後才決定改變畫風,就代表每個角色都得重新訓練。

所以我先做了四組畫風測試。相同場景、相同 seed,只改變畫風,最後才決定採用哪個方向。我最後選擇的是 D:經典繪本風格,以水彩搭配細緻的鉛筆線條。之後所有角色都以這套風格作為訓練基準。

同一隻浣熊的八張圖:上排四種表情,下排四種較難的姿勢,畫風完全一致。
Washi 的 LoRA 固定驗證組:上排四種表情,下排四種較難的姿勢。每個角色一個專屬模型,身分與畫風在所有姿勢下都維持一致。

場景:把一頁繪本當成一組圖層

一頁畫面在影片裡可能會停留一到兩分鐘。如果只是放一張靜態圖片,很容易顯得單調,所以我把每一頁當成一組可以獨立調整的圖層,讓畫面在不同節奏點產生小幅度變化:角色換一個姿勢、鏡頭稍微移動、文字出現,或者加入一個聲音。

一頁的分層爆炸圖:背景、角色、前景、光線配方、文字五層,下方是聲音時間軸。
一頁的分層結構(等角示意)。由下往上:背景、角色、前景、光線配方(疊在整個畫面上的調整層),最後是永遠不被染色的文字;聲音在下方的時間軸上。虛線是兩條讓構圖合理的規則:腳點要落在可行走地面、角色視線指向文字。

一個完整頁面由下往上大致分成:

  • 背景:地平線固定在 60%;尺寸以已知大小的參考物件推算;可行走的地面區域由人工確認。
  • 角色:使用去背 PNG;每一個新的節奏點可以換成另一個姿勢;角色的接觸陰影直接和角色一起保留。
  • 前景:只覆蓋畫面最下方約三分之一,不遮住角色的臉;移動速度比背景快,形成視差效果。
  • 光線:一層套用在背景和角色上的色調、一層角色專用的暖/冷色邊緣光,以及一層覆蓋整體的光暈。
  • 文字:放在紙張留白處;不套用場景的整體色調;對話縮排位置會配合角色的位置。
  • 聲音:旁白、對話、音效、環境音與音樂。

每個節奏點都由一小段文字、一個視覺變化,以及對應的聲音組成。每頁大約有 3–6 個節奏點。這種做法最大的好處很簡單:改一句話,就只需要重新錄那一句。不需要重做整頁。

AI 生成場景時,真正讓人出戲的問題,通常是畫面合不合理。角色漂浮在地板上、站在樹根上,或者尺寸和其他物件對不起來,都會讓人立刻感覺到不對。我最後用三條規則解決大部分問題:

  • 尺寸不能靠目測。 每個背景都先用一個已知尺寸的物件作為基準,例如椅子或桌子,再從這個基準推算角色大小。如果狐狸應該是兩張椅子的高度,數學就會直接告訴我結果是否合理。
  • 位置不能靠目測。 每個背景都有一個人工確認過的「可行走地面」區域。如果角色的腳落在這個區域之外,頁面就直接建置失敗,才不會讓一隻浣熊最後站在門檻上。
  • 陰影不要後製貼上去。 我以前會在角色腳下加一個柔和的橢圓陰影,但看起來總像貼紙。現在陰影會和角色一起生成,再保留在角色的去背圖裡。
Kiko 的廚房,木地板上畫著綠色的可行走地面多邊形,門檻處有一個紅色叉叉在多邊形外。
Kiko 廚房的「可行走地面」debug 疊圖:每個角色的腳都必須落在綠色多邊形內。紅色叉叉是真實發生過的一組座標,當時有角色站上了門檻,腳下就是屋外的蕨葉,被檢查直接攔下。

光線也要獨立出來

光線採用相同的分層概念。我不會直接把火光畫進角色圖片裡,因為這樣一來,這個角色就只能使用在那個特定場景。

所以每個場景都有自己的光線配方(light recipe)。它是一個放在完整插畫上方、文字下方的調整圖層,包含:同時套用到背景與角色的整體色調、只套用到角色邊緣的暖色或冷色光,以及覆蓋整個場景的光暈。

這樣同一個角色和同一個背景,就可以快速切換成正午、黎明、黃金時刻、黃昏、夜晚、營火或街燈等不同光線。作品本身完全不需要改。光線只是另一個可以替換的圖層。

同一隻浣熊與同一張背景,套上七種光線配方:正午、黎明、黃金時刻、黃昏、夜晚、營火、街燈。
同一張角色去背圖、同一張背景,套上七種光線配方。

多角色場景:不要讓模型自己猜比例

當畫面裡有多個角色時,我也不再相信模型能正確判斷比例。模型傾向把畫面中的角色都生成成「舒服的大小」:單獨看沒有問題,但放在一起就會失去比例。

所以我改用 block-out 先把構圖鎖定:先用幾個橢圓和一張桌子建立簡單的空間關係,再讓模型按照這個結構生成完整場景。

我也測過直接用文字描述比例,例如「刺蝟只到狐狸的腳掌高」。結果並不可靠:有一張圖裡刺蝟變得非常小,另一張甚至直接消失。block-out 反而能更穩定地控制角色的位置與尺寸。

左上是橢圓與桌子組成的 block-out 輪廓圖,另外兩張是照它生成的場景:四隻動物的位置與大小都跟著草圖。
左上是經 ControlNet 使用的 block-out 輪廓。兩張生成場景的位置與相對大小都跟著草圖走,畫風也維持在本書的風格內。

文字不應該蓋在插畫上

文字的處理方式也改過一次。一開始,我用了半透明的字幕條,結果每一頁看起來都像遊戲字幕。

後來我把文字放回真正的紙張留白處,並且根據角色正在看的方向安排位置。這樣讀者的視線會自然地從角色移到文字,再走向下一頁。

對話也不使用角色姓名標籤。如果畫面左邊的動物說話,文字就靠左;右邊的動物說話,文字就向內縮排。這個交錯的縮排本身,就成為對話來回進行的視覺節奏。

第一集第一頁:鉛筆畫的灰色都市巷弄,浣熊一家往右走,文字排在右側留白。
第一集第一頁。文字提到的元素畫面裡都有,視覺的擁擠就是「吵」的視覺對應;一家人往右走,順著翻頁的方向。
小景頁:刺蝟與捧著橡實的浣熊面對面,右欄對白以交錯縮排排版。
不用姓名標籤的對話:畫面左邊的動物齊左,右邊的動物向內縮排。

聲音:選對聲音,比寫更多指令更重要

每個角色都有固定的聲音,使用本地端的 Qwen3-TTS 生成。模型本身沒有真正的兒童聲音,所以我會利用音高去區分年齡:同一個聲音用較低的音調讀奶奶,再用更高的音調讀小浣熊,最後可以得到相當接近 5–7 歲兒童的聲音範圍。

但我在 TTS 上學到最重要的一件事是:

指令越長,朗讀通常越差。為了量化這件事,我定義了一個 drag ratio,用來衡量實際播放時間相對於字數所應有的自然語速,多出了多少時間(1.0 代表自然語速):

  • 簡短指令:1.17
  • 最小化指令,例如「native accent」:1.31
  • 詳細的口音說明:1.46
  • 再加入 voice actor persona:1.80

最長指令下,最差的一段甚至被拉長到 24 秒。問題在於,越詳細的指令會讓模型開始「很認真地表演」:母音被拉長、句尾開始拖音。我甚至自己製造了奇怪的呼吸聲,原因只是 prompt 裡寫了「在標點處自然呼吸」。對模型來說,這其實就是在要求它加入呼吸聲。

最後,我把指令縮成四個簡單句子,而且不再加入額外要求。

選角比導演更有效

語氣的控制也遇到類似問題。我曾經要求旁白「保持平靜的音調」,結果聲音反而變得更戲劇化。因為只要提到「音調」,模型就會把它理解成「請表演音調」。

指令可以影響表演,但很難限制表演。真正有效的方法其實是選聲音。在所有可用的聲音裡,最平靜的聲音,在相同指令下,音高變化幅度只有最戲劇化聲音的三分之一。所以與其花大量時間寫 prompt,不如先選對聲音。

Qwen3-TTS 的極限:口音

有一個我一直沒能完全解決的限制:內建聲線念英文時,多少都帶著一點口音。我先試著用指示修正,也就是上面拖音率的故事;後來又試了 VoiceDesign,不用內建聲線,改用一段文字描述從零設計一個聲音。

VoiceDesign 可以聽起來很接近母語者,但一致性很難克服:同一段描述、同一句台詞,生成出來可能是明顯不同的聲音。對一個要在整季維持同一把聲音的角色來說,這樣行不通。

所以班底還是用內建聲線。每個角色都留著一點點口音,目前我覺得在可以接受的範圍。下面是當時測試留下的幾段紀錄:

測試:指示長度

同一句話、同一個聲線,三種指示版本。

測試:VoiceDesign 一致性

同一段描述、同一句台詞,三個 take。

標點符號其實才是節奏控制器

我最後還發現,標點符號對節奏的影響非常大。同一句話,使用普通標點,可以在 5 秒內讀完;換成刪節號和破折號,可能會拉長到 11 秒。

因此,畫面文字和配音稿最後被拆成兩份文件。例如畫面上的文字可以保留「這裡好安靜……」,但配音稿則使用逗號,讓聲音模型自然控制停頓。

讓品質檢查也自動化

每段音訊都會經過自動檢查。Whisper 會重新轉錄音訊,確認有沒有漏字或多字;另外也會透過簡單的聲學檢查,偵測呼吸聲和過度拖音。如果超過設定門檻,這段音訊就會重新生成,最多嘗試四次。

旁白還多一道流程:每句話生成三個版本,再選出最接近這一季參考錄音的版本。

三件我會再次採用的做法

1. 讓不同模型負責不同事情

用擅長理解解剖結構的模型畫草稿,再用擅長視覺風格的模型重新繪製,最後透過 LoRA 鎖定角色。每個模型只做自己最擅長的事情。

2. 選擇,比不斷下指令更重要

不管是圖片還是聲音,不斷增加指令通常只會讓結果變差。與其一直修改 prompt,不如在簡短指令下多生成幾個候選版本,再把時間花在選擇上:seed、take、voice。

3. 把「看起來對」變成可以測量的東西

可行走地面檢查、參考物件尺寸計算、drag ratio 門檻、語音轉錄差異,這些都可以交給系統檢查。

品味仍然需要人來判斷,但所有低於「品味」的事情,都應該能被系統自動檢查,而且一旦出錯,就直接報錯。

這是一個進行中的專案

CurioTails 還在進行中。第一集正在一頁一頁地製作,每一頁通常都會經過好幾輪審視和重做,才算真正完成。

還有一個影響了上面每個決定的限制:我希望整條管線完全用本地模型處理,而我的顯示卡只有 12GB VRAM,很多選擇都是在這個預算內做的。如果之後改走雲端,我會試著用 Nano Banana 處理部分圖面,並用 ElevenLabs 處理音樂和聲音。

下面是目前完成的頁面。逐頁製作的過程也累積了另一批經驗,關於伏筆、翻頁和連戲,之後會再寫一篇分享。

第 1 頁:Washi 一家走出灰色的都市。
第 2 頁:一家人望向安靜的森林山谷。
第 3 頁:一排橡樹,每一棵都有一扇小門。
第 4 頁:三張小圖,Washi 對著樹樁練習打招呼。
第 5 頁:村子的全景,小路上有一隻刺蝟。
第 6 頁:三張小圖,Roro 撞上 Washi。
第 7 頁:Roro 和 Washi 對著一顆橡實聊天。
第 8 頁:橡樹裡 Kiko 的廚房。

第 1 頁:Washi 一家離開都市。