☰
PaddleSpeech 实战:基于 CSMSC 数据集训练 HiFiGAN 神经声码器全流程指南
2026/9/25 17:03:15 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

导读

本文以 PaddleSpeech 仓库中 examples/csmsc/voc5 示例为核心,完整讲解如何在中文标准普通话语音库 CSMSC(BZNSYP)上从零训练 HiFiGAN 神经声码器,并串联 FastSpeech2 声学模型实现"文本 → 波形"的端到端语音合成。读完本文,你将掌握数据准备(含 MFA 对齐与静音裁剪)、特征预处理、GAN 声码器训练、基于 mel 谱合成波形、文本端到端合成,以及预训练模型下载与量化导出等完整技能。

HiFiGAN 与 PaddleSpeech 中的定位

HiFiGAN 是基于 GAN 的神经声码器,能够将声学模型输出的 mel 谱高效重建为高保真波形。在 PaddleSpeech 的 TTS 架构中,HiFiGAN 作为**神经声码器(neural vocoder)**位于整条链路的最末端:声学模型(如 FastSpeech2)负责生成频谱特征,声码器负责将频谱还原为可听的语音波形。仓库在 paddlespeech/t2s/models/hifigan 中提供了完整实现,核心包括:

  • HiFiGANGenerator(hifigan.py):生成器,输入 mel 谱输出波形,支持 Multi-Receptive Field Fusion(MRF)残差块与可选 iSTFTNet 变体;
  • HiFiGANMultiScaleMultiPeriodDiscriminator:判别器,多尺度 + 多周期组合;
  • HiFiGANEvaluator/HiFiGANUpdater(hifigan_updater.py):评估与训练更新逻辑。

训练入口位于 paddlespeech/t2s/exps/gan_vocoder/hifigan/train.py,预处理与合成脚本则统一放在 paddlespeech/t2s/exps/gan_vocoder 目录下(preprocess.py、normalize.py、synthesize.py),这意味着同一套预处理/合成框架同时服务于 pwgan、mb_melgan、style_melgan 等多个 GAN 声码器。

数据集准备

下载与解压 CSMSC

从 CSMSC 官方渠道下载 Chinese Standard Mandarin Speech Copus(BZNSYP)并解压到~/datasets,之后数据位于~/datasets/BZNSYP。解压后的目录结构如下:

└─ Wave └─ .wav files (audio speech) └─ PhoneLabeling └─ .interval files (alignment between phoneme and duration) └─ ProsodyLabeling └─ 000001-010000.txt (text with prosodic by pinyin)
  • Wave:语音波形文件;
  • PhoneLabeling:音素与时长对齐的 interval 文件;
  • ProsodyLabeling:带韵律标记的拼音文本标注。

获取 MFA 对齐结果并裁剪静音

本示例使用蒙特利尔强制对齐工具(MFA)的结果来裁剪音频边缘静音,以获得更干净的训练样本。有两种获取方式:

  1. 直接下载仓库官方发布的 baker 对齐结果压缩包baker_alignment_tone.tar.gz,解压后得到目录./baker_alignment_tone;
  2. 自行训练 MFA 模型,可参考仓库中的 examples/other/mfa 示例。

在 local/preprocess.sh 中,这一阶段通过 utils/gen_duration_from_textgrid.py 将 MFA 的 TextGrid 对齐结果转换为音素时长文件:

python3 ${MAIN_ROOT}/utils/gen_duration_from_textgrid.py \ --inputdir=./baker_alignment_tone \ --output=durations.txt \ --config=${config_path}

生成的durations.txt是后续特征提取(--cut-sil=True静音裁剪)的关键输入。

快速开始:run.sh 分阶段执行

进入示例目录后,假设数据集路径为~/datasets/BZNSYP、MFA 对齐结果为./baker_alignment_tone,直接运行:

./run.sh

run.sh 将依次完成 5 个阶段(stage 0 ~ 4):

Stage内容对应脚本
0数据预处理local/preprocess.sh
1训练模型local/train.sh
2从metadata.jsonl合成波形local/synthesize.sh
3从文本文件端到端合成波形local/synthesize_e2e.sh
4PTQ 静态量化导出local/PTQ_static.sh

