ParallelWaveGAN:PyTorch实现多种非自回归神经声码器,支持实时语音合成

Unofficial Parallel WaveGAN (+ MelGAN & Multi-band MelGAN & HiFi-GAN & StyleMelGAN) with Pytorch

分支3Tags19
当前项目代码仓暂无内容

Parallel WaveGAN 实现使用 Pytorch

Open In Colab

本仓库提供了以下模型的 非官方 Pytorch 实现:

您可以结合这些最先进的非自回归模型来构建您自己的优质合成器!

请查看我们的演示网站中的示例。

图片来源:https://arxiv.org/pdf/1910.11480.pdf

这个仓库的目标是提供与 ESPnet-TTS 兼容的实时神经声码器。此外,此仓库可以与基于 NVIDIA/tacotron2 的实现结合使用(见 此评论)。

您可以在 Google Colab 中体验实时端到端的文本转语音和歌唱合成演示!

  • 使用 ESPnet2 的实时演示 Open In Colab
  • 使用 ESPnet1 的实时演示 Open In Colab
  • 使用 Muskits 的实时演示 Open In Colab

最新更新

  • 2023/08/17 提供了 LibriTTS-R 配方!
  • 2022/02/27 支持歌唱语音合成器,如 [egs/{kiritan, opencpop, oniku_kurumi_utagoe_db, ofuton_p_utagoe_db, csd, kising}/voc1]
  • 2021/10/21 提供单发音人韩语配方 [egs/kss/voc1]。
  • 2021/08/24 增加更多预训练的 StyleMelGAN 和 HiFi-GAN 模型。
  • 2021/08/07 添加 StyleMelGAN 和 HiFi-GAN 的初始预训练模型。
  • 2021/08/03 支持 StyleMelGAN 的生成器和判别器!
  • 2021/08/02 支持 HiFi-GAN 的生成器和判别器!
  • 2020/10/07 提供 JSSS 配方!
  • 2020/08/19 可用带有 ESPnet2 的实时演示!
  • 2020/05/29 提供 VCTK, JSUT, 和 CSMSC 多频段梅尔GAN的预训练模型!
  • 2020/05/27 提供新的 LJSpeech 多频段梅尔GAN预训练模型!
  • 2020/05/24 提供 LJSpeech 全频段梅尔GAN预训练模型!
  • 2020/05/22 提供 LJSpeech 多频段梅尔GAN预训练模型!
  • 2020/05/16 推出 多频段梅尔GAN
  • 2020/03/25 提供 LibriTTS 预训练模型!
  • 2020/03/17 提供 TensorFlow 转换示例笔记本(感谢 @dathudeptrai!)
  • 2020/03/16 提供 LibriTTS 配方!
  • 2020/03/12 提供 PWG G + MelGAN D + STFT-loss 示例!
  • 2020/03/12 发布多说话人英语配方 [egs/vctk/voc1]!
  • 2020/02/22 提供 MelGAN G + MelGAN D + STFT-loss 示例!
  • 2020/02/12 支持 MelGAN 的判别器!
  • 2020/02/08 支持 MelGAN 的生成器!

系统要求

本仓库已在配备 GPU Titan V 的 Ubuntu 20.04 上进行了测试。

  • Python 3.8 或更高版本
  • CUDA 11.0 或更高版本
  • CuDNN 8 或更高版本
  • NCCL 2+(用于分布式多 GPU 训练)
  • libsndfile(可以通过在 Ubuntu 上运行 sudo apt install libsndfile-dev 安装)
  • jq(可以通过在 Ubuntu 上运行 sudo apt install jq 安装)
  • sox(可以通过在 Ubuntu 上运行 sudo apt install sox 安装)

其他 CUDA 版本可能也能工作,但未经过显式测试。所有代码都在 Pytorch 1.8.1, 1.9, 1.10.2, 1.11.0, 1.12.1, 1.13.1, 2.0.1 和 2.1.0 上进行了测试。

设置

您可以从两种安装方法中选择一种。

A. 使用 pip

$ git clone https://github.com/kan-bayashi/ParallelWaveGAN.git
$ cd ParallelWaveGAN
$ pip install -e .
# 如果需要使用分布式训练,请手动按照以下链接安装 apex:
$ ...

