动物之森里的叽里咕噜语音是如何实现的?
作者:goodorc,欢迎访问他的B站主页:goodorc_gamedev
现象级游戏《动物之森》里面小动物的“叽里咕噜语”令人印象深刻,也被玩家们称为“狸语”。
这种语音直接听,完全听不懂,但是如果你对着字幕听,感觉它就是在念字幕。下面是一段视频录像,一起来感受感受:

(手头没有NS录像,借用了B站“大双喜”的录像视频,感谢)
第一次听到这种“狸语”时没有深究。但机核的某一期电台提醒了我,该期电台名为《“动森”里面那似乎能听懂的“狸语”是怎么做出来的?》。
这期知识性趣味性都很高,勾起了我尝试合成语音的兴趣。机核电台传送门:
https://www.gcores.com/radios/122580/timelines?pi=1
1、“叽里咕噜语”简介
早年间在游戏机硬件机能十分有限的时候,当时的制作者们就已经发现。在介绍背景剧情、或表现人物对话时,直接显示一段文字,与逐渐显示出一段文字的体验是完全不同的。根据人物语速逐个显示出一个一个文字,代入感和演出效果会改善很多。
而且,如果在蹦出文字时,配上打字机的音效,任务的代入感会更强。虽然早期的游戏一般没有语音,但是根据人物说话的语速显示文字,再配上“嘟嘟嘟”的音效,结合玩家强大的脑补,就能做出很强的代入感。

比如大名鼎鼎的魂斗罗一代日版,地球被陨石撞击的动画,配合打字机一样的任务简报,代入感顿时加满。
虽然如今的游戏可以用真人配音等方式制作出真正的语音,但就像8bit像素风格逐渐变成一种流行的风格一样,“嘟嘟嘟”的配音也变成了一种无可取代的风格。给游戏平添了一种风味。
比如《蔚蓝》就是一个优秀案例,主角麦德玲的说话带有“叽叽哇哇”的音效,与精美的像素风格相得益彰。这种语音有一个专有名词“Gibberish”,英文原意为“嘟嘟囔囔”,你也可以理解为一种语言。

而相比其它游戏中“叽叽咕咕”的简单电子音效,《动物之森》里的合成音效则成熟得多!
《动物之森》里的音效不再是单调的“叽里咕噜”,而是真的能识别出语音中的“音素”和“音节”,用极少的音频资源就能做出类似“朗读”的效果。虽然这种“朗读”似是而非,玩家很难直接听懂。但是只要配合文字观看,就好像是动物们在说话一样。
更有趣的是,这种语音系统,可以适配各种不同的语言,中文、英文、俄语等等,只要能够拆分出“音素”,就能让狸猫说各种外语。
这种神奇的算法是如何实现的呢?
简单来说,合成叽里咕噜语的主要技术分为三步:一是声母韵母录音,二是汉字转拼音,三是语音合成。
2、声母和韵母
我为了制作这个“叽里咕噜语”,特地找来了小学一年级的“声母韵母表”。不知道谁还记得b p m f d t n l, a o e i u v, 还有an en yin un vn,小学一年级的知识恍如隔世,但语音语素的秘密其实就藏在声母韵母表中。

我们需要自己录制一份原始素材,朗读整个声母韵母表并录音,然后将这些声音切分出来,保存在单独的文件里。文件名与拼音名称对应。
把录音切分成几十个文件是一件麻烦事,这里我用了python的pydub库对声音进行处理。pydub这个库可以识别音频中没有声音的部分做切分。很快就处理好了所有的原始音频文件。
录音时注意,中文“鱼”、“晕”的发音不是“u”而是“v”。其中v是变通写法,正确写法是“u上面带两点”,注意不要弄混。
3、汉字转拼音实战
实现语音合成的第二大难点在于汉字如何转为拼音。
细说的话,转拼音的关键在于——我们的汉字编码顺序是有规律的。一般是按照读音的字母顺序进行排列,比如“啊”就在“好”的前面,像“张”这种z开头的汉字就排在靠后的位置。这样一来,我们可以用一张编码表给汉字和拼音做一个简单的对应关系。
说起来容易做起来难,实际上还是要借鉴前人已做过的成果。经过耐心搜索,我在网上找到了某个大神写的一个库,库名Sunrise.Spell,这个库的基本原理就是用一个大的对应表将汉字转为拼音,但中间也有很多特殊情况需要处理。

而且由于我们的需求比较特殊,不得不对源码做出大幅度修改。
最终实现了将文字转换为拼音序列的功能,而且加入了标点符号的识别,逗号、句号等常用标点符号会被识别为空白停顿,用下划线表示。

4、整合实现
剩下的问题就是单纯的Unity技术问题了。整理一下思路,现在的问题是:
给出一段用空格分割的音节字符串,找到每个音节对应的音频文件,并依次播放出来。
这个问题比较繁琐,在这里咱们用Unity做了一个简单的实现。Unity工程晚些时候会放在评论区。
在播放时,需要控制音频的音调(Pitch),音调高一些比较卡通。为了效果好,还需要适当“吞音”,就是每个音节不要说全,掐头去尾,只播放中间一段,感觉反而更好。

核心的音频控制脚本是Pronounce Core,其中Trim Begin是掐掉音节的开头,Trim End是去掉音节尾部,取值都是0~1的百分比。上图中的设置表示,去掉了音节的11.2%之前的部分,与79.6%之后的部分。All Clips为音频列表。
最后上展示视频:

感谢观赏!
欢迎加入游戏开发群欢乐搅基:1082025059
对游戏开发感兴趣的童鞋可戳这里进一步了解皮皮关:http://www.levelpp.com/