Comprehensive-Transformer-TTS - PyTorch实现
基于非自回归Transformer的TTS,支持一系列具有监督和无监督时长建模的最新Transformer家族。该项目与研究社区共同成长,旨在实现终极TTS。欢迎对最佳非自回归TTS提出任何建议 :)
Transformers
- Fastformer: Additive Attention Can Be All You Need (Wu等, 2021)
- Long-Short Transformer: Efficient Transformers for Language and Vision (Zhu等, 2021)
- Conformer: Convolution-augmented Transformer for Speech Recognition (Gulati等, 2020)
- Reformer: The Efficient Transformer (Kitaev等, 2020)
- Attention Is All You Need (Vaswani等, 2017)
韵律建模 (WIP)
- DelightfulTTS: The Microsoft Speech Synthesis System for Blizzard Challenge 2021 (Liu等, 2021)
- Rich Prosody Diversity Modelling with Phone-level Mixture Density Network (Du等, 2021)
监督时长建模
无监督时长建模
-
One TTS Alignment To Rule Them All (Badlani等, 2021): 我们终于摆脱了诸如MFA的外部对齐工具!以下为LJ014-0329至70K的验证对齐示例。
在LJSpeech上的Transformer性能比较 (1 TITAN RTX 24G / 16批次大小)
模型 | 内存使用 | 训练时间 (1千步) |
---|---|---|
Fastformer (lucidrains') | 10531MiB / 24220MiB | 4分25秒 |
Fastformer (wuch15's) | 10515MiB / 24220MiB | 4分45秒 |
Long-Short Transformer | 10633MiB / 24220MiB | 5分26秒 |
Conformer | 18903MiB / 24220MiB | 7分4秒 |
Reformer | 10293MiB / 24220MiB | 10分16秒 |
Transformer | 7909MiB / 24220MiB | 4分51秒 |
Transformer_fs2 | 11571MiB / 24220MiB | 4分53秒 |
通过切换构建块的类型
# 在model.yaml中
block_type: "transformer_fs2" # ["transformer_fs2", "transformer", "fastformer", "lstransformer", "conformer", "reformer"]
通过切换韵律建模的类型
# 在model.yaml中
prosody_modeling:
model_type: "none" # ["none", "du2021", "liu2021"]
通过切换时长建模的类型
# 在model.yaml中
duration_modeling:
learn_alignment: True # 无监督建模为True,监督建模为False
快速开始
数据集指的是以下文件中的LJSpeech
和VCTK
等数据集名称。
依赖
您可以使用以下命令安装Python依赖:
pip3 install -r requirements.txt
另外,提供了适用于Docker
用户的Dockerfile
。
推理
您需要下载预训练模型并将它们放在output/ckpt/DATASET/
目录下。这些模型在使用"transformer_fs2"构建块的无监督时长建模下进行训练。
对于单发音人TTS,运行以下命令:
python3 synthesize.py --text "YOUR_DESIRED_TEXT" --restore_step RESTORE_STEP --mode single --dataset DATASET
对于多发音人TTS,运行以下命令:
python3 synthesize.py --text "YOUR_DESIRED_TEXT" --speaker_id SPEAKER_ID --restore_step RESTORE_STEP --mode single --dataset DATASET
学习到的发音人字典可以在preprocessed_data/DATASET/speakers.json
中找到,生成的语句将放在output/result/
目录中。
批量推理
也支持批量推理,尝试以下命令:
python3 synthesize.py --source preprocessed_data/DATASET/val.txt --restore_step RESTORE_STEP --mode batch --dataset DATASET
以合成preprocessed_data/DATASET/val.txt
中的所有语句。
可控性
通过指定所需的音高/能量/时长比率,可以控制合成语句的音高/音量/讲话速度。 例如,您可以通过以下命令将讲话速度增加20%,将音量减少20%:
python3 synthesize.py --text "YOUR_DESIRED_TEXT" --restore_step RESTORE_STEP --mode single --dataset DATASET --duration_control 0.8 --energy_control 0.8
对于多发音人TTS,添加***--speaker_id SPEAKER_ID***。
训练
数据集
支持的数据集有:
- LJSpeech: 一个单发音人英语数据集,由一名女性发音人朗读7本非虚构书籍中的段落的13,100个短音频片段组成,总共约24小时。
- VCTK: CSTR VCTK语料库包含由110位英语发音人(多发音人TTS),具有各种口音的语言数据。每位发音人朗读大约400句,从报纸、彩虹段落和用于语音口音档案的诱导段落中选取的句子。
任何单发音人TTS数据集(例如,Blizzard Challenge 2013)和多发音人TTS数据集(例如,LibriTTS)都可以按照LJSpeech和VCTK的方法添加。此外,还可以根据这里适应自己的语言和数据集。
预处理
-
对于带有外部发音人嵌入的多发音人TTS,下载ResCNN Softmax+Triplet预训练模型用于发音人嵌入,并将其放在
./deepspeaker/pretrained_models/
目录中。 -
运行以下命令进行一些准备工作:
python3 prepare_align.py --dataset DATASET
对于强制对齐,Montreal Forced Aligner (MFA) 用于获取语句与音素序列之间的对齐。 预提取对齐文件在这里提供。 您需要将文件解压在
preprocessed_data/DATASET/TextGrid/
目录中。或者,您可以自己运行对齐程序。之后,通过运行预处理脚本:
python3 preprocess.py --dataset DATASET
训练
通过以下命令训练您的模型:
python3 train.py --dataset DATASET
有用的选项:
- 若使用自动混合精度,在上述命令后追加
--use_amp
参数。 - 训练器假设单节点多GPU训练。如需使用特定GPU,在上述命令开始前指定
CUDA_VISIBLE_DEVICES=<GPU_IDs>
。
TensorBoard
使用以下命令:
tensorboard --logdir output/log
在本地服务器上使用TensorBoard。 显示损失曲线,合成的梅尔频谱图和音频。
LJSpeech
VCTK
消融研究
ID | 模型 | 模块类型 | 音高调节 |
---|---|---|---|
1 | LJSpeech_transformer_fs2_cwt | transformer_fs2 | 连续小波变换 |
2 | LJSpeech_transformer_cwt | transformer | 连续小波变换 |
3 | LJSpeech_transformer_frame | transformer | 帧级f0 |
4 | LJSpeech_transformer_ph | transformer | 音素级f0 |
观察:
- 改变构建模块(ID 1~2):"transformer_fs2" 在内存使用和模型大小方面似乎更优化,因此训练时间和mel损失有所减少。然而,输出质量没有显著提高,有时 "transformer" 模块生成的语音的音高轮廓比 "transformer_fs2" 更稳定。
- 改变音高调节(ID 2~4):在音频质量(音高稳定性)和表现力之间存在权衡。
- 音频质量:"ph" >= "frame" > "cwt"
- 表现力:"cwt" > "frame" > "ph"
备注
- 在有监督和无监督时长建模中,音素级和帧级方差均被支持。
- 请注意,在无监督时长建模中,没有预先提取的音素级方差特征。
- 在音素级无监督时长建模中,由于运行时会激活额外的音素级方差计算,因此耗时比帧级更长。
- 多说话人TTS 设置下的嵌入有两种选择:从头开始训练说话人嵌入器或使用预训练的 philipperemy's DeepSpeaker 模型(如 STYLER 所做的)。您可以通过配置(在
'none'
和'DeepSpeaker'
之间)进行切换。 - VCTK 数据集上的 DeepSpeaker 显示了说话人之间的明确区分。下图显示了提取的说话人嵌入的T-SNE图。
- 对于声码器,HiFi-GAN 和 MelGAN 均被支持。
更新日志
-
2022年3月5日 (v0.2.1): 修复并更新代码库和预训练模型,附带演示样本
- 修复方差适配器,使其适用于所有构建模块和方差类型/级别的组合
- 更新预训练模型,包含在 "transformer_fs2" 构建模块和 "cwt" 音高调节下的 LJSpeech 和 VCTK 的演示样本
- 分享对比 "transformer" 与 "transformer_fs2" 结合三种音高调节方式("frame"、"ph" 和 "cwt")的消融研究结果
-
2022年2月18日 (v0.2.0): 更新数据预处理器和方差适配器及损失,遵循 keonlee9420's DiffSinger / 增加多种韵律建模方法
- 在预处理器中准备了两种不同类型的数据管道,以最大化无监督/有监督时长建模
- 采用小波用于音高建模和损失
- 添加细化的时长损失
- 应用
var_start_steps
以实现更好的模型收敛,尤其是在无监督时长建模下 - 移除能量建模对音高方差的依赖
- 添加 "transformer_fs2" 构建模块,该模块更接近原始的 FastSpeech2 论文
- 添加两种韵律建模方法
- 验证集上的损失比较:
- LJSpeech - 蓝色: v0.1.1 / 绿色: v0.2.0
- VCTK - 天蓝色: v0.1.1 / 橙色: v0.2.0
-
2021年9月21日 (v0.1.1): 使用 ming024's FastSpeech2 初始化
引用
请通过关于部分(主页面右上角)的 "引用此存储库" 引用此存储库。
参考
- ming024's FastSpeech2
- wuch15's Fastformer
- lucidrains' fast-transformer-pytorch
- lucidrains' long-short-transformer
- sooftware's conformer
- lucidrains' reformer-pytorch
- sagelywizard's pytorch-mdn
- keonlee9420's Robust_Fine_Grained_Prosody_Control
- keonlee9420's Cross-Speaker-Emotion-Transfer
- keonlee9420's DiffSinger
- NVIDIA's NeMo: 特别感谢 Onur Babacan 和 Rafael Valle 对无监督时长建模的贡献。