请注意您的 CUDA 版本必须与用于 Pytorch二进制文件的版本完全匹配才能安装 apex。要安装使用不同 CUDA 版本编译的 Pytorch,请参阅 tools/Makefile

B. 创建虚拟环境

$ git clone https://github.com/kan-bayashi/ParallelWaveGAN.git
$ cd ParallelWaveGAN/tools
$ make
# 若要使用分布式训练,请运行以下命令安装 apex:
$ make apex

注意我们指定了用于编译 Pytorch 轮子的 CUDA 版本。如果您想使用不同的 CUDA 版本,请检查 tools/Makefile 来更改要安装的 Pytorch 轮子。

配方

该仓库提供了与 Kaldi 风格类似的食谱,就像 ESPnet 一样。目前支持以下食谱:

  • LJSpeech:英文女性发音人
  • JSUT:日文女性发音人
  • JSSS:日文女性发音人
  • CSMSC:普通话女性发音人
  • CMU Arctic:英语发音人
  • JNAS:日语多发音人
  • VCTK:英语多发音人
  • LibriTTS:英语多发音人
  • LibriTTS-R:通过语音恢复增强的英语多发音人。
  • YesNo:英语发音人(用于调试)
  • KSS:韩国单一女性发音人
  • Oniku_kurumi_utagoe_db/:日本单一女性歌手(歌唱声音)
  • Kiritan:日本单一男性歌手(歌唱声音)
  • Ofuton_p_utagoe_db:日本单一女性歌手(歌唱声音)
  • Opencpop:单一普通话女性歌手(歌唱声音)
  • CSD:单一韩语/英语女性歌手(歌唱声音)
  • KiSing:单一普通话女性歌手(歌唱声音)

要运行配方,请遵循以下指示。

# 进入配方目录
$ cd egs/ljspeech/voc1

# 从头开始运行配方
$ ./run.sh

# 通过命令行更改配置
$ ./run.sh --conf <你的自定义 YAML 配置>

# 指定起始和停止阶段
$ ./run.sh --stage 2 --stop_stage 2

# 如果你想指定 GPU
$ CUDA_VISIBLE_DEVICES=1 ./run.sh --stage 2

# 如果你想从 10000 步的检查点恢复训练
$ ./run.sh --stage 2 --resume <路径>/<到>/checkpoint-10000steps.pkl

有关食谱的更多信息,请参阅 此 README

速度

解码速度在使用 TITAN V 显卡时达到 RTF(实时率)为 0.016,远超实时处理的速度。

[decode]: 100%|██████████| 250/250 [00:30<00:00,  8.31it/s, RTF=0.0156]
2019-11-03 09:07:40,480 (decode:127) INFO: 完成了250个语音片段的生成(RTF = 0.016)。

即使在CPU(Intel(R) Xeon(R) Gold 6154 @ 3.00GHz,16线程)上运行,也能够实现接近或低于实时的生成速度。

[decode]: 100%|██████████| 250/250 [22:16<00:00,  5.35s/it, RTF=0.841]
2019-11-06 09:04:56,697 (decode:129) INFO: 完成了250个语音片段的生成(RTF = 0.734)。

采用MelGAN生成器时,解码速度会进一步加快。

# 在CPU (Intel(R) Xeon(R) Gold 6154 CPU @ 3.00GHz, 16 threads)
[decode]: 100%|██████████| 250/250 [04:00<00:00,  1.04it/s, RTF=0.0882]
2020-02-08 10:45:14,111 (decode:142) INFO: 完成生成了250个语音片段(RTF = 0.137)。

# 在GPU (TITAN V)
[decode]: 100%|██████████| 250/250 [00:06<00:00, 36.38it/s, RTF=0.00189]
2020-02-08 05:44:42,231 (decode:142) INFO: 完成生成了250个语音片段(RTF = 0.002)。

若使用多带MelGAN生成器,解码速度会极大提升。

# 在CPU (Intel(R) Xeon(R) Gold 6154 CPU @ 3.00GHz, 16 threads)
[decode]: 100%|██████████| 250/250 [01:47<00:00,  2.95it/s, RTF=0.048]
2020-05-22 15:37:19,771 (decode:151) INFO: 完成生成了250个语音片段(RTF = 0.059)。

