课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1

参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html

备注:图片均来自于课件。

这次回顾P14至P15,这部分介绍了语音合成问题。

语音合成(Speech Synthesis)

语音合成的全称是Text-to-Speech (TTS) Synthesis,这部分主要介绍如下几个内容:

  • 端到端之前的TTS
  • Tacotron:端到端的TTS
  • 超越Tacotron
  • 可控的TTS

端到端之前的TTS

拼接法

该方法的思路很简单:

  • 数据库中有个每个文字对应的声音信号。
  • 将文本的每个文字的声音信号拼接起来即得到结果。
  • 难点:如何让声音信号听起来自然。
    • 根据cost。

图示如下:

该方法的问题是合成的声音必须在数据库中存在。

参数化方法

这些方法是基于HMM/DNN的方法,比较复杂,老师没有详细介绍,参考资料如下:

http://hts.sp.nitech.ac.jp/?Tutorial

Deep Voice

Deep Voice是最接近于端到端的模型:

每个组件都是NN,训练时是分别训练的,所以不是端到端模型,各个组件作用如下:

  • Grapheme- to-phoneme:字素到音素。
  • Duration Prediction:计算因素的时长。
  • Fundamental Frequency Prediction:决定音高。
  • Audio Synthesis:生成结果。

Tacotron:端到端TTS

Tacotron的全称是TOWARDS END-TO-END SPEECH SYNTHESIS,其输入输出如下:

  • 输入:字符
  • 输出:(线性)频谱图
    • 频谱到声音只需增加相位信息,基于rule就可以求解。

在此之前,有如下接近于端到端的尝试:

  • 输入:音素

  • 输出:用于STRAIGHT(声码器,vocoder)的声学特征

Char2wav

  • 输入:字符
  • 输出:用于SampleRNN(声码器)的声学特征

网络架构

整体架构还是比较清晰的,后续会分别介绍:

Encoder

Encoder的作用类似于字素到音素的转换,具体来说:

  • 输入:字符
  • embedding层
  • Pre-net:全联接网络
  • CBHG:比较复杂的模型
  • 得到输出

图示如下:

CBHG看起来很复杂,但可能并不是必要的,例如第二版的模型就没有使用CBHG:

Attention

文本和语音之间attention的特点是单调对齐的:

具体来说,图中每列表示每个decoder输出对应的概率分布,最亮的点表示概率最大的地方,我们希望最大值对应的点构成一条分段斜直线,每一段就对应了每个文本对应多长的声音信号,因此可以将attention理解为对持续时间进行了建模。

Decoder

Decoder的作用是产生声音信号:

结构的说明:

  • Pre-net里使用dropout。
  • RNN每步会产生$r$个输出,第二版里$r=1$。
  • 下一步的输入根据$r$个输出得到,第一版里直接选择最后一个输出。
  • 训练时使用teacher forcing。
  • 训练模型End判断模型何时结束。

Post processing

  • 输入:RNN的输出。
  • 输出:频谱信息。
  • 目的:考虑全局信息,进行修正。
  • 损失函数:
    • RNN的输出以及CBHG输出的Mel-spectrogram。

Vocoder

将CBHG的输出输入给Vocoder,返回声学信号,这部分是独立训练的:

推理阶段的技巧

该模型的特点是,在推理阶段要使用dropout,这里老师给出的解释是:

  • 在生成文本时,我们是进行采样,因为这样增加了随机性。
  • Tacotron的输出是连续的,无法进行采样,所以在Pre-net中增加随机性,因此使用了dropout。

超越Tacotron

发音错误

Tacotron有时候模型会念错单词,这是因为训练集无法覆盖全部单词,解决方法如下:

  • 使用词汇表将单词转换为音素,并将音素作为Tacotron的输入。
    • 但是这点无法完全解决问题,因为依然存在很多不知道读音的单词。
  • 字符和音素混合输入。
    • 如果机器的发音不正确,可以将单词添加到词汇表中以解决问题。

给Encoder更多信息

  • 文法信息。

  • BERT embedding作为输入。

Attention

我们希望attention在对角线部分,可以在训练中做一些约束:

  • 在训练过程中惩罚非对角线注意矩阵。
  • 强制约束。

参考资料:

  • Guided Attention [Tachibana, et al., ICASSP’18]
  • Monotonic Attention [Raffel,et al., ICML’17]
  • Location-aware attention
  • [Battenberg, et al., ICASSP’20]

Fast Speech

将决定音素时长的Attention换成Duration模型,直接计算每个音素重复的次数:

注意到这里涉及到对齐的问题,这部分利用别的模型计算对齐。

Dual Learning: ASR & TTS

注意到ASR和TTS互为逆问题,所以可以将两者串起来:

注意到两者类似于Encoder和Decoder的关系,所以可以借助两者可以互相帮助来进行训练:

这里TTS和ASR是预训练好的。

可控的TTS

一段声音信号可以由几部分组成:

  • 说什么
    • 在TTS中由输入决定。
  • 怎么说
    • 抑扬顿挫。
  • 谁在说
    • 为特定人合成语音(语音克隆)。

可控的TTS是指根据文本和参考声音信号来产生新的声音信号,这部分和声音转换非常类似:

训练和推断

  • 输入:文本,该文本对应的声音信号。
  • 输出:声音信号。
  • 目标:输入和输出信号尽可能接近。

一个问题是,模型可能会直接复制声音信号:

解决方法是,训练一个模型提取声音信号的语者信息(预训练),忽略内容信息:

另一个方法如下:

该方法和之前类似,但是特征提取的部分不是预训练的;然后将Feature Extractor和Encoder的输出拼接起来,进行attention即可。

Feature Extractor的具体结构如下:

Feature Extractor的Encoder只输出权重,然后对vector set做加权和得到输出,这样设计是为了去掉内容信息,从实验效果来说,vector set确实对应了一些说话语气。

Two-stage Training

该方法的思路是增加文本内容和声音内容不同的数据:

由于没有标准答案,所以在TTS之后接一个ASR,由此得到声音对应的问题,然后最小化化损失函数即可:

我们的目标是TTS和ASR的attention是一致的。