動(dòng)物之森里的嘰里咕嚕語(yǔ)音是如何實(shí)現(xiàn)的?
作者:goodorc,歡迎訪(fǎng)問(wèn)他的B站主頁(yè):goodorc_gamedev
現(xiàn)象級(jí)游戲《動(dòng)物之森》里面小動(dòng)物的“嘰里咕嚕語(yǔ)”令人印象深刻,也被玩家們稱(chēng)為“貍語(yǔ)”。
這種語(yǔ)音直接聽(tīng),完全聽(tīng)不懂,但是如果你對(duì)著字幕聽(tīng),感覺(jué)它就是在念字幕。下面是一段視頻錄像,一起來(lái)感受感受:

(手頭沒(méi)有NS錄像,借用了B站“大雙喜”的錄像視頻,感謝)
第一次聽(tīng)到這種“貍語(yǔ)”時(shí)沒(méi)有深究。但機(jī)核的某一期電臺(tái)提醒了我,該期電臺(tái)名為《“動(dòng)森”里面那似乎能聽(tīng)懂的“貍語(yǔ)”是怎么做出來(lái)的?》。
這期知識(shí)性趣味性都很高,勾起了我嘗試合成語(yǔ)音的興趣。機(jī)核電臺(tái)傳送門(mén):
https://www.gcores.com/radios/122580/timelines?pi=1
1、“嘰里咕嚕語(yǔ)”簡(jiǎn)介
早年間在游戲機(jī)硬件機(jī)能十分有限的時(shí)候,當(dāng)時(shí)的制作者們就已經(jīng)發(fā)現(xiàn)。在介紹背景劇情、或表現(xiàn)人物對(duì)話(huà)時(shí),直接顯示一段文字,與逐漸顯示出一段文字的體驗(yàn)是完全不同的。根據(jù)人物語(yǔ)速逐個(gè)顯示出一個(gè)一個(gè)文字,代入感和演出效果會(huì)改善很多。
而且,如果在蹦出文字時(shí),配上打字機(jī)的音效,任務(wù)的代入感會(huì)更強(qiáng)。雖然早期的游戲一般沒(méi)有語(yǔ)音,但是根據(jù)人物說(shuō)話(huà)的語(yǔ)速顯示文字,再配上“嘟嘟嘟”的音效,結(jié)合玩家強(qiáng)大的腦補(bǔ),就能做出很強(qiáng)的代入感。

比如大名鼎鼎的魂斗羅一代日版,地球被隕石撞擊的動(dòng)畫(huà),配合打字機(jī)一樣的任務(wù)簡(jiǎn)報(bào),代入感頓時(shí)加滿(mǎn)。
雖然如今的游戲可以用真人配音等方式制作出真正的語(yǔ)音,但就像8bit像素風(fēng)格逐漸變成一種流行的風(fēng)格一樣,“嘟嘟嘟”的配音也變成了一種無(wú)可取代的風(fēng)格。給游戲平添了一種風(fēng)味。
比如《蔚藍(lán)》就是一個(gè)優(yōu)秀案例,主角麥德玲的說(shuō)話(huà)帶有“嘰嘰哇哇”的音效,與精美的像素風(fēng)格相得益彰。這種語(yǔ)音有一個(gè)專(zhuān)有名詞“Gibberish”,英文原意為“嘟嘟囔囔”,你也可以理解為一種語(yǔ)言。

而相比其它游戲中“嘰嘰咕咕”的簡(jiǎn)單電子音效,《動(dòng)物之森》里的合成音效則成熟得多!
《動(dòng)物之森》里的音效不再是單調(diào)的“嘰里咕?!?,而是真的能識(shí)別出語(yǔ)音中的“音素”和“音節(jié)”,用極少的音頻資源就能做出類(lèi)似“朗讀”的效果。雖然這種“朗讀”似是而非,玩家很難直接聽(tīng)懂。但是只要配合文字觀(guān)看,就好像是動(dòng)物們?cè)谡f(shuō)話(huà)一樣。
更有趣的是,這種語(yǔ)音系統(tǒng),可以適配各種不同的語(yǔ)言,中文、英文、俄語(yǔ)等等,只要能夠拆分出“音素”,就能讓貍貓說(shuō)各種外語(yǔ)。
這種神奇的算法是如何實(shí)現(xiàn)的呢?
簡(jiǎn)單來(lái)說(shuō),合成嘰里咕嚕語(yǔ)的主要技術(shù)分為三步:一是聲母韻母錄音,二是漢字轉(zhuǎn)拼音,三是語(yǔ)音合成。
2、聲母和韻母
我為了制作這個(gè)“嘰里咕嚕語(yǔ)”,特地找來(lái)了小學(xué)一年級(jí)的“聲母韻母表”。不知道誰(shuí)還記得b p m f d t n l, a o e i u v, 還有an en yin un vn,小學(xué)一年級(jí)的知識(shí)恍如隔世,但語(yǔ)音語(yǔ)素的秘密其實(shí)就藏在聲母韻母表中。

