AI Talk:端到端语音合成及其优化实践(上)

转载声明:本文转载自知乎【AI Talk】

1、前言

语音合成系统分为前端和后端,前端负责分词、词性、多音字标注等文本特征信息提取;后端模块根据前端提取的文本特征完成语音生成。从技术角度,传统后端模块又可以细分为拼接系统和参数系统,拼接系统和参数系统各有优缺点,详细对比可以参照 AI Talk 的上一篇文章 “基于深度学习的语音合成技术进展” 。

传统的语音合成系统,都是相对复杂的系统,比如,前端模块需要较强的语言学背景知识,不同语言的语言学知识差异明显,需要特定领域的专家支持,增加了系统构建的难度。参数系统的后端模块需要对语音的发声机理以及信号处理有一定的了解。由于传统参数系统建模时存在信息损失,限制了合成语音表现力的进一步提升。而拼接系统则对语音数据库要求较高,同时,需要人工介入制定很多挑选规则和参数,以保证拼接合成的效果和稳定性。

这些问题促使端到端语音合成的出现,研究者希望能够合成系统能够尽量的简化,减少人工干预和对语言学相关背景知识的要求。端到端合成系统直接输入文本或者注音字符,系统输出音频波形。前端模块得到极大简化,甚至可以直接省略掉。端到端合成系统相比于传统语音合成,降低了对语言学知识的要求,可以方便的在不同语种上复制,批量实现几十种甚至更多语种的合成系统。借助于深度学习模型的强表达能力,端到端语音合成系统表现出令人惊艳的合成效果和强大丰富的发音风格与韵律表现力。

本文将向您介绍云知声在端到端语音合成方向的探索和尝试,这其中既包括对已有算法的理解和复现、又包括云知声结合自身对算法的调整和改进。如果您是语音合成爱好者,希望了解语音合成行业发展和最新技术的现状,建议您试听文中附带 Samples,这些 Samples 代表这当前实验室环境下,语音合成韵律和音质的最佳水平。如果您是语音合成或机器学习从业者,希望了解技术细节,建议您从头阅读文章,如有问题欢迎留言或私信。

2、Tacotron

Tacotron 是第一个真正意义上端到端的语音合成系统,它输入合成文本或者注音串,输出 Linear-Spectrum ,再经过 Griffin-Lim 转换为波形,一套系统完成语音合成的全部流程。

Tacotron 前后推出两代,Tacotron2 主要的改进是简化了模型,去掉了复杂的 CBHG 结构,同时更新了 Attention 机制,提高了对齐稳定性。Tacotron 和 Tacotron2 师出同门,总体思路是一样的,本文以初代 Tacotron 为例讲解。

图1: Tacotron 模型结构

图1 记录了 Tacotron 的整体结构,黄色代表输入,绿色代表输出,蓝色代表网络。网络部分大体可分为 4 部分,分别是左:Encoder、中:Attention、右下:Decoder、右上:Post-processing。其中 Encoder 和 Post-processing 都包含一个被称为 CBHG 的结构,CBHG 结构的详细介绍可以参照上一篇文章 “基于深度学习的语音合成技术进展” 。Encoder、Attention、Decoder 共同构成了经典的 Seq2seq 结构,所以 Tacotron 也可以看做是一个 Seq2seq + Post-processing 的混合网络。

Tacotron 输入可以有多种选择,以中文和英文合成系统为例:

英文文本,训练英文模型,最直观的想法是直接将英文文本当做输入,Tacotron1 也是这么做的。但这样可能会引入一些问题,比如未登录词发音问题。

英文注音符,用英文注音符(比如 CMUDict )作为输入可以提高发音稳定性,除了注音词典,还可以引入注音前端,增强对模型的控制。

中文拼音,由于中文汉字数量多,且存在大量多音字,直接通过文本训练是不现实的。所以我们退而求其次,通过拼音训练模型,拼音由注音前端生成,这样既去掉了汉字的冗余发音又提高了模型的可控性。

中文|英文 IPA (International Phonetic Alphabet) 音标,IPA 音标是一种更强的注音体系,一套注音体系可以标注多种语言。对于中文,IPA 音标的标注粒度比拼音更细,实验中,我们观察到用 IPA 作为输入,可以略微提升对齐稳定性。另外,在中文发音人+英文发音人混合训练试验中,我们观察到了一个有意思的现象:由于中英文 IPA 标注中共享了部分发音单元,导致跨语种发音人可以学会对方的语言,也就是中文发音人可以合成英文,英文发音人可以合成中文。在这个联合学习过程中存在着迁移学习的味道。

根据不同的用途,Tacotron 可以输出 Linear-Spectrum 或 Mel-Spectrum,如果使用 Griffin-Lim 需要 Tacotron 输出 Linear-Spectrum;如果使用 WaveNet 做 Vocoder ,则 Tacotron 输出 Linear-Spectrum 或 Mel-Spectrum 均可,但 Mel-Spectrum 的计算代价显然更小,Tacotron2 中,作者使用 80 维 Mel-Spectrum 作为 WaveNet Vocoder 的输入,在云知声我们使用 160 维 Mel-Spectrum 。

