Human Language Processing——Controllable TTS

2020-08-06 20:56:22 浏览数 (1)

一段声音信号中,它的组成其实包含了好几个维度,比如说的内容,说的方式,以及说的人的音色。过往的语音合成只关注说的内容正确,而这次我们希望能按照我们的方式去控制合成的语音,以不同的方式、不同的音色去说

指定某个人去说一段话的技术叫声音克隆。现实中我们缺乏某个歌手高质量的语音数据去训练TTS 系统。这里往往会使用音色迁移技术。此外,同一句话说的方式是可以抑扬顿挫 (Prosody) 的,它包含了说的语调,重音,停顿和韵律等。ICML 18 年的一篇论文从反面去定义什么是抑扬顿挫。它不是内容,不是说话者的声纹,也不是环境的混响

对于可控的 TTS,我们希望给定一段文字,再给定一段参考的声音(不一定要说文字内容),我们希望模型能够生成出语气、停顿和参考声音相仿的合成语音。对于人声克隆,可以用音色迁移技术。我们会给 VC 模型两段声音,其中一段会抽取出内容信息,另外一段声音会抽出说话者的特征,要求模型输出的声音能在内容和音色上与指定的一致。这两个模型其实非常相像。都是域的迁移

训练时,就是让输出的声音与我们标注的 Ground Truth 越接近越好。这两个模型看起来就像是 AutoEncoder,不同在,它多了一个文字的 Condition。为了防止模型学到直接把输入的语音复制,输出模型来最小化损失,我们希望用一个模型来提取输入语音的声纹特征

这个声纹特征提取器是预训练好的,且固定参数不参与权重更新。我们希望最小化输入语音和条件输出后的语音的重构误差。这样就能保证我们用非常少量的人声语料做到声纹迁移

GST 为 Global Styple Tokens 的缩写,GST-Tacontron 是可以做条件语音生成的模型。我们会先用一个 Encoder 来把文字变成嵌入,参考语音则会通过一个特征提取器变成音色的嵌入。这个特征提取器在这里是可以端对端训练的。我们把这两个嵌入相加或拼接起来,做 Attention。之后就和原版的 Tacontron 对特征向量解码

同样为了防止模型复制输入语音输出,GST-Tacontron 做了特殊的设计,让输入的语音内容难以通过特征提取器传递给 Tacontron 解码。Encoder 会把参考语音编码成一个向量。这个向量不会直接当做输出,而是当做注意力权重。Vector Set 是特征提取器的参数。我们把二者加权求和,才得到特征提取器的最终输出。编码器只能够通过操控注意力的权重,这样就很难把内容信息直接带出来。更神奇的是,这些学到的 Vector set 每个维度向量对应了说话的每一种方式。如果你把它对应的 注意力权重调高,声音就会往相应维度风格变化,即某种抑扬顿挫的元素会被改变

举例来说,某些 Style Vector 对应了说话声音的高低,有些则对应了说话的语速

还有一种防止模型直接复制输入参考语音的方法是,我们采用二阶段训练。第二阶段会用一个ASR 来把输出合成语音做语音识别,然后最小化模型识别的文字和输入文字的误差。此外,我们也可以用 attention consistency 来解决这个问题。假设 TTS 和 ASR 的模型都是 Seq2Seq 模型。对于 TTS 的注意力而言,输入的字母会对应它产生的声音信号。我们期待 ASR 的注意力在看到同一段声音的时候,应该也要产生相同的字母。即让两个注意力权重矩阵保持一致


最后总结下关于 GST-Tacontron 补充几个问题:

如何知道 GST-Tacontron 学到的不是 Speaker Identity,而是 Prosody 呢?

因为 GST 的数据集中只有一个说话人,所以不会有不同说话人的差异,只有抑扬顿挫的差异。如果我们想做得更好一点,我们需要把 Speaker Identity 和 Prosody 再做特征分离。在语音数据集中,我们需要知道哪些句子是同一个人说的。从这些句子中,我们会抽出某些共同的 Style Vector。除掉这些共同的特征后剩下的就会是表征 Prosody 信息的向量

GST-Tacontron 只用一个向量来表征说话的风格,这是否足够表征抑扬顿挫信息呢?

一个向量的表征能力有限。这未必是一个好的解决思路。我们需要实验研究,说话风格能否用一个向量来表示。会不会太粗糙了,有些信息损失,没有表示到。因此有些做可控 TTS 的模型会考虑用一排向量,数量为输入序列的长度。这样每一小段声音信号,都有一个向量表征。或许这样才能真正地 Control 一个句子的 Prosody。这是一个尚待研究的问题

0 人点赞