最近的几篇文章,都提到了本公众号最近推出的「技艺丛谈随身听」,昨天后台有读者留言,说他对该小程序的原理比较感兴趣。作为语音技术研发的从业者,这里给大家简单介绍下背后的原理。相信读者里应该很多都不是语音合成的从业者,所以大概介绍下背后的技术,让读者大概了解下语音合成这一重要的AI方向,也算是以另类的角度切入,给大家科普下语音AI技术中的语音合成。
语音技术涉及的面比较广,包括语音信号处理,语音唤醒,语音识别,语音合成等。
语音信号处理处理的问题包括降噪、回声消除、声源定位等。典型的场景比如,听歌的时候,播放器里让声音听起来更舒服的一些技术。再比如,亚马逊推出的Echo音箱,需要解决远场交互的问题(比如在3-5米外去唤醒音箱,并与音箱进行交互)。再比如,车载上的语音交互,提供的主驾、副驾模式,就是典型的声源定位和波束成形应用。在主驾模式下,副驾在闲聊,是不太会影响主驾的语音交互的。信号处理使用到的技术术语包括DSP,DOA,beamforming, Echo Cancellation等,感兴趣的读者可以顺藤摸瓜,找一些资料读读。
语音唤醒主要解决的问题类似聊天的时候,「叫」某人一声,引起他的注意力,开始听你说话,也就是开始语音识别过程。典型的如手机上的语音助手,比如苹果的「hey siri」,谷歌的「ok google」,国内华为的「小艺小艺」,小米的「小爱同学」等。
唤醒要达到唤醒率高,误唤醒率低的几个目标。就和人聊天的场景一样,唤醒率高意味着你一叫他,他就理你,转过头来和你对话。唤醒率低的话,你就会要么觉得对方「耳背」,老需要叫他好几次才能听见,要么觉得他故意不理你,装作没听见。
而误唤醒就是说,你没有唤醒他,结果他转过来和你说:「你刚才是不是叫我了」,你就会觉得他莫名其妙,神经过敏。如何在高唤醒率的情况下,又保持低误唤醒率,是语音唤醒的难点。另一个难点在于,如何在不同环境下保持高唤醒率,比如开车的时候,开着车窗是否能唤醒自如。在有风噪、胎噪等不同噪声的情况下,保持较好的唤醒率。在高速路上高速行驶的时候,在后座有人闲聊的时候,在车里开着语音导航或者播着音乐的情况下,是否能提供较好的唤醒率。语音唤醒对应的术语包括wake-up word,hotword, false trigger 等,感兴趣的同学可以自行找资料阅读。
语音识别的任务,就是将语音转换为对应的文本,相当于人的耳朵提供的听觉功能,把人嘴巴说的声音,转换为正确的文本内容。语音识别系统的发展也有大几十年了,早期的系统是孤立词系统,只能识别有限的几个词汇,比如识别你说的是电话号码里的哪个数字,也就是提供的是0-9总共十个数字的识别任务。自动语音识别,英文叫ASR,全称为Automatic Speech Recognition。后来的大词汇量连续语音识别,英文为LVCSR,全称是Large Vocabulary Continuous Speech Recognition。ASR这里就不展开了,有兴趣的可以找一些相关的文章了解下。或者下载个讯飞的语音输入法,或者百度和搜狗的输入法,使用几天,直观感受下。目前微信发送语音的时候,也可以自动转换为文本了。整体的识别率目前已经挺高的了,假如环境不太复杂,而你的普通话也还算标准的话。没有试过的同学不妨试试看。
接下来进入正题,聊聊语音合成,语音合成英文名为Speech Synthesis。一般使用TTS更多一些,也就是Text To Speech, 文语转换,也就是文本到语音的转换。一般TTS分为三部分,前端分析,声学模型,声码器。最近两三年,TTS方面有很大的技术突破,自从谷歌推出WaveNet论文后,整个行业就开始一路高歌猛进。
TTS相当于是人类的「嘴巴」,让人类的想法,从文字变成声音。一个最简单的普通话语音合成系统可以这样做:
汉语大概1400个左右的带音调的音节(可以参考如下文档:
比如「北京今天天气不错」这句话,合成出来的感觉是这样的:
当然,为了让拼接的方法读得更好,有很多工作要做:
1,更好地解决多音字的问题。可以引入分词和词条发音等去改进,也可以引入各种更加复杂的模型。
2,更好地解决变调的问题。比如上面的「不错」里的「不」字,不单独成词的时候,读成第四声,「不错」的时候则变调为第二声。类似的变调还有「一」的变调,叠词变调等。
3,使用更大的音频数据库,尤其是录制不同上下文语境下的语音。上面使用最简单的单音节,其实是假设发音是上下文无关的。但是变调等语言现象的存在,使得这个假设不成立。对英文而言,爆破、连读等语言现象的存在,使得发音的预测会更为复杂。有了更大的数据库,最直接的改进思路就是,使用更大的拼接粒度(上面使用的是单字的最小粒度),比如词汇级别就明显可以改进效果。
4,使用更复杂的方法来解决拼接存在的问题。比如使用HMM等方法来预测声学参数,然后结合预测出的参数,来指导拼接单元的选择,让合成的音频更有节奏感,更加平滑自然一些。
我们来看个词汇级别的拼接效果,还是以「北京今天天气不错」这句话,我们切割为「北京/今天/天气/不错」,拼接起来效果大概这样:
在相当长的时间里,业界主流的TTS在线系统,都是使用拼接法来做的。后来也出现了参数预测法。早期使用的更多的是HMM和决策树等。后来深度学习的方法开始流行。目前比较主流的方法,声码器大部分源自Google 提出的WaveNet,声学模型大部分源自Tacotron。
生活中在很多场景都可以看到语音合成的应用了,典型的比如高德地图的林志玲语音导航,比如SIRI的语音助手,智能音箱的语音播报等。
那么,公众号之类的长文章,要使用TTS来播报的话,相比导航或者语音助手的播报,有哪些难点呢?随便列举几个如下:
1,大部分语音助手的播报内容,都是产品经理配置的话术。在语音交互里,有一个模块叫做语言生成,Language Generation,缩写就是LG。LG大部分都是根据产品定义来编写的,变化有限。所以相对而言,语音助手类的播报内容,句法比较固定,相对容易测试和优化。另外, LG一般比较简单,话痨型的语音助手,不太会受到用户欢迎。早期没有办法支持打断功能的时候,话痨更可怕,很浪费用户时间。打断是说在播报TTS内容的时候,用户可以直接开始说话,而不用等到播报结束,它要解决的是回声消除问题,也就是TTS的播报内容,被麦克风录音进去后,应该能够以某种方法被消除掉,用户说话的语音,不应该受到自回声的影响。
2,语音交互的响应文本一般比较短,难度较小。文章较长的时候,就考验音频的质量问题了。这个和说一句话与写一篇作文的难度类似。大部分人都能够流畅地说一两句话,但是要流畅地朗读一篇文章就不那么容易了。要播报的文本越长,可能出问题的地方越多。比如多音字问题,像下面的句子,
「人要是行,干一行行一行,一行行行行行。
要是不行,干一行不行一行,一行不行行行不行」
这么复杂的句子是否能够读对?比如断句会影响到韵律,抑扬顿挫的感觉不对,往往听起来不知所云。举个例子:「早上点早点早点早上早点吃」,可以根据不同的说话人意图,可以有几个不同的断句。比如
第一种读法,早上/点/早点,早点/早上/早点吃。
第二种读法,早,上点/早点,早点/早上/早点吃。
第三种读法,早上/点早点/早点,早上/早点吃。
一般的程序,还没有聪明到能够根据上下文信息,预测出不同的读法。况且,很多时候上下文其实是缺失的。那么怎么根据作者的意图,读出不同的风格来,就不是AI能自动搞定的了。
3,AI语音一般比较单调枯燥,容易让听众昏昏欲睡。和写文章一样,文章比较长的时候,往往会在必要的地方加个小标题,高亮一下几个关键词,或者是插入一两张图片,让文章更有呼吸感。如果大家听过喜马拉雅之类的播客内容,会发现其实音频生产也类似,需要通过一些音频制作的技巧,比如插入必要的音效,配上优美的背景音乐,或者是根据不同的上下文,变换不同的语速,或者是用上不同的声音情感,从而让听众更加「声临其境」。否则,长文章听起来,可能就有点昏昏欲睡,被听众当成催眠曲了。
出门问问团队打造的AI配音方案,为了解决上面提到的问题,让音频生产者能够快速生产出高质量的音频,开发了一系列的产品。其中一个产品就是「魔音工坊」。魔音工坊的名字是我取的,英文名字是Voice Maker,很明显,我们意在打造一个音频创造的工具,让内容创作者可以快速将文本转换为高品质的音频文件,在AIoT和5G时代到来之际,实现内容形态的升级。
魔音工坊的地址是:
https://voice-maker.mobvoi.com/
可以点击「阅读原文」访问网站。网站暂时还不支持移动版,目前只是首页做了适配,要体验的话,请使用电脑进行体验。欢迎有写文章习惯的朋友体验看看,试着也给你的公众号配上音频吧。
目前魔音工坊和小程序是深度整合的,在魔音工坊编辑完音频后,可以一键发布到小程序,这样在公众号中就可以插入对应的小程序卡片了。读者在公众号中,点击打开小程序,即可收听公众号的音频版本了。
有问题欢迎随时反馈给我。