You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PaddleSpeech/examples/opencpop/svs1/README_cn.md

14 KiB

(简体中文|English)

用 Opencpop 数据集训练 DiffSinger 模型

本用例包含用于训练 DiffSinger 模型的代码,使用 Mandarin singing corpus 数据集。

数据集

下载并解压

官方网站 下载数据集

pip 安装

pip install huggingface_hub==0.25.2

开始

假设数据集的路径是 ~/datasets/Opencpop. 运行下面的命令会进行如下操作:

  1. 设置原路径
  2. 对数据集进行预处理。
  3. 训练模型
  4. 合成波形
    • metadata.jsonl 合成波形。
    • (支持中)从文本文件合成波形。
  5. (支持中)使用静态模型进行推理。
./run.sh

您可以选择要运行的一系列阶段,或者将 stage 设置为 stop-stage 以仅使用一个阶段,例如,运行以下命令只会预处理数据集。

./run.sh --stage 0 --stop-stage 0

数据预处理

./local/preprocess.sh ${conf_path}

当它完成时。将在当前目录中创建 dump 文件夹。转储文件夹的结构如下所示。

dump
├── dev
│   ├── norm
│   └── raw
├── phone_id_map.txt
├── speaker_id_map.txt
├── test
│   ├── norm
│   └── raw
└── train
    ├── energy_stats.npy
    ├── norm
    ├── pitch_stats.npy
    ├── raw
    ├── speech_stats.npy
    └── speech_stretchs.npy

