TTS背后的技术原理——前端和后端系统
为啥你的机器人女友说话不像萨曼萨?本文中,Rokid A-Lab 语音合成算法工程师郑杰文将从语音合成技术谈起,给大家分析其中原因。
作者介绍:郑杰文,爱丁堡大学人工智能硕士,师从国际著名语音合成专家Simon King教授。 现任职Rokid ALab 语音合成算法工程师,负责语音合成引擎架构设计,后端声学模型开发等工作。

TTS背后的技术原理——前端和后端系统
让语音助手说话的技术叫 TTS(text-to-speech),也就是语音合成。
打造自然、真实、悦耳的 TTS,是 AI 领域的科学家和工程师一直努力的方向。但前进过程中总会碰到各种「拦路虎」,它们究竟是什么? 我们先从 TTS 的基础原理讲起。
TTS 技术本质上解决的是「从文本转化为语音的问题」,通过这种方式让机器开口说话。
图 1 语音合成,一个从文本转化为语音的问题但这个过程并不容易,为了降低机器理解的难度,科学家们将这个转化过程拆分成了两个部分——前端系统和后端系统。
图 2 前端和后端一起组成的TTS前端负责把输入的文本转化为一个中间结果,然后把这个中间结果送给后端,由后端生成声音。
接下来,我们先来了解一下前端和后端系统是如何分工协作的?
生成「语言学规格书」的前端系统
小时候我们在认字之前需要先学习拼音,有了拼音,我们就可以用它去拼读我们不认识的字。对于 TTS 来说,前端系统从文本转化出的中间结果就好像是拼音。
不过,光有拼音还不行,因为我们要朗读的不是一个字,而是一句一句的话。如果一个人说话的时候不能正确的使用抑扬顿挫的语调来控制自己说话的节奏,就会让人听着不舒服,甚至误解说话人想要传达的意思。所以前端还需要加上这种抑扬顿挫的信息来告诉后端怎么正确的「说话」。
我们将这种抑扬顿挫的信息称之为韵律(Prosody)。韵律是一个非常综合的信息,为了简化问题,韵律又被分解成了如停顿,重读等信息。停顿就是告诉后端在句子的朗读中应该怎么停,重读就是在朗读的时候应该着重强调那一部分。这些所有的信息综合到一起,我们可以叫」语言学规格书」。
图 3.前端通过生成「语言书规格书」来告诉后端我们想要合成什么样的内容。前端就像一个语言学家,把给它的纯文本做各种各样的分析,然后给后端开出一份规格书,告诉后端应该合成什么样的声音。
在实际的系统中,为了让机器能正确的说话,这份儿「规格书」远远比我们这里描述的要复杂。
扮演「发音人」的后端系统
当后端系统拿到「语言学规格书」后,目标是生成尽量符合这个规格书里描述的声音。
当然,机器是不能凭空直接生成一个声音的。在这之前,我们还需要在录音棚里录上几个到几十个小时不等的音频数据(根据技术不同,使用的数据量会不同),然后用这些数据来做后端系统。
目前主流的后端系统有两种方法:一种是基于波形拼接的方法,一种是基于参数生成的方法。
波形拼接的方法思路很简单:那就是把事先录制好的音频存储在电脑上,当我们要合成声音的时候,我们就可以根据前端开出的「规格书」,来从这些音频里去寻找那些最适合规格书的音频片段,然后把片段一个一个的拼接起来,最后就形成了最终的合成语音。
比如:我们想要合成「你真好看」这句话,我们就会从数据库里去寻找「你、真、好、看」这四个字的音频片段,然后把这四个片段拼接起来。
图表 4 使用拼接法合成「你真好看」当然,实际的拼接并没有这么简单,首先要选择拼接单元的粒度,选好粒度还需要设计拼接代价函数等。
参数生成法和波形拼接法的原理很不相同,使用参数生成法的系统直接使用数学的方法,先从音频里总结出音频最明显的特征,然后使用学习算法来学习一个如何把前端语言学规格书映射到这些音频特征的转换器。
一但我们有了这个从语言学规格书到音频特征的转换器,在同样合成「你真好看」这四个字的时候,我们先使用这个转换器转换出音频特征,然后用另一个组件,把这些音频特征还原成我们可以听到的声音。在专业领域里,这个转换器叫「声学模型」,把声音特征转化为声音的组件叫「声码器」。
为啥你的 AI 语音助手说话不像人?
如果简单的给这个问题一个答案的话,主要有两个方面的原因:
1.你的 AI 会犯错。为了合成出声音,AI 需要做一连串的决定,一但这些决定出错,就会导致最终合成出来的声音有问题,有强烈的机械感,听着不自然。TTS 的前端系统和后端系统都有犯错的可能。
2.使用 AI 合成声音时,工程师对这个问题过度简化,导致没有准确的刻画声音生成的过程。这种简化一方面是来自于我们人类自己对语言,和人类语音生成的认识还不足够;另外一方面也来自于商用语音合成系统在运转的时候要对成本控制进行考量。
下面我们具体来聊聊造成 AI 语音助手说话不自然的前端错误和后端错误问题。
前端错误
前端系统,做为一个语言学家,是整个TTS系统里最复杂的部分。为了从纯文本生成出最后的「语言学规格书」,这个语言学家做的事情要比我们想像的多得多。
图表 5 典型的前端处理流程一个典型的前端处理流程是:
- 文本结构分析:我们给系统输入一个文本,系统要先判断这个文本是什么语言,只有知道是什么语言才知道接下来如何处理。然后把文本划分成一个一个的句子。这些句子再送给后面的模块处理。
- 文本正则:在中文场景下,文本正则的目的是把那些不是汉字的标点或者数字转化为汉字。比如「这个操作666啊」,系统需要把「666」转化为「六六六」。
- 文本转音素:也就是把文本转化为拼音,由于中文中多音字的存在,所以我们不能直接通过像查新华字典一样的方法去找一个字的读音,必须通过其他辅助信息和一些算法来正确的决策到底要怎么读。这些辅助信息就包括了分词和每个词的词性。
- 韵律预测:用于决定读一句话时的节奏,也就是抑扬顿挫。但是一般的简化的系统都只是预测句子中的停顿信息。也就是一个字读完后是否需要停顿,停顿多久的决策。
从上面四个步骤可以看出,任何步骤都是有可能出错的,一但出错,生成的语言学规格书就会错,导致后端合成的声音也会错。一个TTS系统,典型的前端错误有以下几种类型:
1、文本正则错误
由于我们的书写形式和朗读形式是不一样的,所以在前端非常早期的阶段,需要把书写形式转化为我们实际朗读的形式。这个过程在专业领域里叫「文本正则」。比如我们前面说到的「666」
要转为「六六六」。我们非常容易感受到 TTS 系统中文本正则的错误。比如下面这句:
我花了 666 块住进了一个房号是 666 的房间。
我们知道前面的「666」应该读成「六百六十六」,后面的「666」应该要读「六六六」。但是TTS系统却很容易搞错。
另外一个例子:
我觉得有 2-4 的把握,这场比分是 2-4。
这两个「2-4」到底应该是读「二到四」,「两到四」,还是「二比四」呢?你应该一眼就能知道到底怎么样读才是正确的。但是,对于前端系统来说,这又是一个难题。
2、注音错误
中文是一门博大精深的语言,正确的朗读它可并没有好么容易。其中一个比较棘手的问题就是,面对多音字时,到底应该选择哪一个音来朗读呢?
比如这两句:「我的头发又长长了。」和「我的头发长长的。」这里的「长」到底应该是读二声的「chang」还是读四声的「zhang」呢?
当然,人可以很轻松的挑选出正确的答案。那么下面这一句呢:
人要是行,干一行行一行,行行都行,要是不行,干一行不行一行,行行不行。
可能你也要略加思索,才能读对这中间的所有「行」。对于 AI 来说就更难了。
你可能时不时的就能听到AI助手在朗读多音字时读错了,这种错误很容易就被你的耳朵捕捉到,并让你立刻有一个印象:「这绝对不是真人在说话~」。
当然,多音字错误只是注音错误中的一种,还有其他的一些错误,如轻声,儿化音,音调变调等。总之,准确的让你的AI助手朗读所有的内容并不容易。
3、韵律错误
如前面所说,为了更准确的传递信息,人在说一句话的时候需要有节奏感。如果一个人在说话的时候中间不做任何的停顿,会让我们很难理解他说的意思,甚至我们会觉得这个人不礼貌。我们的科学家,工程师,都在想方设法的让TTS朗读得更具备节奏感一些,更礼貌一些。但是在很多时候TTS的表现却总是差强人意。
这是因为语言的变化太丰富了,根据不同的上下文,甚至不同的场合,我们的朗读的韵律节奏都不太一样。韵律中,最重要的就是讨论一句话的停顿节奏,因为停顿是一句话朗读正确的基础,如果停顿不对,错误很容易被人耳朵抓住。
比如这句:;为你切换单曲循环模式」。如果我们用「|」来表示停顿,那么一个正常的人朗读的停顿节奏一般是这样的:「为你切换 | 单曲循环模式」。
但是如果一但你的 AI 助手说「为你切 | 换单曲循环模式」这种奇怪的节奏感时,你内心可能是奔溃的。
后端错误
聊完前面这个「经常犯错的语言学家」,我们再来看看后端:这个按照「语言学家」给的 「规格书」来读稿子的「发音人」。
前面提到,后端主要有拼接法和参数法两种方式。现在苹果,亚马逊的AI助手Siri和Alexa 使用的是波形拼接的方法。而在国内,大多数公司都是使用参数法。Rokid的若琪也是使用参数法,所以我们关键来看一下参数法可能的后端错误。
后端系统在拿到前端给的语言信息后,要做的第一件事情是,决定每个汉字到底要发音多长时间(甚至是每个声母,韵母要发音多长时间)。这个决定发音长短的组件在专业领域里叫「时长模型」。
有了这个时间信息后,后端系统就可以通过我们前面说的一个转换器(也叫声学模型)把这个语言学规格书转化为音频特征了。然后再用另一个叫「声码器」的组件把这些音频特征还原成声音。从时长模型到声学模型,再到声码器,这里面的每一步都可能犯错或者不能完美的生成我们想要的结果。
一个 TTS 系统里,典型的后端错误有以下几种类型:
1、时长模型错误
在一句话朗读的时候,根据上下文语境的不同,每个字朗读发音时间是不一样的。TTS系统必须根据上下文去决定到底哪些字应该读音拖长一点,哪些字应该读短一些,其中一个比较典型的例子就是语气词的朗读。
通常这些语气词由于携带了说话人的语气情感,它们的发音都会比普通的字要长一些,比如这句:
嗯。。。我想他是对的。
这里的「嗯」,在这个场景下,很明显需要被拖长,用于表示一种「思考之后的判断」。
但是并不是所有的「嗯」都要拖这么长,比如这一句:「嗯?你刚才说什么?」
这里的「嗯」代表是一种疑问的语气,发音就要比上面句子中的「嗯」要短得多。如果时长模型不能正确的决策出发音时长的话,就会给人一种不自然感觉。当然,Rokid在语气词发音上也有自己的一套专利方法,用于生成非常自然的语气词发音。在后续的文章中,我们将会推一个专题文章介绍。
2、声学模型错误
最主要的声学模型错误就是遇到在训练后端这个「发音人」时,没有见过的发音。声学模型的作用是从训练音库里,学习到各种「语言学规格书」所对应的语音声学特征。如果在合成的时候遇到了训练过程中没有见过的语言学表现,那么机器就不太容易输出正确的声学特征。
一个常见的例子是儿化音。原则上来说,每个汉语拼音都有对应的儿化音,但在实际说话中有些儿化音被使用到的频次极低,因此录制音库的时候通常并不会覆盖所有的儿化音,而是仅仅保留最常见的一些。这个时候就会出现一些儿化音发不出来,或者发不好的现象。
3、声码器错误
声码器的种类比较多,但是比较传统、比较常见的声码器通常都会用到基频信息。那什么是基频呢?基频就是你在说话的时候声带震动的快慢程度。这里教你一个简单的方法来感受自己说话的基频:把自己的除大拇指以外的其他四个手指按压到自己的喉咙部分,然后自己开始对自己随便说话。
这个时候你就会感受到你的喉咙在震动,这个震动的信息就是我们的基頻信息。发浊音时会伴随声带振动,声带不振动发出的音称为清音。辅音有清有浊,而元音一般均为浊音。所以合成语音中元音和浊辅音的位置都应该对应有基频,如果我们前面提到的声学模型输出的基频出现偏差,声码器合成的声音就会听起来很奇怪。
在训练后端这个「发音人」时,我们也要通过算法来计算出基频信息。不好的基频提取算法可能会造成基频丢失、倍频或者半频的现象。这些都会直接影响基频预测模型的效果。如果应该有基频的地方没有预测出基频,合成声音听起来就是沙哑的,对听感的影响十分明显。
一个好的声码器还要处理好基频和谐波的关系。如果高频谐波过于明显,在听感上会造成嗡嗡的声响,机械感明显。
总结
在这篇文章里,我们介绍了 TTS 的基础原理,以及分析了语音助手不能像真人一样说话的原因:TTS 在做各种决策中会犯错,导致朗读出错或者不自然。同时,为了让电脑可以合成声音,工程师会对文本转语音问题做简化,导致没有准确的刻画声音生成的过程。这种简化一方面来自于对语音语言生成过程的认知局限,同时也受限制于目前的计算工具。
尽管现在在这个领域内有很多新的方法,特别是使用深度学习(Deep Learning)方法来直接做文本到语音的转化,而且已经展示出来了非常自然的声音,但是让你的 AI 助手完全像人一样说话仍然是一项非常具有挑战性的工作。Rokid ALab 团队也致力于与大家一起探索 TTS 技术的突破与应用,期待为用户带来更加自然的声音。
深圳湾(微信公众号 ID:shenzhenware)是最早也是最活跃的硬件创新社区和媒体,关注「软件+硬件」带来的场景和交互创新,以及与平台和应用相连的产业链升级。
上一篇:RoboMaster 2019 机甲大师总决赛:赛制全面升级,东北大学夺冠
下一篇:Klipsch 杰士全新音响系列 The One Plus 和 The Three Plus,时尚设计、支持多样连接、软件调音