脚本通过parse_options.sh解析--stage/--stop-stage参数,可灵活选择要执行的阶段范围,也可令stage等于stop-stage只执行单个阶段。例如只做数据预处理:

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

脚本头部默认变量(可按需修改):gpus=0,1、conf_path=conf/default.yaml、train_output_path=exp/default、ckpt_name=snapshot_iter_50000.pdz。注意source path.sh必须在脚本最前执行——path.sh 负责设置MAIN_ROOT、PYTHONPATH以及BIN_DIR(指向paddlespeech/t2s/exps/gan_vocoder/hifigan)等环境变量。

数据预处理与 dump 目录结构

./local/preprocess.sh ${conf_path}是数据处理的核心脚本,其内部逻辑对应 paddlespeech/t2s/exps/gan_vocoder/preprocess.py,共分 4 个子阶段:

  1. 生成时长文件:从 MFA 结果生成durations.txt;
  2. 特征提取:调用preprocess.py,以--rootdir=~/datasets/BZNSYP/、--dataset=baker、--dumpdir=dump、--dur-file=durations.txt、--cut-sil=True、--num-cpu=20提取每句话的 log-magnitude mel 谱,并按音素时长裁剪静音;
  3. 统计特征:调用 utils/compute_statistics.py 基于dump/train/raw/metadata.jsonl计算均值与标准差;
  4. 归一化:调用normalize.py分别对 train/dev/test 的 raw 特征做标准化,dev 与 test 复用 train 的统计量(保证分布一致)。

处理完成后,当前目录下生成dump文件夹:

dump ├── dev │ ├── norm │ └── raw ├── test │ ├── norm │ └── raw └── train ├── norm ├── raw └── feats_stats.npy

要点说明:

  • 数据集被划分为train、dev、test三部分,每部分含raw与norm两个子目录;
  • raw存放每句话的 log-magnitude mel 谱特征,norm存放归一化后的特征;
  • 归一化使用的统计量来自训练集,即dump/train/feats_stats.npy(这也是合成阶段声码器--voc_stat参数所指向的文件);
  • 每个子目录中都有一份表格式文件metadata.jsonl,记录每条语料的 id 及其谱特征文件路径,训练与合成阶段均通过它定位数据。

模型训练

训练命令与入口

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

local/train.sh 最终调用${BIN_DIR}/train.py,并设置了FLAGS_cudnn_exhaustive_search=true、FLAGS_conv_workspace_size_limit=4000以优化卷积性能。train.py完整帮助信息如下:

usage: train.py [-h] [--config CONFIG] [--train-metadata TRAIN_METADATA] [--dev-metadata DEV_METADATA] [--output-dir OUTPUT_DIR] [--ngpu NGPU] Train a HiFiGAN model. optional arguments: -h, --help show this help message and exit --config CONFIG HiFiGAN 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.

参数使用规则:

  1. --config:yaml 格式的覆盖配置,默认使用conf/default.yaml;
  2. --train-metadata/--dev-metadata:应使用dump目录下train、dev的norm子目录中的metadata.jsonl;
  3. --output-dir:实验输出目录,checkpoint 保存在该目录下的checkpoints/中;
  4. --ngpu:使用的 GPU 数量,为 0 时使用 CPU。

从 train.py 源码可以看到训练入口的完整装配流程:通过DataTable按wave与feats两个字段加载数据,DistributedBatchSampler负责并行采样,Clip根据batch_max_steps(默认 8400)与hop_size(n_shift=300)对音频做定长裁剪,最终交给HiFiGANUpdater与Trainer驱动训练。

default.yaml 配置详解

conf/default.yaml 是该示例的主配置,逐段说明如下。

特征提取(Feature Extraction)

参数默认值说明
fs24000采样率(Hz)
n_fft2048FFT 大小(样本数)
n_shift300帧移(样本数),即 12.5ms
win_length1200窗长(样本数),即 50ms;置 null 时与n_fft相同
window"hann"窗函数类型
n_mels80mel 滤波器数量
fmin80mel 计算最低频率(Hz)
fmax7600mel 计算最高频率(Hz)

生成器结构(Generator)