数据集分为三个部分,即 traindevtest ,每个部分都包含一个 normraw 子文件夹。原始文件夹包含每个话语的语音、音调和能量特征,而 norm 文件夹包含规范化的特征。用于规范化特征的统计数据是从 dump/train/*_stats.npy 中的训练集计算出来的。speech_stretchs.npy 中包含 mel谱每个维度上的最小值和最大值用于 diffusion 模块训练/推理前的线性拉伸。 注意:由于非 norm 特征训练效果由于 norm因此 norm 下保存的特征是未经过 norm 的特征。

此外,还有一个 metadata.jsonl 在每个子文件夹中。它是一个类似表格的文件包含话语id音色id音素、文本长度、语音长度、音素持续时间、语音特征路径、音调特征路径、能量特征路径、音调音调持续时间是否为转音。

模型训练

CUDA_VISIBLE_DEVICES=${gpus} ./local/train.sh ${conf_path} ${train_output_path}

./local/train.sh 调用 ${BIN_DIR}/train.py 。 以下是完整的帮助信息。

usage: train.py [-h] [--config CONFIG] [--train-metadata TRAIN_METADATA]
                [--dev-metadata DEV_METADATA] [--output-dir OUTPUT_DIR]
                [--ngpu NGPU] [--phones-dict PHONES_DICT]
                [--speaker-dict SPEAKER_DICT] [--speech-stretchs SPEECH_STRETCHS]

Train a DiffSinger model.

optional arguments:
  -h, --help            show this help message and exit
  --config CONFIG       diffsinger config file.
  --train-metadata TRAIN_METADATA
                        training data.
  --dev-metadata DEV_METADATA
                        dev data.
  --output-dir OUTPUT_DIR
                        output dir.
  --ngpu NGPU           if ngpu=0, use cpu.
  --phones-dict PHONES_DICT
                        phone vocabulary file.
  --speaker-dict SPEAKER_DICT
                        speaker id map file for multiple speaker model.
  --speech-stretchs SPEECH_STRETCHS
                        min amd max mel for stretching.
  1. --config 是一个 yaml 格式的配置文件,用于覆盖默认配置,位于 conf/default.yaml.
  2. --train-metadata--dev-metadata 应为 dump 文件夹中 traindev 下的规范化元数据文件
  3. --output-dir 是保存结果的目录。 检查点保存在此目录中的 checkpoints/ 目录下。
  4. --ngpu 要使用的 GPU 数,如果 ngpu==0则使用 cpu 。
  5. --phones-dict 是音素词汇表文件的路径。
  6. --speech-stretchs mel的最小最大值数据的文件路径。

合成

我们使用 parallel opencpop 作为神经声码器vocoder。 从 pwgan_opencpop_ckpt_1.4.0.zip 下载预训练的 parallel wavegan 模型并将其解压。

unzip pwgan_opencpop_ckpt_1.4.0.zip

Parallel WaveGAN 检查点包含如下文件。

pwgan_opencpop_ckpt_1.4.0.zip
├── default.yaml               # 用于训练 parallel wavegan 的默认配置
├── snapshot_iter_100000.pdz   # parallel wavegan 的模型参数
└── feats_stats.npy            # 训练平行波形时用于规范化谱图的统计数据

./local/synthesize.sh 调用 ${BIN_DIR}/../synthesize.py 即可从 metadata.jsonl中合成波形。

CUDA_VISIBLE_DEVICES=${gpus} ./local/synthesize.sh ${conf_path} ${train_output_path} ${ckpt_name}
usage: synthesize.py [-h]
                     [--am {diffsinger_opencpop}]
                     [--am_config AM_CONFIG] [--am_ckpt AM_CKPT]
                     [--am_stat AM_STAT] [--phones_dict PHONES_DICT]
                     [--voc {pwgan_opencpop}]
                     [--voc_config VOC_CONFIG] [--voc_ckpt VOC_CKPT]
                     [--voc_stat VOC_STAT] [--ngpu NGPU]
                     [--test_metadata TEST_METADATA] [--output_dir OUTPUT_DIR]
                     [--speech_stretchs SPEECH_STRETCHS]

Synthesize with acoustic model & vocoder

optional arguments:
  -h, --help            show this help message and exit
  --am {speedyspeech_csmsc,fastspeech2_csmsc,fastspeech2_ljspeech,fastspeech2_aishell3,fastspeech2_vctk,tacotron2_csmsc,tacotron2_ljspeech,tacotron2_aishell3}
                        Choose acoustic model type of tts task.
       {diffsinger_opencpop} Choose acoustic model type of svs task.
  --am_config AM_CONFIG
                        Config of acoustic model.
  --am_ckpt AM_CKPT     Checkpoint file of acoustic model.
  --am_stat AM_STAT     mean and standard deviation used to normalize
                        spectrogram when training acoustic model.
  --phones_dict PHONES_DICT
                        phone vocabulary file.
  --tones_dict TONES_DICT
                        tone vocabulary file.
  --speaker_dict SPEAKER_DICT
                        speaker id map file.
  --voice-cloning VOICE_CLONING
                        whether training voice cloning model.
  --voc {pwgan_csmsc,pwgan_ljspeech,pwgan_aishell3,pwgan_vctk,mb_melgan_csmsc,wavernn_csmsc,hifigan_csmsc,hifigan_ljspeech,hifigan_aishell3,hifigan_vctk,style_melgan_csmsc}
                        Choose vocoder type of tts task.
        {pwgan_opencpop, hifigan_opencpop} Choose vocoder type of svs task.
  --voc_config VOC_CONFIG
                        Config of voc.
  --voc_ckpt VOC_CKPT   Checkpoint file of voc.
  --voc_stat VOC_STAT   mean and standard deviation used to normalize
                        spectrogram when training voc.
  --ngpu NGPU           if ngpu == 0, use cpu.
  --test_metadata TEST_METADATA
                        test metadata.
  --output_dir OUTPUT_DIR
                        output dir.
  --speech-stretchs     SPEECH_STRETCHS
                        The min and max values of the mel spectrum, using on diffusion of diffsinger.

./local/synthesize_e2e.sh 调用 ${BIN_DIR}/../synthesize_e2e.py,即可从文本文件中合成波形。 local/pinyin_to_phone.txt来源于opencpop数据集中的README表示opencpop中拼音到音素的映射。

CUDA_VISIBLE_DEVICES=${gpus} ./local/synthesize_e2e.sh ${conf_path} ${train_output_path} ${ckpt_name}
usage: synthesize_e2e.py [-h]
                         [--am {speedyspeech_csmsc,speedyspeech_aishell3,fastspeech2_csmsc,fastspeech2_ljspeech,fastspeech2_aishell3,fastspeech2_vctk,tacotron2_csmsc,tacotron2_ljspeech}]
                         [--am_config AM_CONFIG] [--am_ckpt AM_CKPT]
                         [--am_stat AM_STAT] [--phones_dict PHONES_DICT]
                         [--speaker_dict SPEAKER_DICT] [--spk_id SPK_ID]
                         [--voc {pwgan_csmsc,pwgan_ljspeech,pwgan_aishell3,pwgan_vctk,mb_melgan_csmsc,style_melgan_csmsc,hifigan_csmsc,hifigan_ljspeech,hifigan_aishell3,hifigan_vctk,wavernn_csmsc}]
                         [--voc_config VOC_CONFIG] [--voc_ckpt VOC_CKPT]
                         [--voc_stat VOC_STAT] [--lang LANG]
                         [--inference_dir INFERENCE_DIR] [--ngpu NGPU]
                         [--text TEXT] [--output_dir OUTPUT_DIR]
                         [--pinyin_phone PINYIN_PHONE]
                         [--speech_stretchs SPEECH_STRETCHS]

Synthesize with acoustic model & vocoder

optional arguments:
  -h, --help            show this help message and exit
  --am {speedyspeech_csmsc,speedyspeech_aishell3,fastspeech2_csmsc,fastspeech2_ljspeech,fastspeech2_aishell3,fastspeech2_vctk,tacotron2_csmsc,tacotron2_ljspeech}
                        Choose acoustic model type of tts task.
       {diffsinger_opencpop} Choose acoustic model type of svs task.
  --am_config AM_CONFIG
                        Config of acoustic model.
  --am_ckpt AM_CKPT     Checkpoint file of acoustic model.
  --am_stat AM_STAT     mean and standard deviation used to normalize
                        spectrogram when training acoustic model.
  --phones_dict PHONES_DICT
                        phone vocabulary file.
  --speaker_dict SPEAKER_DICT
                        speaker id map file.
  --spk_id SPK_ID       spk id for multi speaker acoustic model
  --voc {pwgan_csmsc,pwgan_ljspeech,pwgan_aishell3,pwgan_vctk,mb_melgan_csmsc,style_melgan_csmsc,hifigan_csmsc,hifigan_ljspeech,hifigan_aishell3,hifigan_vctk,wavernn_csmsc}
                        Choose vocoder type of tts task.
        {pwgan_opencpop, hifigan_opencpop} Choose vocoder type of svs task.
  --voc_config VOC_CONFIG
                        Config of voc.
  --voc_ckpt VOC_CKPT   Checkpoint file of voc.
  --voc_stat VOC_STAT   mean and standard deviation used to normalize
                        spectrogram when training voc.
  --lang LANG           {zh, en, mix, canton} Choose language type of tts task.
                        {sing} Choose language type of svs task.
  --inference_dir INFERENCE_DIR
                        dir to save inference models
  --ngpu NGPU           if ngpu == 0, use cpu.
  --text TEXT           text to synthesize file, a 'utt_id sentence' pair per line for tts task.
                        A '{ utt_id input_type (is word) text notes note_durs}' or '{utt_id input_type (is phoneme) phones notes note_durs is_slurs}' pair per line for svs task.
  --output_dir OUTPUT_DIR
                        output dir.
  --pinyin_phone PINYIN_PHONE
                        pinyin to phone map file, using on sing_frontend.
  --speech_stretchs SPEECH_STRETCHS
                        The min and max values of the mel spectrum, using on diffusion of diffsinger.
  1. --am 声学模型格式是否符合 {model_name}_{dataset}
  2. --am_config, --am_ckpt, --am_stat--phones_dict 是声学模型的参数,对应于 diffsinger 预训练模型中的 4 个文件。
  3. --voc 声码器(vocoder)格式是否符合 {model_name}_{dataset}
  4. --voc_config, --voc_ckpt, --voc_stat 是声码器的参数,对应于 parallel wavegan 预训练模型中的 3 个文件。
  5. --lang tts对应模型的语言可以是 zhenmixcanton。 svs 对应的语言是 sing
  6. --test_metadata 应为 dump 文件夹中 test 下的规范化元数据文件、
  7. --text 是文本文件,其中包含要合成的句子。
  8. --output_dir 是保存合成音频文件的目录。
  9. --ngpu 要使用的GPU数如果 ngpu==0则使用 cpu。
  10. --inference_dir 静态模型保存的目录。如果不加这一行,就不会生并保存成静态模型。
  11. --pinyin_phone 拼音到音素的映射文件。
  12. --speech_stretchs mel谱的最大最小值用于diffsinger中diffusion之前的线性拉伸。

注意: 目前 diffsinger 模型还不支持动转静,所以不要加 --inference_dir

预训练模型

预先训练的 DiffSinger 模型:

DiffSinger 检查点包含下列文件。

diffsinger_opencpop_ckpt_1.4.0.zip
├── default.yaml             # 用于训练 diffsinger 的默认配置
├── energy_stats.npy         # 训练 diffsinger 时如若需要 norm energy 会使用到的统计数据 
├── phone_id_map.txt         # 训练 diffsinger 时的音素词汇文件
├── pinyin_to_phone.txt      # 训练 diffsinger 时的拼音到音素映射文件
├── pitch_stats.npy          # 训练 diffsinger 时如若需要 norm pitch 会使用到的统计数据 
├── snapshot_iter_160000.pdz # 模型参数和优化器状态
├── speech_stats.npy         # 训练 diffsinger 时用于规范化频谱图的统计数据
└── speech_stretchs.npy      # 训练 diffusion 前用于 mel 谱拉伸的最小及最大值

您可以使用以下脚本通过使用预训练的 diffsinger 和 parallel wavegan 模型为 ${BIN_DIR}/../sentences_sing.txt 合成句子

source path.sh

FLAGS_allocator_strategy=naive_best_fit \
FLAGS_fraction_of_gpu_memory_to_use=0.01 \
python3 ${BIN_DIR}/../synthesize_e2e.py \
  --am=diffsinger_opencpop \
  --am_config=diffsinger_opencpop_ckpt_1.4.0/default.yaml \
  --am_ckpt=diffsinger_opencpop_ckpt_1.4.0/snapshot_iter_160000.pdz \
  --am_stat=diffsinger_opencpop_ckpt_1.4.0/speech_stats.npy  \
  --voc=pwgan_opencpop \
  --voc_config=pwgan_opencpop_ckpt_1.4.0/default.yaml \
  --voc_ckpt=pwgan_opencpop_ckpt_1.4.0/snapshot_iter_100000.pdz \
  --voc_stat=pwgan_opencpop_ckpt_1.4.0/feats_stats.npy \
  --lang=sing \
  --text=${BIN_DIR}/../../assets/sentences_sing.txt \
  --output_dir=exp/default/test_e2e \
  --phones_dict=diffsinger_opencpop_ckpt_1.4.0/phone_id_map.txt \
  --pinyin_phone=diffsinger_opencpop_ckpt_1.4.0/pinyin_to_phone.txt \
  --speech_stretchs=diffsinger_opencpop_ckpt_1.4.0/speech_stretchs.npy