- 人工智能
- 语音
- 音频
【免费下载链接】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.
导读
本文以 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)的结果来裁剪音频边缘静音,以获得更干净的训练样本。有两种获取方式:
- 直接下载仓库官方发布的 baker 对齐结果压缩包
baker_alignment_tone.tar.gz,解压后得到目录./baker_alignment_tone; - 自行训练 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.shrun.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 |
| 4 | PTQ 静态量化导出 | 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 个子阶段:
- 生成时长文件:从 MFA 结果生成
durations.txt; - 特征提取:调用
preprocess.py,以--rootdir=~/datasets/BZNSYP/、--dataset=baker、--dumpdir=dump、--dur-file=durations.txt、--cut-sil=True、--num-cpu=20提取每句话的 log-magnitude mel 谱,并按音素时长裁剪静音; - 统计特征:调用 utils/compute_statistics.py 基于
dump/train/raw/metadata.jsonl计算均值与标准差; - 归一化:调用
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.参数使用规则:
--config:yaml 格式的覆盖配置,默认使用conf/default.yaml;--train-metadata/--dev-metadata:应使用dump目录下train、dev的norm子目录中的metadata.jsonl;--output-dir:实验输出目录,checkpoint 保存在该目录下的checkpoints/中;--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)
| 参数 | 默认值 | 说明 |
|---|---|---|
fs | 24000 | 采样率(Hz) |
n_fft | 2048 | FFT 大小(样本数) |
n_shift | 300 | 帧移(样本数),即 12.5ms |
win_length | 1200 | 窗长(样本数),即 50ms;置 null 时与n_fft相同 |
window | "hann" | 窗函数类型 |
n_mels | 80 | mel 滤波器数量 |
fmin | 80 | mel 计算最低频率(Hz) |
fmax | 7600 | mel 计算最高频率(Hz) |
生成器结构(Generator)
| 参数 | 默认值 | 说明 |
|---|---|---|
in_channels | 80 | 输入通道数(即 mel 维度) |
out_channels | 1 | 输出通道数(单声道波形) |
channels | 512 | 初始通道数 |
kernel_size | 7 | 首尾卷积核大小 |
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_convs | True | 残差块是否使用额外卷积层 |
nonlinear_activation | "leakyrelu" | 非线性激活函数(negative_slope=0.1) |
use_weight_norm | True | 是否应用权重归一化 |
这些参数与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_loss | False | 是否使用多分辨率 STFT 损失 |
use_mel_loss | True | 是否使用 mel 谱损失 |
use_feat_match_loss | True | 是否使用特征匹配损失 |
lambda_aux | 45.0 | STFT/mel 辅助损失系数 |
lambda_adv | 1.0 | 对抗损失系数 |
lambda_feat_match | 2.0 | 特征匹配损失系数 |
训练更新逻辑在 hifigan_updater.py 的update_core中清晰可见:生成器损失 =lambda_aux * mel_loss + lambda_adv * (adv_loss + lambda_feat_match * fm_loss);判别器则分别计算真实样本与生成样本的对抗损失并各自更新。这种"mel 损失引导 + 对抗损失塑形"的组合正是 HiFiGAN 训练稳定、音质好的关键。
数据加载与训练节奏
| 参数 | 默认值 | 说明 |
|---|---|---|
batch_size | 16 | 批大小 |
batch_max_steps | 8400 | 批内音频长度(样本数),须能被hop_size整除 |
num_workers | 2 | DataLoader 工作进程数 |
train_max_steps | 2500000 | 总训练步数 |
save_interval_steps | 5000 | checkpoint 保存间隔 |
eval_interval_steps | 1000 | 评估间隔 |
num_snapshots | 10 | 最多保留的 snapshot 数 |
seed | 42 | 随机种子(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.参数要点:
--config:与训练模型时一致的配置文件;--checkpoint:从训练输出目录checkpoints/中挑选一个 checkpoint;--test-metadata:使用处理目录下dev/norm子目录中的metadata.jsonl;--output-dir:合成音频保存目录;--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.参数使用规则:
--am:声学模型类型,格式为{model_name}_{dataset};--am_config、--am_ckpt、--am_stat、--phones_dict:声学模型四件套,对应 FastSpeech2 预训练包中的 4 个文件;--voc:声码器类型,格式为{model_name}_{dataset};--voc_config、--voc_ckpt、--voc_stat:声码器三件套,对应 HiFiGAN 预训练包中的 3 个文件;--lang:模型语言,zh或en;--text:待合成文本文件,每行一个'utt_id sentence'对;--output_dir:合成音频保存目录;--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。
官方发布模型的训练指标参考
| Model | Step | eval/generator_loss | eval/mel_loss | eval/feature_matching_loss |
|---|---|---|---|---|
| default | 1(gpu) x 2500000 | 24.927 | 0.1262 | 7.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 的流程:
- stage 0:调用 gen_gta_mel.py,用预训练 FastSpeech2 为训练集生成与真实时长对齐的 mel 谱,输出到
dump_finetune; - stage 1:通过 utils/link_wav.py 将原
dump中的 wav 软链到dump_finetune; - stage 2:复用
dump/train/feats_stats.npy作为dump_finetune的统计量; - stage 3:对
dump_finetune的 train/dev/test 执行归一化; - 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.
相关推荐
PaddleSpeech iSTFTNet 神经声码器实战:基于 CSMSC 数据集的训练、合成与推理全流程指南
PaddleSpeech iSTFTNet 神经声码器实战:基于 CSMSC 数据集的训练、合成与推理全流程指南 本指南以 PaddleSpeech 仓库中 e
人工智能语音音频PaddleSpeech 实战:基于 CSMSC 数据集训练 Style MelGAN 声码器(examples/csmsc/voc4)
PaddleSpeech 实战:基于 CSMSC 数据集训练 Style MelGAN 声码器(examples/csmsc/voc4) 本篇指南围绕 Padd
人工智能语音音频NLP媒体生成PaddleSpeech 实战:基于 LJSpeech-1.1 训练 HiFiGAN 声码器全流程指南
PaddleSpeech 实战:基于 LJSpeech 1.1 训练 HiFiGAN 声码器全流程指南 本文是一篇面向语音合成开发者的实战指南,围绕 Paddl
人工智能语音音频NLP媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考