参数默认值说明
in_channels80输入通道数(即 mel 维度)
out_channels1输出通道数(单声道波形)
channels512初始通道数
kernel_size7首尾卷积核大小
upsample_scales[5, 5, 4, 3]上采样倍率序列(总倍率 5×5×4×3=300,对应帧移 300)
upsample_kernel_sizes[10, 10, 8, 6]上采样层卷积核大小
resblock_kernel_sizes[3, 7, 11]MRF 残差块卷积核大小列表
resblock_dilations[[1,3,5]×3]各残差块的膨胀率列表
use_additional_convsTrue残差块是否使用额外卷积层
nonlinear_activation"leakyrelu"非线性激活函数(negative_slope=0.1)
use_weight_normTrue是否应用权重归一化

这些参数与HiFiGANGenerator.__init__的形参一一对应(见 hifigan.py),实现为:先通过转置卷积逐级上采样,再经过多个不同卷积核/膨胀率的残差块构成的 MRF 模块做多感受野融合。

判别器结构(Discriminator)

  • 多尺度判别器(scales: 3):3 个尺度,池化参数kernel_size=4, stride=2, padding=2,内部下采样倍率 [4, 4, 4, 4, 1],卷积核列表 [15, 41, 5, 3],通道上限 1024,最大分组 16;
  • 多周期判别器(periods: [2, 3, 5, 7, 11]):5 个周期,内部下采样倍率 [3, 3, 3, 3, 1],卷积核 [5, 3],通道数 32;
  • follow_official_norm: True:遵循 HiFiGAN 官方归一化设定。

损失设置(Loss)

参数默认值说明
use_stft_lossFalse是否使用多分辨率 STFT 损失
use_mel_lossTrue是否使用 mel 谱损失
use_feat_match_lossTrue是否使用特征匹配损失
lambda_aux45.0STFT/mel 辅助损失系数
lambda_adv1.0对抗损失系数
lambda_feat_match2.0特征匹配损失系数

训练更新逻辑在 hifigan_updater.py 的update_core中清晰可见:生成器损失 =lambda_aux * mel_loss + lambda_adv * (adv_loss + lambda_feat_match * fm_loss);判别器则分别计算真实样本与生成样本的对抗损失并各自更新。这种"mel 损失引导 + 对抗损失塑形"的组合正是 HiFiGAN 训练稳定、音质好的关键。

数据加载与训练节奏

参数默认值说明
batch_size16批大小
batch_max_steps8400批内音频长度(样本数),须能被hop_size整除
num_workers2DataLoader 工作进程数
train_max_steps2500000总训练步数
save_interval_steps5000checkpoint 保存间隔
eval_interval_steps1000评估间隔
num_snapshots10最多保留的 snapshot 数
seed42随机种子(paddle / random / np.random)

优化器与调度器

  • 生成器与判别器均使用 Adam,beta1=0.5, beta2=0.9、无权重衰减;
  • 学习率均为2.0e-4,采用MultiStepLR,在步数 200000 / 400000 / 600000 / 800000 处以gamma=0.5逐级衰减;
  • 配置注释中说明了相对 HiFiGAN V1 官方的两处改动:优化器由 AdamW 换为 Adam、betas由 [0.8, 0.99] 调为 [0.5, 0.9],调度器由 ExponentialLR 换为 MultiStepLR;同时为匹配帧移差异,上采样倍率从官方的 256 帧移设置调整为 300。

另附两个衍生配置:微调配置 conf/finetune.yaml 与 iSTFT 变体配置 conf/iSTFT.yaml。后者在generator_params中开启use_istft: True与istft_layer_id: 2,将生成器最后两级上采样替换为 iSTFT 变换以降低参数量,具体说明见 examples/csmsc/voc5/iSTFTNet.md。

波形合成(mel 谱 → 波形)

训练完成后,可借助预训练 HiFiGAN 模型或自训 checkpoint,用synthesize.py从metadata.jsonl合成波形。仓库官方发布的 HiFiGAN 预训练权重为hifigan_csmsc_ckpt_0.1.1.zip,解压后包含:

hifigan_csmsc_ckpt_0.1.1 ├── default.yaml # default config used to train HiFiGAN ├── feats_stats.npy # statistics used to normalize spectrogram when training HiFiGAN └── snapshot_iter_2500000.pdz # generator parameters of HiFiGAN

