1 VITS模型介绍
VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一种结合变分推理(variational inference)、标准化流(normalizing flows)和对抗训练的高表现力语音合成模型。
VITS模型是韩国科学院在2021年6月提出的,VITS通过隐变量而非频谱串联起来语音合成中的声学模型和声码器,在隐变量上进行随机建模并利用随机时长预测器,提高了合成语音的多样性,输入同样的文本,能够合成不同声调和韵律的语音。
论文地址:VITS论文
2 VITS模型结构
2.1 总体结构
-
先验编码器:TextEncoder由多层的transformer encoder组成,预测的结果输出均值与方差。
-
后验编码器:由conv1d+WN网络组成+conv1d组成。输出得到均值与方差,并且使用FLOW得到复杂分布z_p。通过flow后的复杂分布z_p与先验编码器后的分布进行对MAS对齐估计。得到attn硬对齐矩阵。
-
MAS对齐估计:通过mas(monotonic align search)硬对齐算法,将文本feature和序列帧feature进行一个硬对齐,拿到对齐矩阵Attn。MAS使用DP算法,假设一个文本feature其对应的帧序列符合一个高斯分布,通过DP算法做优化,计算出文本和序列的最优对齐矩阵。
-
解码器:实际就是声码器HiFi-GAN V1的生成器。应用于多人模型时,在说话人嵌入向量之后添加一个线性层,拼接到的输出隐变量。
-
判别器:增加了一个HiFi-GAN的多周期判别器,仅在训练的时候才起作用,用于对抗generator的训练。
2.2 VITS的好处及问题
-
VAE 擅长捕捉句子整体的韵律特征,而Flow擅长重建音频的细节特征;将两者整合,进行多任务训练,实现参数与优势共享。
-
VITS 直接合成音频,实现真正意义的端到端语音合成,而不是two-stage阶段的序列到序列的合成;从而消除两个模型带来的Gap。
-
传统两个模型的TTS系统,GAN 训练通常只应用与声码器,而VITS 中的 GAN 训练是全局的、对每个模块都有效。
-
vits虽然通过sdp解决了one-to-many的问题,但是从合成结果来看,因为对韵律,语调等feature是统一建模的,没有进行拆分细粒度,因此针对英文这种语调丰富的语言,其语调建模的学习的比较平均化,针对风格发音人来说,整体合成效果来看无法得到较好的语调,比较单一,语调较平。
2.3 VITS主要包括3块
- 条件变分自编码器(Variational AutoEncoder,VAE)
VAE(Variational Autoencoder)是一种深度生成模型,同时也被视为一种自编码器。它的结构包含两部分:编码器和解码器。
编码器的功能是将输入数据转换为一组潜在空间的高维向量。这些潜在向量通常被称为“隐变量”或“latent vectors”。
解码器则是利用编码器产生的潜在向量来重建原始输入数据。这个过程涉及到从潜在空间中采样,以及根据采样到的潜在向量合成新数据。
VAE的核心原理是利用变分推断(variational inference),这是一种统计学方法,旨在找到一个简单且接近真实分布的概率密度函数。在这个框架下,VAE试图学习数据的内在分布,而不是直接优化对数似然函数。这允许VAE在不完全了解数据分布的情况下进行有效的数据生成和学习。
在VAE的训练过程中,首先通过编码器提取输入数据的潜在向量,然后从中生成样本来计算与原始输入的重构误差。这个误差作为损失函数的一部分,通过反向传播算法更新网络权重和偏置,以最小化损失。这样,VAE能够学习到数据的潜在表示,并且在实际应用中表现出良好的泛化能力和性能。
总结来说,VAE的学习目标是在不完美地知道数据分布的情况下,通过学习数据的内在分布来生成新的数据,同时在一定程度上保持原有数据的特性。这种架构不仅适用于图像、声音等传统领域,而且在降维和特征提取方面也表现出了优势。
- 从变分推断中产生的对齐估计
- 生成对抗训练
2.4 语音合成里程碑
VITS 语音合成完全端到端TTS的里程碑,主要突破点如下:
-
首个自然度超过2-stage架构SOTA的完全E2E模型。MOS4.43, 仅低于GT录音0.03。声称目前公开系统最好效果。
-
得益于图像领域中把Flow引入VAE提升生成效果的研究,成功把Flow-VAE应用到了完全E2E的TTS任务中。
-
训练非常简便,完全E2E。不需要像Fastspeech系列模型需要额外提pitch, energy等特征,也不像多数2-stage架构需要根据声学模型的输出来finetune声码器以达到最佳效果。
-
摆脱了预设的声学谱作为链接声学模型和声码器的特征,成功的应用来VAE去E2E的学习隐性表示来链接两个模块
-
多说话人模型自然度不下降,不像其他模型趋于持平GT录音MOS分
3 使用vits模型进行中文语音合成训练
3.1 github项目下载:
git clone https://github.com/PlayVoice/vits_chinese
3.2 运行环境搭建
annoconda环境搭建详见:annoconda安装与使用
conda create -n vits pyton=3.9
conda activate vits
cd vits_chinese
pip install -r requirements.txt
cd monotonic_align
python setup.py build_ext --inplace
3.3 数据集下载
下载标贝男声数据集,采样频率为22050,下载地址如下:
下载完成后,将数据集解压缩后放到“vits_chinese/data/waves”目录下,标注数据放到
“vits_chinese/data”目录下
3.4 预训练模型下载
韵律模型下载:韵律模型
下载完成后,移动到“vits_chinese/bert/”目录下
3.5 数据预处理
修改配置文件:vi config/bert_vits.json
"max_wav_value": 32768.0,
"sampling_rate": 22050,
"filter_length": 1024,
python vits_prepare.py -c ./configs/bert_vits.json
3.6 启动训练
python train.py -c configs/bert_vits.json -m bert_vits
3.7 训练后推理
python vits_infer.py --config ./configs/bert_vits.json --model logs/bert_vits/G_700000.pth
其中G_700000.pth为训练后的模型,根据训练实际情况指定训练模型进行推理
4 训练结果展示
经过1000个epoch训练后的语音生成效果如下:
https://download.csdn.net/download/lsb2002/87832170d
5 预训练模型
使用标贝男声数据,使用Tasla-v100GPU,经过70万epochs训练后模型,新speaker可以在此模型上二次训练,达到快速收敛的效果。预训练模型下载地址
下载后,将模型存储到/vits_chinese/logs/bert_vits/目录下,启动二次训练