# 在GPU (TITAN V)
[decode]: 100%|██████████| 250/250 [00:05<00:00, 43.67it/s, RTF=0.000928]
2020-05-22 15:35:13,302 (decode:151) INFO: 完成生成了250个语音片段(RTF = 0.001)。

如果需要进一步加速推理过程,尝试将PyTorch模型转换为TensorFlow是值得的。转换示例可在这个笔记本中找到(由@dathudeptrai提供)。

结果概览

以下是结果的汇总表。您可以通过链接访问样本并下载预训练模型。

模型名称 配置文件链接 语言 采样率 [Hz] Mel频谱范围 [Hz] FFT/跳帧/Hann窗大小 [点] 迭代次数
ljspeech_parallel_wavegan.v1 链接 英语 22.05k 80-7600 1024 / 256 / None 400k
ljspeech_parallel_wavegan.v1.long 链接 英语 22.05k 80-7600 1024 / 256 / None 1M
... [其他模型列表省略] ... ... ... ... ... ... ...

每个模型都提供了性能指标和配置详细信息,以及可直接访问的预训练模型资源。

模型名称 下载链接 语言 采样率 频率范围 参数配置(时间步/声道/时长) 模型大小
csmsc_style_melgan.v1 配置文件 中文 24kHz 80Hz-7600Hz 2048 / 300 / 1200 1.5MB
arctic_slt_parallel_wavegan.v1 配置文件 英语 16kHz 80Hz-7600Hz 1024 / 256 / - 400KB
jnas_parallel_wavegan.v1 配置文件 日语 16kHz 80Hz-7600Hz 1024 / 256 / - 400KB
vctk_parallel_wavegan.v1 配置文件 英语 24kHz 80Hz-7600Hz 2048 / 300 / 1200 400KB
vctk_parallel_wavegan.v1.long 配置文件 英语 24kHz 80Hz-7600Hz 2048 / 300 / 1200 1MB
vctk_multi_band_melgan.v2 配置文件 英语 24kHz 80Hz-7600Hz 2048 / 300 / 1200 1MB
vctk_hifigan.v1 配置文件 英语 24kHz 80Hz-7600Hz 2048 / 300 / 1200 2.5MB
...(其余模型信息相同格式)...

访问我们的Google Drive获取更多结果。在使用预训练模型之前,请务必检查数据库的许可,以确保其适用于商业用途。作者不对因使用模型导致的损失或与数据集使用的法律纠纷承担责任。

如何使用预训练模型

分析与综合

以下是使用预训练模型执行分析与综合的最小代码示例。

# 确保已安装`parallel_wavegan`
# 如果没有,请通过pip安装
$ pip install parallel_wavegan

# 可以从终端下载预训练模型
$ python -c "
from parallel_wavegan.utils import download_pretrained_model
download_pretrained_model('<预训练模型标记>', 'pretrained_model')
"

# 获取所有可用的预训练模型:
$ python -c "
from parallel_wavegan.utils import PRETRAINED_MODEL_LIST
print(PRETRAINED_MODEL_LIST.keys())
"

# 下载的预训练模型位于`pretrained_model/<预训练模型标记>/`下
$ ls pretrained_model/<预训练模型标记>/
checkpoint-400000steps.pkl  config.yml  stats.h5

# 这些文件也可以根据上述结果手动下载

# 将音频文件放入`sample`目录中以便进行分析与综合
$ ls sample/
sample.wav

# 执行特征提取 -> 特征标准化 -> 合成
$ parallel-wavegan-preprocess \
    --config pretrained_model/<预训练模型标记>/config.yml \
    --rootdir sample \
    --dumpdir dump/sample/raw
100%|██████████████████████████████████████| 1/1 [00:00<00:00, 914.19it/s]
$ parallel-wavegan-normalize \
    --config pretrained_model/<预训练模型标记>/config.yml \
    --rootdir dump/sample/raw \
    --dumpdir dump/sample/norm \
    --stats pretrained_model/<预训练模型标记>/stats.h5
2019-11-13 13:44:29,574 (normalize:87) INFO: 文件数量 = 1.
100%|██████████████████████████████████████| 1/1 [00:00<00:00, 513.13it/s]
$ parallel-wavegan-decode \
    --checkpoint pretrained_model/<预训练模型标记>/checkpoint-400000steps.pkl \
    --dumpdir dump/sample/norm \
    --outdir sample
