小說變漫畫的第一關:同一個房間,每一格都要是同一個房間

comic-studio 是一個純前端的漫畫工作台,章節文字進去、可安裝的 PWA 漫畫站出來。前兩話做下來我只解到第一關:角色跟空間不再每格重擲。離「畫得對的漫畫」還差很多關,這篇也把還沒解的那些寫出來。

comic-studio 漫畫工作台

這篇講的東西

生圖模型現在畫一張漫畫格畫得很好。畫第二格的時候,主角換了一張臉,房間裡的桌子換了位置,牆上多了一扇上一格沒有的窗。

這是第一關。一格好看跟一話能讀,中間隔著的東西跟畫技無關,而我到現在也只走過這一關。後面還有幾關我很清楚自己還沒解,寫在文章最後。

先講成品長什麼樣

comic-studio 是一個工作台,不是閱讀器。流程是:貼進章節原文,AI 切成分鏡腳本,逐格生圖,對白氣泡排版,最後匯出一個完整的靜態站,含首頁、每章獨立頁、角色頁、離線快取、sitemap,可以安裝到手機桌面。

它沒有後端也沒有帳號。專案資料整包存在自己電腦的資料夾裡(File System Access API,所以要 Chromium 系的瀏覽器)。模型可以換,自帶 baseurl、model、key;key 預設只留在記憶體,關分頁就沒了,我自己是把它放在專案資料夾的 keys.json,開專案時帶進記憶體,不碰瀏覽器儲存空間。

一張立繪不夠,要三張

角色庫每個角色一張文字設定卡加三張設定表:立繪管長相服裝,表情集是九宮格情緒,動作集是九宮格全身動態。後兩張是拿立繪當參考圖生的,同一張臉只換情緒跟體態。

為什麼要三張,理由很實際:只給一張中性立繪,每一格的臉都會趨中,然後連載讀者第一個抱怨就是「主角表情太少」。

生圖的時候立繪一定附,這一格分鏡寫了表情就附表情集,是動作鏡頭就附動作集。總數壓在 4 張以內,再多特徵會互相污染。

設定卡上還有一欄叫「絕對不可出現」。模型最愛自己補帽子、眼鏡、現代服裝,只寫「他長什麼樣」擋不住,要把「他沒有什麼」也寫死。

同一個房間,每一格都要是同一個房間

角色鎖住之後,第二個垮掉的是空間。

8 月 1 日那批 commit 加的是平面配置圖跟機位表:同一個場景畫一張俯視平面圖,標好家具、標好人站在哪(seating 欄位鎖「誰在哪裡」),再定義幾個固定機位,生圖時在圖上用點的選這一格從哪裡拍。站位一律用絕對方位描述,不用「左邊」這種相對詞,因為左邊是相對於鏡頭的,鏡頭一換就全錯。

8 月 3 日修的則是一個很細但很痛的東西:機位那句話原本埋在角色設定卡後面,被稀釋掉了。它是空間前提,必須排在最前面。長 prompt 裡指令的位置比措辭重要,這件事我在別的專案上也栽過。

再上一層是時間。同一場戲跨很多格,中途被砍斷的柱子在後面的格又長回來,是因為沒有人記得「這場戲現在的狀態」。所以分鏡表之前還要有場次層,分鏡表只是最後一張紙。

抽成一個技能:cast-lock

做到這裡我把規則抽出來寫成 cast-lock,五層,由下往上:

管什麼 沒有它會怎樣
素材 誰、什麼東西長什麼樣 角色每頁換臉、道具消失
空間 東西在哪、從哪裡看 同一個房間每格重擺一次家具
時間 這場戲的狀態、中途變了什麼 被切掉的柱子又長回來
表演 表情、動作、視線 一整排罰站、全體看鏡頭
產線 送什麼進模型、怎麼驗收 修了半天發現改的東西根本沒送出去

貫穿五層的一句話:凡是同一場戲跨很多格的東西,都要有單一事實來源,而且不要用文字重述它。重述一次就是製造矛盾的機會,文字跟圖對不上時模型只能二選一,而你不知道它選了哪邊。

表演那層是三欄,有角色的格三欄缺一不可:表情(眼睛眉毛嘴巴的具體狀態)、動作(重心在哪隻腳、手在做什麼、跟環境的接觸點)、視線(眼睛看向哪的落點)。缺表情得到呆臉,缺動作得到每格同一個罰站的人,缺視線得到一整排直視鏡頭發呆。

