VITS2: 用对抗学习和架构设计改进单阶段文本到语音的质量和效率
Jungil Kong, Jihoon Park, Beomjeong Kim, Jeongmin Kim, Dohee Kong, Sangjin Kim
SK Telecom,韩国
单阶段文本到语音模型最近被积极研究,其结果已超过两阶段管道系统。虽然之前的单阶段模型取得了很大进展,但在间歇性不自然、计算效率和对音素转换的强依赖性方面仍有改进空间。在本工作中,我们介绍了VITS2,这是一种单阶段文本到语音模型,通过改进前作的多个方面,有效地合成更自然的语音。我们提出改进的结构和训练机制,并展示所提出的方法在提高自然性、多说话人模型中语音特征相似性以及训练和推理效率方面是有效的。此外,我们证明了通过我们的方法,之前工作中对音素转换的强依赖性可以显著减少,这使得完全端到端的单阶段方法成为可能。
演示: https://vits-2.github.io/demo/
论文: https://arxiv.org/abs/2307.16430
VITS2的非官方实现。这是一个进行中的工作。请参阅TODO了解更多细节。
持续时间预测器 | 正规化流 | 文本编码器 |
---|---|---|
音频样本
[进行中]
在1个GPU上针对LJSpeech数据集进行52,000步训练后的音频样本: https://github.com/daniilrobnikov/vits2/assets/91742765/d769c77a-bd92-4732-96e7-ab53bf50d783
安装:
克隆仓库
git clone git@github.com:daniilrobnikov/vits2.git
cd vits2
设置conda环境
假设您已经在克隆后导航到 vits2
根目录。
注意: 这在 python3.11
和 conda 环境下测试。对于其他python版本,可能会遇到版本冲突。
PyTorch 2.0 请参阅 requirements.txt
# 安装所需的软件包(针对 pytorch 2.0)
conda create -n vits2 python=3.11
conda activate vits2
pip install -r requirements.txt
conda env config vars set PYTHONPATH="/path/to/vits2"
下载数据集
您可以从以下三个选项中选择一个:LJ Speech、VCTK 或自定义数据集。
- LJ Speech: LJ Speech 数据集。用于单说话人TTS。
- VCTK: VCTK 数据集。用于多说话人TTS。
- 自定义数据集: 您可以使用自己的数据集。请参阅这里。
LJ Speech 数据集
- 下载并解压 LJ Speech 数据集
wget https://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2
tar -xvf LJSpeech-1.1.tar.bz2
cd LJSpeech-1.1/wavs
rm -rf wavs
- 预处理梅尔频谱图。参见 mel_transform.py
python preprocess/mel_transform.py --data_dir /path/to/LJSpeech-1.1 -c datasets/ljs_base/config.yaml
-
预处理文本。参见 prepare/filelists.ipynb
-
重命名或创建数据集文件夹的链接。
ln -s /path/to/LJSpeech-1.1 DUMMY1
VCTK 数据集
- 下载并解压 VCTK 数据集
wget https://datashare.is.ed.ac.uk/bitstream/handle/10283/3443/VCTK-Corpus-0.92.zip
unzip VCTK-Corpus-0.92.zip
-
(可选):将音频文件降采样到22050 Hz。参见 audio_resample.ipynb
-
预处理梅尔频谱图。参见 mel_transform.py
python preprocess/mel_transform.py --data_dir /path/to/VCTK-Corpus-0.92 -c datasets/vctk_base/config.yaml
-
预处理文本。参见 prepare/filelists.ipynb
-
重命名或创建数据集文件夹的链接。
ln -s /path/to/VCTK-Corpus-0.92 DUMMY2
自定义数据集
- 创建一个包含wav文件的文件夹
- 在
datasets
目录下复制ljs_base
并重命名为custom_base
- 打开 custom_base 并修改
config.yaml
中的以下字段:
data:
training_files: datasets/custom_base/filelists/train.txt
validation_files: datasets/custom_base/filelists/val.txt
text_cleaners: # 参见 text/cleaners.py
- phonemize_text
- tokenize_text
- add_bos_eos
cleaned_text: true # 如果您运行了第6步,则为True。
language: en-us # 数据集的语言。参见 espeak-ng
sample_rate: 22050 # 采样率,根据您的数据集设置
...
n_speakers: 0 # 单说话人设为0,多说话人设> 0
- 预处理梅尔频谱图。参见 mel_transform.py
python preprocess/mel_transform.py --data_dir /path/to/custom_dataset -c datasets/custom_base/config.yaml
- 预处理文本。参见 prepare/filelists.ipynb
注意: 如果您想使用 phonemize_text
清洁器,您可能需要安装 espeak-ng
。请参阅 espeak-ng
- 重命名或创建数据集文件夹的链接。
ln -s /path/to/custom_dataset DUMMY3
训练示例
# LJ Speech
python train.py -c datasets/ljs_base/config.yaml -m ljs_base
# VCTK
python train_ms.py -c datasets/vctk_base/config.yaml -m vctk_base
# 自定义数据集(多说话人)
python train_ms.py -c datasets/custom_base/config.yaml -m custom_base
推理示例
参见 inference.ipynb 和 inference_batch.ipynb
预训练模型
[进行中]
待办事项
- 模型(vits2)
- 更新TextEncoder以支持说话人条件
- 支持训练中的高分辨率梅尔频谱图。参见 mel_transform.py
- 带有高斯噪声的单调对齐搜索
- 使用Transformer块的正规化流
- 带时间步长条件判别器的随机持续时间预测器
- 模型(YourTTS)
- 语言条件
- 说话人编码器
- 模型(NaturalSpeech)
- 优化前的KL散度损失
- GAN损失用于端到端训练
- 其他
- 支持批量推理
- 分词器中的特殊标记
- 测试numba.jit和numba.cuda.jit的MAS实现。参见 monotonic_align.py
- TextEncoder和Projection之间的KL散度损失
- 支持流推理。请参阅 vits_chinese
- 使用optuna进行超参数调优
- 未来工作
- 将模型更新为vits2。请参阅 VITS2
- 将模型更新为YourTTS,支持零样本学习。参见 YourTTS
- 将模型更新为NaturalSpeech。请参阅 NaturalSpeech
致谢
- 这是基于 VITS2 的非官方仓库。
- 多语言的g2p基于 phonemizer
- 我们还感谢GhatGPT提供的写作帮助。
参考资料
- VITS2: Improving Quality and Efficiency of Single-Stage Text-to-Speech with Adversarial Learning and Architecture Design
- Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech
- YourTTS: Towards Zero-Shot Multi-Speaker TTS and Zero-Shot Voice Conversion for everyone
- NaturalSpeech: End-to-End Text to Speech Synthesis with Human-Level Quality
- A TensorFlow implementation of Google's Tacotron speech synthesis with pre-trained model (unofficial)