Klipsch 杰士全新音响系列 The One Plus 和 The Three Plus,时尚设计、支持多样连接、软件调音

跨界联名卷出圈,可口可乐与 AI 联名,共创未来新口味

2030 年创 222 亿美元,投资看好的 AR/VR 在医疗健康领域的四大应用

关于我们
Copyright @ 2023 深圳湾 粤ICP设备14084897号-1
|
|
TTS背后的技术原理——前端和后端系统的更多相关文章
- ChatGPT强势爆红,背后的技术原理是?一文轻松搞懂!
目录 什么是ChatGPT? OpenAI 背后的原理和发展历程 带来的争议和挑战 尾语 作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.源码解析.科技故事.项目 ...
- 即时通讯App怎样才能火?背后的技术原理,可以从这5个角度切入
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 社交场景 ...
- 【沙龙报名中】集结腾讯技术专家,共探AI技术原理与实践
| 导语 9月7日,上海市长宁区Hello coffee,云+社区邀您参加<AI技术原理与实践>沙龙活动,聚焦人工智能技术在各产业领域的应用落地,共话AI技术带来的机遇与挑战,展望未来. ...
- 全网显示 IP 归属地,这背后的技术你知道吗?
为了进一步规范国内的网络舆论,国家规定了各互联网平台都需要显示 IP 归属地信息.微博.抖音.公众号等多个平台纷纷上线了 IP 归属地功能,这标志着国内言论的进一步规范化.但互联网平台商们是怎么通过 ...
- 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)
1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目.所以今天抽时间记录一下最近学习的内容.本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 ...
- 快速理解高性能HTTP服务端的负载均衡技术原理(转)
1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...
- Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...
- [转载]Web前端和后端之区分,以及面临的挑战
原文地址:Web前端和后端之区分,以及面临的挑战[转]作者:joyostyle 在我们实际的开发过程中,我们当前这样定位前端.后端开发人员. 1)前端开发人员:精通JS,能熟练应用JQuery,懂CS ...
- Web前端和后端之区分,以及…
原文地址:Web前端和后端之区分,以及面临的挑战[转]作者:joyostyle 在我们实际的开发过程中,我们当前这样定位前端.后端开发人员. 1)前端开发人员:精通JS,能熟练应用JQuery,懂CS ...
- [转载]Web前端和后端之区分,以及面临的挑战【转】
原文地址:Web前端和后端之区分,以及面临的挑战[转]作者:joyostyle 在我们实际的开发过程中,我们当前这样定位前端.后端开发人员. 1)前端开发人员:精通JS,能熟练应用JQuery,懂CS ...
随机推荐
- 【接口测试】Postman(三)-变量与集合
变量与集合 在Postman中,我们进行接口测试一般是以集合为单位,而在日常应用中,我们会经常使用到变量.下面我们将介绍一下变量和集合的一些用法. 文章目录导航: 目录 变量与集合 一.变量 1. ...
- GPT3的技术突破:实现更准确、更真实的语言生成
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 GPT-3 技术突破:实现更准确.更真实的语 ...
- AI 和 DevOps:实现高效软件交付的完美组合
AI 时代,DevOps 与 AI 共价结合.AI 由业务需求驱动,提高软件质量,而 DevOps 则从整体提升系统功能.DevOps 团队可以使用 AI 来进行测试.开发.监控.增强和系统发布.AI ...
- JavaScript高级学习
JavaScript 进阶 学习作用域.变量提升.闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值.函数声明的简洁语法,降低代码的冗余度. 理解作用域对程序执行的影响 能够分析程序执 ...
- Redis缓存同步1-策略介绍
缓存数据同步策略示意图 在大多数情况下,我们通过浏览器查询到的数据都是缓存数据,如果缓存数据与数据库的数据存在较大差异的话,可能会产生比较严重的后果的.所以,我们应该也必须保证数据库数据.缓存数据的一 ...
- Elasticsearch日常开发
2020-08-12 14:51:37 每次遇到ES开发,一般都是查询es里面的数据,今天我教大家一个简单的es的查询.废话不多说,直接上代码. 在pom文件中引入 <dependency> ...
- Blazor阻止冒泡传播
在你的组件的外面套上一个div,并添加@onclick:stopPropagation="true" <div @onclick:stopPropagation=" ...
- http头部字段Origin和Access-Control-Allow-Origin解决请求跨域
Http协议中请求头和响应头携带了很多信息,其中 请求头 Origin,响应头 Access-Control-Allow-Origin 与跨域有关. 为了验证跨域,要将客户端和服务端分配在不同端口,这 ...
- 拖拽宫格vue-grid-layout详细应用及案例
目录 1.前言 2.安装 3.属性 4.事件 5.占位符样式修改 6.案例 1.前言 vue-grid-layout是一个适用于vue的拖拽栅格布局库,功能齐全,适用于拖拽+高度/宽度自由调节的布局需 ...
- [selenium]取值元素文本属性样式
前言 版本: python:3.9 selenium:4.1.5 获取元素文本 text = driver.find_element(by=By.XPATH, value=""). ...