Seq2Seq 模块:Seq2Seq 本质上是学习序列到序列映射的强大模型,其已经在多个不同领域(NMT、CHAT、ASR等)取得了成功。Tacotron 套用了这套框架。在 Seq2Seq 模块中,输入是注音序列,输出是 Mel-Spectrum 序列,引入低维 Mel-Spectrum 的目的是帮助 Attention 收敛。模型里还包含很多 tricks 包括引入 CBHG 模块,Decoder 模块每一时刻同时输出多帧等等,这里就不一一赘述。

Post-processing 模块:Post-processing 是另一个很重要的模块,在 Tacotron + WaveNet Vocoder 框架下,Post-processing 模块的输入是 Seq2Seq 模块输出的 Mel-Spectrum,输出也是 Mel-Spectrum,看起来多此一举,但却有意义。Seq2Seq 的框架决定了 Decoder 只能看见前面的若干帧,它对未来一无所知,而 Post-processing 则可以看见前后若干帧,参考信息更多,理论上生成质量也更高。我们可以在实验中观察 Post-processing 的作用。 下图中,从上到下依次是,Post-processing 输出 Mel-spec;Decoder 输出 Mel-spec;对齐。可以看到 Post-processing 输出的 Mel-spec 更平滑高频细节还原更清晰。

图2: 上:Post-processing Mel-Spectrum 中:Seq2Seq Mel-Spectrum 下:Attention

2.1 实时解码 tricks (CPU)

在 Tacotron1 中,作者使用 Griffin-Lim 算法,从 Linear-Spectrum 中恢复相位,再通过 ISTFT 还原波形,Griffin-Lim 的优点是算法简单,可以快速建立调研环境,缺点是速度慢,很难在 CPU 上做到实时,无法实时解码也就意味着系统无法在生产环境使用。

幸运的是我们可以找到一些稍显复杂但有效的方法,加速解码。

SPSI (Single Pass Spectrogram Inversion),顾名思义,是一种没有迭代的快速 Spectrogram Inversion 算法,速度飞快,但音质通常比 Griffin-Lim 差。

Griffin-Lim 是一个迭代算法,可以通过增加迭代数量提高合成音质,在实验中我们通常进行60轮迭代以保证音质稳定。

SPSI 速度快但效果堪忧;Griffin-Lim 效果尚佳,但速度慢,有没有办法结合两者的优点呢,答案是肯定的。我们的方案效果可以与 60轮 G&L 打平,同时可以在 CPU平台上将实时率做到令人满意的指标(GPU 平台,性能还会翻几倍 )。需要注意的是,性能指标在 Tensorflow 环境下获得的,并没有包含其他深入的工程化工作。

2.2 Samples

你觉得上面的 Samples 听感如何呢?韵律还不错,音质乍一听也还好,但似乎又有些问题,主要表现在沉闷,不锐利。

没错,通过 Griffin-Lim 生成波形的频谱过于平滑、空洞较多,听感不佳。没关系,在下一节中我们将想办法解决这一问题。

3、Vocoder

通过上面一系列努力我们已经可以将 Tacotron 的 CPU 解码速度做到实时了,但音质上始终有些欠缺。种种迹象表明,Griffin-Lim 算法是音质瓶颈,经过一系列工作尤其是 Tacotron2 ,人们逐渐意识到,Mel-Spectrogram 可以作为采样点自回归模型的 condition,利用强大的采样点自回归模型提高合成质量。

目前公认的效果有保障的采样点自回归模型主要如下几种,1) SampleRNN、2)WaveNet、3)WaveRNN。我们分别从头实现了 SampleRNN 和 WaveNet ,下面我们将逐一介绍:

3.1 SampleRNN

图3: SampleRNN 模型结构

SampleRNN 是一个精心设计的 RNN 自回归模型。标准的 RNN 模型包括 LSTM、GRU,可以用来处理一些长距离依赖的场景,比如语言模型。但对于音频采样点这样的超长距离依赖场景(比如:24k采样率,意味着 1s 中包含 24000 个采样点),RNN 处理起来已经非常困难了 。SampleRNN 的作者,将问题分解,分辨率由低到高逐层建模,例如图中,Tier3 层每时刻输入16个采样点,输出状态 S1;Tier2 层每时刻输入 4 个采样点,同时输入 Tier3 输出的 S1,输出状态 S2 ; Tier1 层每时刻输入 4 个采样点,同时输入 Tier2 输出的 S2,输出一个采样点,由于 Tier1 没有循环结构,同一时刻可以输出 4 个采样点。

3.1.1 Samples

下面是 Unconditional SampleRNN 合成的一段语音,由于是 Unconditional 所以没有语义内容,但保留了发音、音色以及韵律风格,我想你一定听出了他是谁吧?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180706B1EEH300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券