App 怎麼知道誰在說話?拆解自動多角色朗讀
要給一本書裡的每個角色配上不同的聲音,得先回答一個聽起來很簡單、其實不然的問題:這一行是誰說的?真人讀者不用想就知道,但軟體得從頭學起,而怎麼教它,正是有意思的地方。這一關過不過得了,也決定了自動多角色朗讀成不成立,所以值得好好看一下。
簡單的情況,還有它們為什麼會騙人
有些對白會明明白白告訴你是誰在說。
「我看得出來,你去過阿富汗。」福爾摩斯說。
標示寫得清清楚楚:一個表示說話的動詞加一個名字,就貼在引文旁邊。寫個簡單的程式,抓出引號、在附近找「說」加上一個專有名詞,大多數時候就對了。要是每一行都長這樣,這問題一個下午就搞定了。
它們才不會都這樣。
難就難在這裡
實際的文章裡,到處是把說話人藏起來的對白,而且藏的方式五花八門,每一種都是不一樣的麻煩。
沒有標示的行。 對話一旦你來我往,作者就會把標示省掉,反正讀者自己數得出來是誰在講。
「你去過阿富汗。」 「你到底是怎麼知道的?」 「別在意。眼下最要緊的是這個問題。」
三行,一個名字都沒有。要判斷各是誰講的,你得先看出來是兩個人在對話、而且一人一句輪著講,然後順著這個節奏一直往下推,推到有東西打斷為止。只要中間算錯一句,後面每一句就全都對到錯的人。
用代名詞當標示。 「他說」、「她問」,指的是句子裡沒點名的某個人。你得知道這裡的「他」是誰,也就是要記住前面剛提過誰、現在又有誰在場。
用動作代替標示。 常常根本沒有任何表示說話的動詞,只是引文旁邊有個動作。
福爾摩斯往後一靠,把十指搭成尖塔狀。「這是個三斗菸的難題。」
整句沒有一個「說」字。我們會判斷是福爾摩斯在講話,因為做動作的就是他。軟體也得會這樣推。
先搞清楚角色是誰。 要把一句話判給福爾摩斯,得先知道有福爾摩斯這個人,還得知道「夏洛克」、「福爾摩斯先生」、「福爾摩斯」,以及他朋友口中的「他」,講的可能都是同一個人。書裡沒有附角色表,所以光是從文字裡整理出有哪些角色、各有哪些叫法,就是一個獨立的步驟。
還有真的很難分的那種。 第一人稱旁白、故事裡引的書信、一群人七嘴八舌同時講話,還有作者故意寫得含糊的句子。有時候老實說,就算是很細心的真人讀者,讀到這裡也得停下來想一下。
這些做法是怎麼一路演進的
早期的做法靠規則:找出引文,在附近找「X 說」,找不到就假設說話的人在輪替。這種做法快,可是一遇到寫得比較講究的段落就撐不住。後來有人拿標註過的書去訓練統計模型,它們比較會看上下文,但還是很吃表面的規律。
最近不一樣的地方在於,大型語言模型讀文章的方式已經很像人。丟一段書給它,夠強的模型能同時掌握整個場景:誰在場、上一句是誰講的、貼著引文的動作又是誰做的。這些它全都拿來判斷每一句是誰講的,連沒有標示的也判。它不是什麼神通,也不是百分之百準,但比起「把『說』配上最近的那個名字」,已經進步很多。
BookNPC 拿它來做什麼
BookNPC 會把一本書一頁一頁分析過去。它整理出角色陣容、理清各種叫法、判斷每一句是誰講的,連沒有標示、一段接一段的對話也判。接著它幫旁白和每個角色各配一個不一樣的聲音。這是幫一本書配音時只做一次的功課,配音會收一點費用也是因為這個:花的力氣是在讀書,不是在放給你聽。
再厲害的辨識系統,遇到難懂的段落也不可能全對,所以主導權還是留給你。播放時,正在唸的那一句會用說話人的顏色標起來,名字顯示在頁面下方,讓你看得到它判斷是誰在講。整組配音陣容都列在那,任何一個聲音你都能換掉。萬一它把一段難分的對話判錯了,你看得出來、也改得掉,不會就這樣定案。
為什麼這是最難、也最值錢的一環
錄聲音,是一本多角色有聲書裡比較簡單的那一半。又貴又吃技術的另一半,一直都是導戲:決定每一句誰來講、怎麼講。自動說話人辨識,就是讓軟體來做導戲這件事。它現在已經夠好,能把你帶進來的任何一本書都做成整組多角色配音,不再只限於錄音室挑出來製作的那幾本。
這個功能從外面看,好像只是「每個角色都有一個聲音」,但底下就是靠這一整套在撐。想親眼看它運作,就在 BookNPC 裡挑一本對白多的書配音,看著說話人的名字隨著朗讀一個個跳出來。至於這件事會怎麼改變聽的感受,可以看多角色與單一旁白的比較。