2019-11-13 13:44:31,229 (decode:91) INFO: 待解码的特征数量 = 1.
[decode]: 100%|███████████████████| 1/1 [00:00<00:00, 18.33it/s, RTF=0.0146]
2019-11-13 13:44:37,132 (decode:129) INFO: 完成1个utterance的生成(RTF = 0.015)。

# 跳过标准化步骤(即时标准化,特征提取->合成)
$ parallel-wavegan-preprocess \
    --config pretrained_model/<预训练模型标记>/config.yml \
    --rootdir sample \
    --dumpdir dump/sample/raw
100%|██████████████████████████████████████| 1/1 [00:00<00:00, 914.19it/s]
$ parallel-wavegan-decode \
    --checkpoint pretrained_model/<预训练模型标记>/checkpoint-400000steps.pkl \
    --dumpdir dump/sample/raw \
    --normalize-before \
    --outdir sample
2019-11-13 13:44:31,229 (decode:91) INFO: 待解码的特征数量 = 1.
[decode]: 100%|███████████████████| 1/1 [00:00<00:00, 18.33it/s, RTF=0.0146]
2019-11-13 13:44:37,132 (decode:129) INFO: 完成1个utterance的生成(RTF = 0.015)。

# 已生成的语音可以找到在`sample`目录下
$ ls sample
sample.wav  sample_gen.wav

使用ESPnet-TTS模型特征解码

接下来展示如何用由ESPnet-TTS模型产生的特征生成波形。

# 确认您已完成ESPnet-TTS的食谱运行。
# 文本转梅尔谱和梅尔谱转波形的模型都需使用相同的特征设置。
# 进入“ESPnet”食谱目录
$ cd /路径/to/espnet/egs/<配方名>/tts1
$ pwd
/路径/to/espnet/egs/<配方名>/tts1

# 若使用ESPnet2,则进入`egs2/`目录
$ cd /路径/to/espnet/egs2/<配方名>/tts1
$ pwd
/路径/to/espnet/egs2/<配方名>/tts1

# 在ESPnet Conda环境(或虚拟环境)中安装此仓库
$ source ./path.sh && pip install -U parallel_wavegan

# 从终端下载预训练模型
$ python -c "
from parallel_wavegan.utils import download_pretrained_model
download_pretrained_model('<预训练模型标记>', 'pretrained_model')
"

# 获取所有可用的预训练模型列表
$ python -c "
from parallel_wavegan.utils import PRETRAINED_MODEL_LIST
print(PRETRAINED_MODEL_LIST.keys())
"

# 下载的预训练模型位于`pretrained_model/<预训练模型标记>/`
$ ls pretrained_model/<预训练模型标记>/
checkpoint-400000steps.pkl  config.yml  stats.h5

案例1: 如果Text2Mel和Mel2Wav使用相同的数据集

# 此情况下,可以直接使用生成的特征进行解码。
# 指定`feats.scp`路径,其位于exp/<您的模型目录>/outputs_*_decode/<集合名称>/feats.scp。
# 注意不使用de_norm版本的特征,因为PWG需要的是归一化后的特征。
$ parallel-wavegan-decode \
    --checkpoint pretrained_model/<预训练模型标记>/checkpoint-400000steps.pkl \
    --feats-scp exp/<您的模型目录>/outputs_*_decode/<集合名称>/feats.scp \
    --outdir 输出路径

# 对于ESPnet2,生成的特征可以在
# exp/<您的模型目录>/decode_*/<集合名称>/norm/feats.scp找到。
$ parallel-wavegan-decode \
    --checkpoint pretrained_model/<预训练模型标记>/checkpoint-400000steps.pkl \
    --feats-scp exp/<您的模型目录>/decode_*/<集合名称>/norm/feats.scp \
    --outdir 输出路径

# 生成的波形可以在<输出路径>/找到
$ ls 输出路径/
utt_id_1_gen.wav  utt_id_2_gen.wav  ...  utt_id_N_gen.wav

案例2: 如果Text2Mel和Mel2Wav使用不同的数据集

