一位媽媽上傳了女兒的一張照片。不是生日也不是什麼特別的日子,客廳的隨手拍,很普通的光線,孩子半看著鏡頭。
兩分鐘後,一本十二頁的繪本出來了。孩子在雲上的市集裡奔跑,在會說話的貓咪們的圖書館裡翻書,在一座浮在空中的城堡前回頭。每一頁都是同一張臉、同一件藍色外套、同一頭黑色捲髮。
看起來像是模型做到的。模型做不到這件事。
我們做的是一個叫 Lumora 的服務:用孩子的一張照片,做出一本以那個孩子為主角的繪本。家長上傳照片、選一個故事的氛圍,大約兩分鐘之後就有一本十二頁的書。文字和圖都是當場生成的。可以在螢幕上讀,也可以印成精裝本寄回家。
整個產品可以縮成一句話:孩子翻開書的時候,認得出裡面那個人是自己。
而下這個判決的,是一個七歲小孩。世界上最不留情面的評審。他不會去比對瞳孔顏色,他就是知道。對了就說「這是我耶」,錯了就直接翻頁。
還有一件事我們是後來才學到的:「幾乎對」的臉,比「完全不是他」還糟。 如果畫的完全是別人,孩子就當成另一個小孩的故事來讀,沒事。可是眼睛是他的眼睛、頭髮是他的頭髮,只有嘴巴不是他的——那本書就變成一個既不是他也不是別人的東西。我們出過的事故,全部集中在這一段很窄的區間裡。
所以「同一個孩子」對我們來說不是一個品質項目。它就是產品本身。
想像一棟樓。走廊兩邊有十二扇門,每個房間裡坐著一位畫家。房間沒有窗戶。畫家們彼此沒見過面,也不知道隔壁畫了什麼。
你沿著走廊走,從每一道門縫底下塞進同一張紙條:
七歲女孩。黑色捲髮。藍色外套。
一小時後你把十二張畫收回來,照順序裝訂好,寄給孩子的媽媽。
這不是比喻,這就是實際發生的事。繪圖模型沒有前一頁的記憶。你叫它十二次,它十二次都是第一次見到這個孩子。第七個房間裡的畫家,永遠不會知道第一個房間來過誰。
只塞紙條的話,做出來的書長這樣:第一頁是那個孩子。第四頁頭髮變直了。第七頁是另一個小孩。第十一頁的那個孩子,你得盯個兩三秒才敢說那不是他哥哥。
「那把紙條寫詳細一點不就好了?」我們試過。捲度的粗細、瀏海分邊的位置、笑起來只有一邊會翹上去的嘴角。寫得越細,畫家們畫出來的孩子差異越大。 原因是臉還沒有被描述完,語言就先用完了。認識這個孩子的人,讀一句話就認得出來;第一次看到這個孩子的人,句子越長,他越是往自己腦子裡本來就有的那張臉靠過去。
所以我們從門縫底下塞進去的不是紙條,是一張圖。
這裡有個小問題。家長給的照片通常只有一張,而且大多是正面。可是書裡的孩子會奔跑、會回頭、會低著頭讀書。
所以我們會先做一張參考圖:正面、四分之三側、全側面,三個角度並排在同一張圖上。三個角度必須是同一件衣服、同一種光、同一個表情。
這件事奇怪的地方在於,中間和右邊那兩張臉,世界上沒有任何一台相機拍過。那個孩子的側臉我們從來沒看過。但它必須是那個孩子的側臉。
這一張圖做好之後,塞進十二道門底下的就全部是它。畫家們彼此還是不認識,但至少他們看著同一張臉在畫。
那麼下一個問題馬上就來了。
十二個人看著同一張臉畫,畫出來不就是同一張臉重複十二次嗎? 我們確實收過那樣的書。一模一樣的正面半身像,只有背景換了十二次。在雲上的市集是那個表情,在貓咪的圖書館也是那個表情。像一本證件照相簿。
一致性和僵硬是同一個東西的兩面。把臉固定住,姿勢也會跟著一起被固定住。
所以在畫圖之前還有一個步驟。叫它分鏡最接近:先把整個故事讀過一遍,然後逐頁擺放鏡頭。這一頁從遠處拍,那一頁中景,這一頁越過肩膀,那一頁乾脆是一張沒有主角的天空。
這裡還釘了一條規則:一本書裡至少要有三頁是室外場景。 照搬我們提示詞裡的原話——大腦需要換氣。就算是那種從頭到尾待在家裡的故事(公寓故事、生病在家一整天的故事、兄妹在房間吵架的故事),也得停下來給三頁,讓主角走到外面去、從窗戶看見一個真正畫出來的外面,或者回想一個戶外的片刻。只有當這個故事的前提本身就是室內的(例如「在博物館裡關了一整夜」),這條規則才會讓路。
而最重要的一條,是什麼時候不可以把參考圖放進去。
如果這一頁根本沒有主角——比方說是清晨一片空蕩蕩的濕地——參考圖就不會被附上去。因為你把一張孩子的肖像交給一個要畫空景的畫家,他會非常盡責地把那個孩子貼到天空上。
參考圖對於「這個孩子是誰」是有權威的,對於「這一頁該怎麼拍」沒有權威。 把這兩件事分開,我們花了一點時間。
而這句話反過來也成立:從門縫塞進去的那一張圖如果錯了,十二張會很和睦地一起錯。
這是我們自己第一次打開那本成書時說的第一句話。
十二頁從頭到尾都是同一個孩子。這部分是成功的。只是那個孩子十二頁都露著門牙在笑。像是有人按著他的肩膀,連續拍了十二張紀念照。
而就在那之前,我們才剛宣布「端到端全部跑通了」。依據是:檔案打得開、大小 4.61MB、狀態值是 ready。那本書裡的圖,我們一張都沒有打開來看過。
兇手是產生參考圖的那句話裡的五個英文字:
a soft natural hint of a smile—— 淡淡的、自然的一點笑意。
原始照片裡的孩子本來就已經抿著嘴在笑了。模型在那上面又加了一次「微笑」。於是門牙露出來了,然後這張臉被塞進十二道門底下十二次。
眼睛是那個孩子的眼睛。頭髮是那個孩子的頭髮。只有嘴巴不是。就是前面說的那一段很窄的區間。
一開始我們想的是把那個詞換弱一點。slight、subtle、a touch of。全部都輸了。
面對一張本來就在笑的照片,「笑得少一點」不是一道指令,是一種品味表態。而模型有不同意你品味的自由。
現在放在那個位置上的句子是這樣:
閉著嘴的微笑——嘴唇放鬆地閉合,不是開懷大笑,不要露出牙齒。
換掉的不是強度,是種類。前面那個是程度詞,後面這個是形狀約束。牙齒有沒有露出來,人可以判定,機器也可以判定。「適度」誰都沒辦法判定。
這個陷阱在提示詞之外出現得更頻繁。「角色一致性維持在 85% 以上」看起來很可以判定,因為它有數字。可是如果沒有人答得出來那個 85% 到底在數什麼,那就只是一個穿了數字外衣的程度詞而已。
而且這條軸上還有另一面牆。前陣子我們為了把表情壓下來,寫了「平靜中性的表情」,結果拿到一張像人體模型的臉;收到那本書的媽媽說她不喜歡那些圖,把款退掉了。只立一面牆,就會往反方向倒過去。 現在那段程式碼旁邊兩面牆是一起寫著的:指向溫暖的那些字原封不動留著,我們只綁住了嘴巴。
到這裡為止談的全是「怎麼畫對」。但這個產品還有另外兩個必須成立的數字:家長願意等的時間,以及一本書可以花掉的錢。
最直覺的做法是排隊:先把故事寫完,然後照著寫好的文字一頁一頁畫。十二次算圖排成一條線。沒有人會等到那個時候。
現在的順序不一樣。我們先設計劇情骨架,逐頁抽出「這一頁發生什麼事」這個節拍,然後兩件事同時開始:一邊拿那個節拍去寫句子,另一邊拿同一個節拍去畫圖。插畫提示詞讀的不是寫完的正文,是那個節拍,所以它沒有理由要等。 文字和圖寫進資料庫裡不同的欄位,並行跑是安全的。
所以一本書大概兩分鐘上下就出來了。
錢那一邊有一個很常見的誤會:以為一本書的成本就等於算圖的錢。
不是。設計劇情骨架的錢、逐頁寫句子的錢、改寫的錢、還有回頭去檢查產出的圖的錢,全部都在裡面。這篇文章講的每一道保險,沒有一道是免費的。 做參考圖要錢,逐頁擺鏡頭也要錢。
每多掛一道守護品質的裝置,一本書的成本就往上抬一點。所以「要不要再加一道檢查」永遠同時是一個品質決定和一個成本決定。
也因此,真正能省的槓桿不是「把圖畫便宜一點」,而是不要去做沒有人要求過的東西。第一次來的訪客只是想先看看這是什麼樣的東西,那就只做一張封面,內頁先不做。
順帶一提,正因為這樣,「不然再重畫一次看看」是一句比想像中貴的口號。每重畫一次就多一筆錢,而且被你換掉的那張圖,很可能本來就是對的那一張。
那位媽媽收到的書,十二頁都是同一個孩子。在雲上的市集是,在貓咪的圖書館是,在城堡前回頭的時候也是。
孩子翻開那本書的時候說了什麼,我們不知道。我們能看到的就到這裡為止。在螢幕這一側能確認的,只有那十二張都是那個孩子;而真正判定對不對的那個人,是遠方某個地方的一個七歲小孩。
上面所有的例子都來自我們自己的產品。我們做的是 Lumora:家長上傳一張孩子的照片,我們用生成式模型把故事和圖都做出來,變成一本以這個孩子為主角的繪本。介面支援十種語言,故事是以該語言原生寫作,不是先寫英文再翻譯。第一本免費,不需要信用卡,繁體中文版在這裡:用一張照片做出的個人化繪本