字不要畫進圖裡

排版分三層:底圖不動,上面疊效果層,再上面疊字層。

字層是 HTML 文字疊在圖上,點擊新增、拖曳移動、雙擊改字。這樣改字成本是零。要是把台詞畫進圖裡,改一個錯字就得重生整格,而重生出來的圖跟原本那張不會一樣。我在別的專案上量過這件事:AI 生圖的中文字會翻車,主因不是模型不會寫字,是改字太貴所以沒人改。

效果層留給 CSS 做不出來的東西,畫出來的擬聲字、光暈、煙。墨模式白底黑墨用 multiply 疊、光模式黑底發光用 screen 疊,不用摳圖。底圖永遠不被破壞。

只有「文字要跟畫互動」的特殊格才走整格重繪,拿選定圖加排版文字請模型 image-edit 把字畫進去。匯出時有重繪就用重繪圖,沒有就退回 CSS 疊字。

排版工具那批是實際排到崩潰才補的:Ctrl+Z 存 30 步、全章取代文字(改一個角色名不必逐格開視窗)、完稿檢查抓忘了放氣泡、氣泡拖出畫面、空氣泡、還留著預設字、字級小到看不清。完稿檢查也有 CLI 版,有錯直接 exit 1。

匯出的是一個站,不是一個檔案

匯出品是自包含的靜態 PWA:首頁有封面 hero 跟繼續閱讀、每章獨立頁有 canonical 跟上下章、角色頁自動從角色庫生、SHELL 與 ASSET 兩層離線快取而且版號用內容雜湊自動 bump、有 sitemap 跟 robots、封面會另外產一張 1200×630 的 og.jpg。字型自架成子集化的 woff2 跟站一起走,讀者裝置有沒有裝中文字型都長一樣。

8 月 7 日還修了一版:圖改成讀到才快取,不然安裝的時候會先吞下整本。

只解了第一關,還沒解的比解掉的多

寫到這裡看起來像一條完整的產線,但它不是。前面那些東西加起來只做到一件事:角色跟空間不再每一格重擲一次。那是能不能讀的門檻,不是畫得對不對。

我知道自己還沒解的有這些。

驗收還是靠我的眼睛。 排版那層有完稿檢查,抓的是氣泡忘了放、字太小、拖出畫面這種形式問題。畫面本身對不對,現在完全靠我一格一格看。我在另一部社群漫畫那條線上已經做到出圖後自動逐頁驗收,comic-studio 這邊還沒接。

時間跟表演那兩層只有規則,沒有機制。 這場戲中途被打破的東西、角色身上多出來的傷、換過的衣服,目前是靠我記得。cast-lock 寫了「要有單一事實來源」,工作台裡對應的欄位還不夠。

跨話的連戲整個是空的。 現在的單一事實來源作用範圍是一場戲。第五話的房間跟第二話的同一個房間會不會一樣,沒有任何東西在管。

分鏡的節奏沒碰。 AI 切出來的分鏡是「一句話一格」的均勻切法,該留白的地方不會留白,該用大格衝擊的地方不會變大。真正的漫畫在這裡分高下,我連怎麼下規則都還沒想清楚。

還有一堆會漂的小特徵。 臉跟服裝有立繪擋著,漂的是眼睛顏色、髮色這種一句話帶過的東西,深棕的眼睛會被畫成灰藍。這類要寫成全域規則,我目前是遇到一個補一個。

所以這篇的定位是:第一關的通關筆記,不是一條做得完漫畫的產線。

現在的狀態

第一二話已經在線上。工具是 MIT,漫畫本身保留所有權利,這條線我分得很清楚。

工作台是純前端,要打自架的生圖服務就得讓那台服務允許跨站呼叫,這是自己架的人會踩到的第一個坑。

分鏡怎麼切、角色設定卡上寫什麼、哪些規則要升級成 cast-lock 裡的鐵律,是我定的;工作台的程式碼跟那些檢查腳本是 AI 寫的。圖是模型畫的,畫錯的責任在我,因為參考圖是我挑的。

想看成品就直接去讀,想自己做就開工作台,自帶 key。