DiffSinger 项目介绍
DiffSinger 是一个基于 PyTorch 的项目,用于实现《DiffSinger: 歌声合成通过浅扩散机制》这篇论文中提出的模型。其中主要集中于 DiffSpeech 的实现。这个项目的目的在于通过浅扩散机制生成更加自然和流畅的歌声合成。
项目状态
- 完成了 DiffSpeech 的原始版本(但不是 DiffSinger)
- 实现了辅助解码器(源于 FastSpeech2)
- 提供了一种简单的边界预测技巧
- 实现了 DiffSpeech 的浅扩散版本,利用预训练的辅助解码器,并使用
K
作为最大时间步来训练去噪器 - 尚未实现多说话人训练
快速上手
依赖安装
可以通过以下命令安装 Python 依赖:
pip3 install -r requirements.txt
推理
你需要先下载预训练模型,并将它们放在指定的目录中,比如:
- 对于 'naive' 模型,放在
output/ckpt/LJSpeech_naive/
中。 - 对于 'shallow' 模型,放在
output/ckpt/LJSpeech_shallow/
中。
可以通过以下命令运行单个语音合成:
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
控制能力
合成的语音可以通过指定想要的音高、能量和时长比例进行个性化调整,例如:
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 个短音频剪辑的单说话人英语数据集,总计约 24 小时。
数据预处理
首先,通过以下命令准备数据:
python3 prepare_align.py --dataset DATASET
使用 Montreal 强制对齐器 获取音素序列和语音的对齐数据。
训练过程
可以训练三种模型:'naive'、'aux' 和 'shallow'。下面是训练每种模型的命令:
- Naive 版本:
python3 train.py --model naive --dataset DATASET
- 辅助解码器(为 Shallow 版本准备):
python3 train.py --model aux --dataset DATASET
- Shallow 版本:
python3 train.py --model shallow --restore_step RESTORE_STEP --dataset DATASET
需要在辅助模型训练结束后,设置 restore_step
为最后一步的检查点编号。
结果分析
可以使用以下命令查看 TensorBoard 上的训练曲线、谱图和对应音频:
tensorboard --logdir output/log/LJSpeech
通过 TensorBoard,可以更直观地观察训练过程和模型性能变化。
相关说明
- DiffSpeech 的 naive 版本学习参数数量为 27.767M,与原论文中的 27.722M 基本一致。
- 对于当前的实现,浅扩散的边界值预测为 100,与 naive 的完整时间步一致,这意味着在扩散步骤上没有优势。
- 推荐使用 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}}
}