# 这种情况需额外提供`--normalize-before`选项。
# 并且使用去归一化生成特征的`feats.scp`。

# ESPnet1的情况
$ parallel-wavegan-decode \
    --checkpoint pretrained_model/<预训练模型标记>/checkpoint-400000steps.pkl \
    --feats-scp exp/<您的模型目录>/outputs_*_decode_denorm/<集合名称>/feats.scp \
    --outdir 输出路径 \
    --normalize-before

# ESPnet2的情况
$ parallel-wavegan-decode \
    --checkpoint pretrained_model/<预训练模型标记>/checkpoint-400000steps.pkl \
    --feats-scp exp/<您的模型目录>/decode_*/<集合名称>/denorm/feats.scp \
    --outdir 输出路径 \
    --normalize-before

# 生成的波形可以在<输出路径>/找到
$ ls 输出路径/
utt_id_1_gen.wav  utt_id_2_gen.wav  ...  utt_id_N_gen.wav

如果您想在Python中结合这些模型,可以尝试在Google Colab上的实时演示!

  • ESPnet2实时演示 Open In Colab
  • ESPnet1实时演示 Open In Colab

使用保存的npy文件解码

有时我们希望直接解码由TTS模型生成的梅尔频谱npy文件。确保使用了与预训练声码器相同的特征提取设置(例如采样率fs、窗口大小fft_size、跳数hop_size、窗长win_length、最小频率fmin和最大频率fmax)。仅log_base的不同可以通过后续处理来调整(我们默认使用对数10而非自然对数)。 详细信息见相关评论

# 生成梅尔频谱的假npy文件
$ ipython
[ins] In [1]: import numpy as np
[ins] In [2]: x = np.random.randn(512, 80)  # (#帧, #mel维度)
[ins] In [3]: np.save("dummy_1.npy", x)
[ins] In [4]: y = np.random.randn(256, 80)  # (#帧, #mel维度)
[ins] In [5]: np.save("dummy_2.npy", y)
[ins] In [6]: exit

# 创建scp文件(键-路径格式)
$ find -name "*.npy" | awk '{print "dummy_" NR " " $1}' > feats.scp

# 查看(<utt_id> <路径>)
$ cat feats.scp
dummy_1 ./dummy_1.npy
dummy_2 ./dummy_2.npy

# 不进行特征标准化的解码
# 假设输入的梅尔频谱已经按照预训练模型的统计信息进行了归一化。
$ parallel-wavegan-decode \
    --checkpoint /路径/to/checkpoint-400000steps.pkl \
    --feats-scp ./feats.scp \
    --outdir wav
2021-08-10 09:13:07,624 (decode:140) INFO: 待解码的特征数量 = 2。
[decode]: 100%|██████████████████████████████████████| 2/2 [00:00<00:00, 13.84it/s, RTF=0.00264]
2021-08-10 09:13:29,660 (decode:174) INFO: 完成2个utterance的生成(RTF = 0.005)。

# 进行特征标准化的解码
# 当输入的梅尔频谱未被标准化时使用。
$ parallel-wavegan-decode \
    --checkpoint /路径/to/checkpoint-400000steps.pkl \
    --feats-scp ./feats.scp \
    --normalize-before \
    --outdir wav
2021-08-10 09:13:07,624 (decode:140) INFO: 待解码的特征数量 = 2。
[decode]: 100%|██████████████████████████████████████| 2/2 [00:00<00:00, 13.84it/s, RTF=0.00264]
2021-08-10 09:13:29,660 (decode:174) INFO: 完成2个utterance的生成(RTF = 0.005)。

注意事项

  • 预训练模型的使用条款遵循各自用于训练的语料库的规定,请自行仔细检查。
  • 一部分代码源自ESPnet和Kaldi,它们基于Apache-2.0许可协议。

参考文献

致谢

作者衷心感谢山本龙一(@r9y9),其优秀的仓库、论文以及宝贵的讨论做出了重要贡献。

作者

林智喜(@kan-bayashi)
电子邮件: hayashi.tomoki<at>nagoya-u.ac.jp>

项目介绍

Unofficial Parallel WaveGAN (+ MelGAN & Multi-band MelGAN & HiFi-GAN & StyleMelGAN) with Pytorch

定制我的领域
451.65 K353访问 GitHub