DiffSinger - PyTorch 实现
基于 PyTorch 实现的 DiffSinger: 通过浅扩散机制的歌声合成 (专注于 DiffSpeech)。
仓库状态
- DiffSpeech 简单版本(不是 DiffSinger)
- 辅助解码器(来自 FastSpeech2)
- 较简单的边界预测技巧
K
- 浅扩散机制的 DiffSpeech 版本:利用预训练的辅助解码器 + 使用
K
作为最大时间步训练降噪器 - 多说话者训练
快速开始
DATASET 在以下文档中指数据集名称,如 LJSpeech
。
MODEL 指模型类型(从 'naive'、'aux'、'shallow' 中选择)。
依赖项
你可以使用以下命令安装 Python 依赖项
pip3 install -r requirements.txt
推理
你需要下载预训练模型,并将它们放在
- 对于 'naive' 模型,放在
output/ckpt/LJSpeech_naive/
。 - 对于 'shallow' 模型,放在
output/ckpt/LJSpeech_shallow/
。请注意,'shallow' 模型的检查点包含 'shallow' 和 'aux' 模型,这两个模型在整个过程中将共享除结果外的所有目录。
对于英语单说话者 TTS,运行
python3 synthesize.py --text "YOUR_DESIRED_TEXT" --model MODEL --restore_step RESTORE_STEP --mode single --dataset DATASET
生成的语句将放在 output/result/
目录下。
批量推理
支持批量推理,尝试运行
python3 synthesize.py --source preprocessed_data/LJSpeech/val.txt --model MODEL --restore_step RESTORE_STEP --mode batch --dataset DATASET
以合成 preprocessed_data/LJSpeech/val.txt
中的所有语句。
可控性
合成语句的音高/音量/语速可以通过指定所需的音高/能量/持续时间比率来控制。 例如,一个人可以通过以下方式将语速提高 20%,并将音量减少 20%:
python3 synthesize.py --text "YOUR_DESIRED_TEXT" --model MODEL --restore_step RESTORE_STEP --mode single --dataset DATASET --duration_control 0.8 --energy_control 0.8
请注意,可控性来自于 FastSpeech2,而非 DiffSpeech 的主要关注点。
训练
数据集
支持的数据集有:
- LJSpeech:一个单说话者英语数据集,包括 13100 个女性说话者从 7 本非小说书籍中摘录的短音频片段,总时长约 24 小时。
预处理
首先运行
python3 prepare_align.py --dataset DATASET
进行一些准备工作。
对于强制对齐,Montreal 强制对齐器(MFA)用于获取语句与音素序列之间的对齐。
提供了预提取的对齐文件,见这里。
你需要将文件解压到 preprocessed_data/DATASET/TextGrid/
。或者,你可以自己运行对齐器。
然后,运行预处理脚本
python3 preprocess.py --dataset DATASET
训练
你可以训练三种类型的模型:'naive'、'aux' 和 'shallow'。
-
训练简单版本('naive'):
使用以下命令训练简单版本:
python3 train.py --model naive --dataset DATASET
-
为浅版本训练辅助解码器('aux'):
若要训练浅版本,我们需要一个预训练的 FastSpeech2。以下命令将让你训练 FastSpeech2 模块,包括辅助解码器。
python3 train.py --model aux --dataset DATASET
-
较简单的边界预测技巧:
若要从我们的验证数据集中获取边界
K
,你可以使用以下命令运行使用预训练辅助 FastSpeech2 的边界预测器。python3 boundary_predictor.py --restore_step RESTORE_STEP --dataset DATASET
它将在命令日志中打印出预测值(例如,
K_STEP
)。然后,按如下所示设置配置文件中的预测值:
# 在 model.yaml 中 denoiser: K_step: K_STEP
请注意,这基于附录 B 中介绍的技巧。
-
训练浅版本('shallow'):
若要利用预训练的 FastSpeech2,包括辅助解码器,你必须将
restore_step
设置为辅助 FastSpeech2 训练的最后步骤,如以下命令所示:python3 train.py --model shallow --restore_step RESTORE_STEP --dataset DATASET
例如,如果辅助训练期间的最后检查点保存在 160000 步,你必须将
restore_step
设置为160000
。然后它将加载 aux 模型,并在浅训练机制下继续训练。
TensorBoard
使用
tensorboard --logdir output/log/LJSpeech
在本地主机上启动 TensorBoard。 显示损失曲线、合成的梅尔谱图和音频。
简单扩散
浅扩散
损失对比
注意事项
- (DiffSpeech 简单版本)可学习参数数量为
27.767M
,与原论文的27.722M
类似。 - 不幸的是,当前实现浅扩散的 LJSpeech 预测边界是
100
,这是简单扩散的完整时间步,因此在扩散步骤上没有优势。 - 使用 HiFi-GAN 而非 Parallel WaveGAN (PWG) 进行声码处理。
引用
@misc{lee2021diffsinger,
author = {Lee, Keon},
title = {DiffSinger},
year = {2021},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/keonlee9420/DiffSinger}}
}
参考资料
- MoonInTheRiver 的 DiffSinger (作者代码库)
- ming024 的 FastSpeech2 (2021.02.26 版本之后)
- hojonathanho 的 diffusion
- lmnt-com 的 diffwave