命令形式(./local/synthesize.sh内部调用${BIN_DIR}/../synthesize.py):

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

local/synthesize.sh 实际执行的是--generator-type=hifigan,测试元数据取自dump/test/norm/metadata.jsonl,输出到${train_output_path}/test。synthesize.py帮助信息:

usage: synthesize.py [-h] [--generator-type GENERATOR_TYPE] [--config CONFIG] [--checkpoint CHECKPOINT] [--test-metadata TEST_METADATA] [--output-dir OUTPUT_DIR] [--ngpu NGPU] Synthesize with GANVocoder. optional arguments: -h, --help show this help message and exit --generator-type GENERATOR_TYPE type of GANVocoder, should in {pwgan, mb_melgan, style_melgan, } now --config CONFIG GANVocoder config file. --checkpoint CHECKPOINT snapshot to load. --test-metadata TEST_METADATA dev data. --output-dir OUTPUT_DIR output dir. --ngpu NGPU if ngpu == 0, use cpu.

参数要点:

  1. --config:与训练模型时一致的配置文件;
  2. --checkpoint:从训练输出目录checkpoints/中挑选一个 checkpoint;
  3. --test-metadata:使用处理目录下dev/norm子目录中的metadata.jsonl;
  4. --output-dir:合成音频保存目录;
  5. --ngpu:GPU 数量,为 0 时用 CPU。

源码层面,synthesize.py 通过class_map将--generator-type映射到对应生成器类,加载 checkpoint 后调用generator.inference(c=mel)生成波形,最终用soundfile以config.fs(24000Hz)写出.wav文件。

端到端合成(文本 → 波形)

若要实现"文本直接合成语音",需要声学模型 + 声码器串联。仓库使用 FastSpeech2(示例见 examples/csmsc/tts3)作为声学模型。官方预训练权重为fastspeech2_nosil_baker_ckpt_0.4.zip,解压后包含:

fastspeech2_nosil_baker_ckpt_0.4 ├── default.yaml # default config used to train fastspeech2 ├── phone_id_map.txt # phone vocabulary file when training fastspeech2 ├── snapshot_iter_76000.pdz # model parameters and optimizer states └── speech_stats.npy # statistics used to normalize spectrogram when training fastspeech2

命令形式(./local/synthesize_e2e.sh内部调用${BIN_DIR}/../../synthesize_e2e.py,即 paddlespeech/t2s/exps/synthesize_e2e.py):

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

synthesize_e2e.sh 的具体调用为:声学模型fastspeech2_csmsc(配合default.yaml、snapshot_iter_76000.pdz、speech_stats.npy、phone_id_map.txt),声码器hifigan_csmsc(--voc_config=${config_path}、--voc_ckpt=${train_output_path}/checkpoints/${ckpt_name}、--voc_stat=dump/train/feats_stats.npy),语言zh,文本来自paddlespeech/t2s/assets/sentences.txt。synthesize_e2e.py帮助信息:

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] [--tones_dict TONES_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] Synthesize with acoustic model & vocoder optional arguments: -h, --help show this help message and exit --am {...} Choose acoustic model type of tts 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. --spk_id SPK_ID spk id for multi speaker acoustic model --voc {...} Choose vocoder type of tts 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 Choose model language. zh or en --inference_dir INFERENCE_DIR dir to save inference models --ngpu NGPU if ngpu == 0, use cpu. --text TEXT text to synthesize, a 'utt_id sentence' pair per line. --output_dir OUTPUT_DIR output dir.

参数使用规则:

  1. --am:声学模型类型,格式为{model_name}_{dataset};
  2. --am_config、--am_ckpt、--am_stat、--phones_dict:声学模型四件套,对应 FastSpeech2 预训练包中的 4 个文件;
  3. --voc:声码器类型,格式为{model_name}_{dataset};
  4. --voc_config、--voc_ckpt、--voc_stat:声码器三件套,对应 HiFiGAN 预训练包中的 3 个文件;
  5. --lang:模型语言,zh或en;
  6. --text:待合成文本文件,每行一个'utt_id sentence'对;
  7. --output_dir:合成音频保存目录;
  8. --ngpu:GPU 数量,为 0 时用 CPU。

