VITS论文阅读

概览

VITS,Variational Inference with adversarial learning for end-to-end Text-to-Speech,一个很牛逼的变分推理 + 对抗学习的端到端 TTS 网络。

基于《Attention is all you need》中的Transformer结构,额外添加了一个持续时长预测器。

基本结构

基于 transformer,也有编码器,解码器。但是编码器做了文本编码器、先验编码器、后验编码器的区分。

基本组成部分:

• 文本编码器(Text Encoder):将输入的文本序列转换为文本特征序列,使用transformer的编码器结构。

• 后验编码器(Posterior Encoder):将文本特征序列和真实的语音特征序列(如梅尔频谱)作为输入,使用transformer的编码器结构,输出一个后验潜变量分布。

• 先验编码器(Prior Encoder):将文本特征序列作为输入,使用transformer的编码器结构,并在每个层后面加入一个标准化流层(Normalizing Flow Layer),输出一个先验潜变量分布。

• 语音解码器(Speech Decoder):将文本特征序列和从先验或后验分布中采样得到的潜变量作为输入,使用transformer的解码器结构,并在最后一层后面加入一个对抗损失层(Adversarial Loss Layer),输出一个语音特征序列。

• 持续时间预测器(Duration Predictor):将文本特征序列作为输入,使用一个全连接层和一个softmax层,输出一个持续时间序列,表示每个文本单元对应的语音帧数。

VITS的模型训练过程包含以下几个损失函数:

• 重建损失(Reconstruction Loss):衡量语音解码器输出的语音特征序列和真实的语音特征序列之间的差异,使用L1损失或MSE损失。

• 对抗损失(Adversarial Loss):衡量语音解码器输出的语音特征序列是否能够被一个判别器(Discriminator)区分出真假,使用Wasserstein距离或GAN损失。

• KL散度损失(KL Divergence Loss):衡量后验潜变量分布和先验潜变量分布之间的差异,使用KL散度公式。

• 持续时间损失(Duration Loss):衡量持续时间预测器输出的持续时间序列和真实的持续时间序列之间的差异,使用MSE损失或二值交叉熵损失。

训练过程的网络

1
2
3
4
5
6
7
1.将输入的文本序列和真实的语音特征序列(如梅尔频谱)通过文本编码器和后验编码器得到后验潜变量分布,并从中采样得到后验潜变量。

2.将输入的文本序列通过先验编码器得到先验潜变量分布,并从中采样得到先验潜变量。

3.将文本特征序列和后验潜变量或先验潜变量通过语音解码器得到重建的语音特征序列,并通过判别器判断其真假。

4.根据重建损失、对抗损失、KL散度损失和持续时间损失对模型参数进行更新。

总结一下,即

  • 文本序列,真实语音序列作为输入,通过文本编码器、后验编码器,输出后验潜变量分布,采样得后验潜变量。
  • 文本序列作为输入,通过先验编码器,得到先验潜变量分布,采样得到先验潜变量。
  • “文本特征序列”+后验潜变量通过语音解码器,得到重建语音特征序列。
  • “文本特征序列”+先验潜变量通过语音解码器,得到重建语音特征序列。
  • 重建语音特征序列输入判别器,判断真假。
  • 计算所有损失,求和,并进行模型参数更新。

但是VITS将本来的编码器换成了VAE,又加了个标准化流,变成了Glow模型。

推理过程的网络

VITS的模型推理过程如下:

• 将输入的文本序列通过文本编码器得到文本特征序列。

• 将文本特征序列通过先验编码器得到先验潜变量分布,并从中采样得到潜变量。

• 将文本特征序列和潜变量通过语音解码器得到语音特征序列。

• 将语音特征序列通过一个声码器(Vocoder)得到最终的语音波形。


VITS论文阅读
http://petertan303.github.io/2023/06/12/VITS论文阅读/
作者
peter?
发布于
2023年6月12日
许可协议