我們需要自己錄制一份原始素材,朗讀整個(gè)聲母韻母表并錄音,然后將這些聲音切分出來(lái),保存在單獨(dú)的文件里。文件名與拼音名稱(chēng)對(duì)應(yīng)。
把錄音切分成幾十個(gè)文件是一件麻煩事,這里我用了python的pydub庫(kù)對(duì)聲音進(jìn)行處理。pydub這個(gè)庫(kù)可以識(shí)別音頻中沒(méi)有聲音的部分做切分。很快就處理好了所有的原始音頻文件。
錄音時(shí)注意,中文“魚(yú)”、“暈”的發(fā)音不是“u”而是“v”。其中v是變通寫(xiě)法,正確寫(xiě)法是“u上面帶兩點(diǎn)”,注意不要弄混。
3、漢字轉(zhuǎn)拼音實(shí)戰(zhàn)
實(shí)現(xiàn)語(yǔ)音合成的第二大難點(diǎn)在于漢字如何轉(zhuǎn)為拼音。
細(xì)說(shuō)的話(huà),轉(zhuǎn)拼音的關(guān)鍵在于——我們的漢字編碼順序是有規(guī)律的。一般是按照讀音的字母順序進(jìn)行排列,比如“啊”就在“好”的前面,像“張”這種z開(kāi)頭的漢字就排在靠后的位置。這樣一來(lái),我們可以用一張編碼表給漢字和拼音做一個(gè)簡(jiǎn)單的對(duì)應(yīng)關(guān)系。
說(shuō)起來(lái)容易做起來(lái)難,實(shí)際上還是要借鑒前人已做過(guò)的成果。經(jīng)過(guò)耐心搜索,我在網(wǎng)上找到了某個(gè)大神寫(xiě)的一個(gè)庫(kù),庫(kù)名Sunrise.Spell,這個(gè)庫(kù)的基本原理就是用一個(gè)大的對(duì)應(yīng)表將漢字轉(zhuǎn)為拼音,但中間也有很多特殊情況需要處理。

而且由于我們的需求比較特殊,不得不對(duì)源碼做出大幅度修改。
最終實(shí)現(xiàn)了將文字轉(zhuǎn)換為拼音序列的功能,而且加入了標(biāo)點(diǎn)符號(hào)的識(shí)別,逗號(hào)、句號(hào)等常用標(biāo)點(diǎn)符號(hào)會(huì)被識(shí)別為空白停頓,用下劃線(xiàn)表示。

4、整合實(shí)現(xiàn)
剩下的問(wèn)題就是單純的Unity技術(shù)問(wèn)題了。整理一下思路,現(xiàn)在的問(wèn)題是:
給出一段用空格分割的音節(jié)字符串,找到每個(gè)音節(jié)對(duì)應(yīng)的音頻文件,并依次播放出來(lái)。
這個(gè)問(wèn)題比較繁瑣,在這里咱們用Unity做了一個(gè)簡(jiǎn)單的實(shí)現(xiàn)。Unity工程晚些時(shí)候會(huì)放在評(píng)論區(qū)。
在播放時(shí),需要控制音頻的音調(diào)(Pitch),音調(diào)高一些比較卡通。為了效果好,還需要適當(dāng)“吞音”,就是每個(gè)音節(jié)不要說(shuō)全,掐頭去尾,只播放中間一段,感覺(jué)反而更好。

核心的音頻控制腳本是Pronounce Core,其中Trim Begin是掐掉音節(jié)的開(kāi)頭,Trim End是去掉音節(jié)尾部,取值都是0~1的百分比。上圖中的設(shè)置表示,去掉了音節(jié)的11.2%之前的部分,與79.6%之后的部分。All Clips為音頻列表。
最后上展示視頻:

感謝觀(guān)賞!
歡迎加入游戲開(kāi)發(fā)群歡樂(lè)攪基:1082025059
對(duì)游戲開(kāi)發(fā)感興趣的童鞋可戳這里進(jìn)一步了解皮皮關(guān):http://www.levelpp.com/