该脚本同时支持多种声学模型(speedyspeech、fastspeech2、tacotron2 等)与多种声码器(pwgan、mb_melgan、style_melgan、hifigan、wavernn 等)的自由组合,是体验 PaddleSpeech 多方案 TTS 链路的便捷入口。

预训练模型与模型导出

预训练模型

本文涉及的预训练模型清单(可从 PaddleSpeech 官方模型库获取):

  • HiFiGAN 动态图权重:hifigan_csmsc_ckpt_0.1.1.zip(含default.yaml、feats_stats.npy、snapshot_iter_2500000.pdz);
  • FastSpeech2 动态图权重:fastspeech2_nosil_baker_ckpt_0.4.zip(含default.yaml、phone_id_map.txt、snapshot_iter_76000.pdz、speech_stats.npy);
  • 静态图模型:hifigan_csmsc_static_0.1.1.zip、fastspeech2_nosil_baker_static_0.4.zip;
  • PIR 静态模型:hifigan_csmsc_static_pir_0.1.1.zip(运行 PIR 模型需设置FLAGS_enable_pir_api=1,且仅支持 paddlepaddle>=3.0.0b2);
  • ONNX 模型:hifigan_csmsc_onnx_0.2.0.zip、fastspeech2_csmsc_onnx_0.2.0.zip;
  • Paddle-Lite 模型:hifigan_csmsc_pdlite_1.3.0.zip、fastspeech2_csmsc_pdlite_1.3.0.zip。

官方发布模型的训练指标参考

ModelStepeval/generator_losseval/mel_losseval/feature_matching_loss
default1(gpu) x 250000024.9270.12627.554

上表为官方预训练 HiFiGAN 在 CSMSC 上的评估结果,可作为自训模型收敛情况的参照。

PTQ 静态量化导出

run.sh的 stage 4 执行 local/PTQ_static.sh,对训练好的 HiFiGAN 做后训练量化并导出:

python3 ${BIN_DIR}/../../PTQ_static.py \ --dev-metadata=dump/dev/raw/metadata.jsonl \ --inference_dir ${train_output_path}/inference \ --model_name ${model_name} \ --onnx_format=True

其中model_name传入hifigan_csmsc,量化校准数据取自dump/dev/raw/metadata.jsonl,同时输出 ONNX 格式的量化模型,便于部署到推理引擎。

模型微调(可选进阶)

示例目录还提供了 finetune.sh,展示基于预训练 FastSpeech2 生成 GTA(Ground-Truth Aligned)mel 谱来微调 HiFiGAN 的流程:

  1. stage 0:调用 gen_gta_mel.py,用预训练 FastSpeech2 为训练集生成与真实时长对齐的 mel 谱,输出到dump_finetune;
  2. stage 1:通过 utils/link_wav.py 将原dump中的 wav 软链到dump_finetune;
  3. stage 2:复用dump/train/feats_stats.npy作为dump_finetune的统计量;
  4. stage 3:对dump_finetune的 train/dev/test 执行归一化;
  5. stage 4:以conf/finetune.yaml配置训练,输出目录为exp/finetune。

致谢与延伸阅读

该示例的部分代码改编自 ParallelWaveGAN 项目(kan-bayashi/ParallelWaveGAN)。如果想深入了解声码器在完整 TTS 链路中的作用,可继续阅读:

  • examples/csmsc/tts3:FastSpeech2 声学模型训练示例;
  • paddlespeech/t2s/models/hifigan/hifigan.py:HiFiGAN 生成器与判别器完整实现;
  • paddlespeech/t2s/exps/gan_vocoder/synthesize.py:GAN 声码器通用合成脚本;
  • paddlespeech/t2s/exps/gan_vocoder/hifigan/train.py:HiFiGAN 训练入口。

按 examples/csmsc/voc5/README.md 的流程从数据准备一路走到量化导出,你就能完整复现一套"FastSpeech2 + HiFiGAN"的中文语音合成方案,并在此基础上替换数据集或调整配置开展自己的实验。

  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

相关推荐

上一篇:Taichi 全局设置完整指南:用 ti.init() 参数与环境变量精确定制运行时
下一篇:Vibe-Trading 实战:Tushare `fut_basic` 期货合约信息接口详解与数据工程应用

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询