PaddleSpeech 实战指南:基于 AISHELL-3 训练与推理 HiFiGAN 声码器(GAN Vocoder)
人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-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/paddlepaddle/PaddleSpeech点击查看免费下载本指南以 PaddleSpeech 仓库中的examples/aishell3/voc5示例为主线系统讲解如何基于大规模多说话人普通话语料 AISHELL-3 完成 HiFiGAN 声码器的数据预处理、模型训练与波形合成全流程并深入剖析conf/default.yaml中每一组关键配置与底层源码实现。读完本文你将掌握 PaddleSpeech 中 HiFiGAN 从数据到可部署模型的完整实战链路并能独立复现多说话人 TTS 的声码器模块。一、示例背景与整体流程HiFiGANHiFi-GAN论文发表于 2020 年是一种基于对抗训练的神经声码器Neural Vocoder能够把低维声学特征如 80 维对数梅尔谱高质量地还原为原始采样率的波形。在 TTS 系统中HiFiGAN 通常作为最后一个环节将前端模型输出的声学特征合成可听语音。AISHELL-3 是一个大规模、高保真的多说话人普通话语音语料库包含约 85 小时语音、218 位说话人特别适合训练多说话人 TTS 系统。examples/aishell3/voc5示例即使用该语料训练 HiFiGAN其完整流程封装在 run.sh 中分为三个阶段数据预处理stage 0从 MFA 对齐结果生成时长文件、提取对数梅尔谱特征、计算归一化统计量并完成特征归一化模型训练stage 1以预处理后的训练集特征训练 HiFiGAN 生成器与判别器波形合成stage 2加载指定 checkpoint从metadata.jsonl中的梅尔谱特征合成 wav 波形。整个流程依赖的环境变量由 path.sh 提供其中将BIN_DIR指向paddlespeech/t2s/exps/gan_vocoder/hifigan即 HiFiGAN 训练入口所在目录。二、数据集准备下载与 MFA 对齐2.1 下载并解压 AISHELL-3从 AISHELL-3 官方渠道下载语料并解压到~/datasets解压后数据集位于~/datasets/data_aishell3。后续脚本如 preprocess.sh默认按该路径读取原始音频。2.2 获取 MFA 对齐结果示例中训练 HiFiGAN 需要用到语音时长信息用于切分静音该信息来自 MFAMontreal Forced Aligner蒙特利尔强制对齐工具的对齐结果。获取方式有两种直接下载现成结果获取aishell3_alignment_tone.tar.gzAISHELL-3 带声调的对齐压缩包解压到示例目录下并重命名为aishell3_alignment_tone自行训练 MFA 模型参考仓库中 examples/other/mfa 示例训练对齐模型该示例当前使用 MFA1.x。在preprocess.sh的 stage 0 中会调用${MAIN_ROOT}/utils/gen_duration_from_textgrid.py从aishell3_alignment_tone目录读取 MFA 的 TextGrid 对齐结果输出durations.txt作为后续特征提取时切分静音--cut-silTrue的依据python3 ${MAIN_ROOT}/utils/gen_duration_from_textgrid.py \ --inputdir./aishell3_alignment_tone \ --outputdurations.txt \ --config${config_path}三、一键运行与阶段控制3.1 run.sh 的用法run.sh 提供了按阶段执行的完整入口。脚本开头的默认变量如下变量默认值含义gpus0使用的 GPU 设备号stage0起始阶段stop_stage100结束阶段conf_pathconf/default.yamlHiFiGAN 配置文件train_output_pathexp/default训练输出目录ckpt_namesnapshot_iter_5000.pdz合成时加载的 checkpoint 文件名直接运行./run.sh会依次执行全部三个阶段也可以指定阶段范围例如以下命令仅执行数据预处理./run.sh --stage 0 --stop-stage 0阶段参数解析通过source ${MAIN_ROOT}/utils/parse_options.sh完成注意该方式不能与$1、$2位置参数混用。三个阶段的对应关系stage 0调用./local/preprocess.sh ${conf_path}完成数据预处理stage 1调用CUDA_VISIBLE_DEVICES${gpus} ./local/train.sh ${conf_path} ${train_output_path}开始训练所有 checkpoint 保存在train_output_path/checkpoints/目录下stage 2调用CUDA_VISIBLE_DEVICES${gpus} ./local/synthesize.sh ${conf_path} ${train_output_path} ${ckpt_name}合成波形。3.2 path.sh 环境准备path.sh 完成以下环境初始化MAIN_ROOT指向仓库根目录${PWD}/../../../将MAIN_ROOT与MAIN_ROOT/utils加入PATH设置LC_ALLC与PYTHONIOENCODINGUTF-8避免中文环境下脚本输出的编码问题将MAIN_ROOT加入PYTHONPATH保证paddlespeech包可被直接导入设置MODELhifiganBIN_DIR${MAIN_ROOT}/paddlespeech/t2s/exps/gan_vocoder/hifigan。四、数据预处理从音频到归一化特征4.1 preprocess.sh 的四个子阶段preprocess.sh 接收配置路径作为$1内部按四个子阶段执行子阶段 0生成 durations.txt。从 MFA 对齐结果aishell3_alignment_tone提取每句的静音时长信息写入durations.txt。子阶段 1提取特征。调用${BIN_DIR}/../preprocess.py即 paddlespeech/t2s/exps/gan_vocoder/preprocess.py关键参数python3 ${BIN_DIR}/../preprocess.py \ --rootdir~/datasets/data_aishell3/ \ --datasetaishell3 \ --dumpdirdump \ --dur-filedurations.txt \ --config${config_path} \ --cut-silTrue \ --num-cpu20--rootdir原始音频所在目录--dataset数据集名称aishell3--dumpdir特征输出目录dump--dur-file上一步生成的时长文件--cut-sil根据时长信息切分静音--num-cpu并行 CPU 数。特征提取的核心类是LogMelFBank位于 paddlespeech/t2s/datasets/get_feats.py它依次完成 STFT、幅度谱、梅尔滤波组投影与对数变换最终每句保存为utt_id_feats.npy并在metadata.jsonl中登记id与特征文件路径。子阶段 2计算统计量。调用${MAIN_ROOT}/utils/compute_statistics.py以dump/train/raw/metadata.jsonl为输入、feats为字段名计算训练集特征的均值与标准差输出dump/train/feats_stats.npy。子阶段 3归一化。对train、dev、test三个子集分别调用${BIN_DIR}/../normalize.py。注意 dev 与 test 使用的统计量均来自训练集--statsdump/train/feats_stats.npy且--skip-wav-copy表示不再复制原始 wav。4.2 dump 目录结构预处理完成后当前目录下生成dump文件夹结构如下dump ├── dev │ ├── norm │ └── raw ├── test │ ├── norm │ └── raw └── train ├── norm ├── raw └── feats_stats.npy数据集被划分为train、dev、test三部分每部分包含norm归一化后特征与raw原始特征两个子目录raw存放每句的对数梅尔谱幅度log magnitude of mel spectrogramnorm存放归一化后的谱图归一化统计量由训练集计算得到保存在dump/train/feats_stats.npy每个子目录下均有一份metadata.jsonl是类似表格的索引文件记录了每条样本的id与其谱图文件路径。4.3 特征提取配置的影响default.yaml中「FEATURE EXTRACTION SETTING」决定了特征维度与时间分辨率直接影响声码器质量与训练速度参数默认值说明fs24000采样率HzAISHELL-3 音频为 24kn_fft2048FFT 大小采样点数n_shift300帧移hop size对应 12.5mswin_length1200窗长对应 50ms设为 null 时与 fft_size 相同windowhann窗函数类型n_mels80梅尔滤波器组数量fmin80梅尔谱最低频率Hzfmax7600梅尔谱最高频率HzLogMelFBank的默认实现与这些参数一一对应sr24000, n_fft2048, hop_length300, n_mels80, fmin80, fmax7600使用 librosa 构造梅尔滤波器normslaney、htkFalse并对幅度谱取对数。五、模型训练train.py 与 default.yaml 全解5.1 训练入口与参数local/train.sh 调用${BIN_DIR}/train.py即 paddlespeech/t2s/exps/gan_vocoder/hifigan/train.py并使用FLAGS_cudnn_exhaustive_searchtrue与FLAGS_conv_workspace_size_limit4000优化 cuDNN 卷积性能FLAGS_cudnn_exhaustive_searchtrue \ FLAGS_conv_workspace_size_limit4000 \ python ${BIN_DIR}/train.py \ --train-metadatadump/train/norm/metadata.jsonl \ --dev-metadatadump/dev/norm/metadata.jsonl \ --config${config_path} \ --output-dir${train_output_path} \ --ngpu1train.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.各参数要点--configYAML 格式的配置文件用于覆盖默认配置即conf/default.yaml--train-metadata、--dev-metadata应分别使用dump目录下train/norm、dev/norm子目录中的metadata.jsonl--output-dir实验输出目录checkpoint 保存在其中的checkpoints/子目录--ngpu使用的 GPU 数量ngpu 0时使用 CPU。5.2 生成器网络结构源码级解读HiFiGAN 生成器实现位于 paddlespeech/t2s/models/hifigan/hifigan.pyHiFiGANGenerator类代码基于 jik876/hifi-gan 移植。其结构与default.yaml的generator_params严格对应配置项默认值源码中的角色in_channels80输入通道数与梅尔特征维度一致out_channels1输出通道数单声道波形channels512初始隐藏通道数kernel_size7首尾卷积核大小必须为奇数源码中有断言校验upsample_scales[5, 5, 4, 3]上采样倍数乘积 5×5×4×3300恰好与n_shift300匹配实现逐帧特征到逐采样点波形的还原upsample_kernel_sizes[10, 10, 8, 6]上采样卷积核大小源码断言其等于 2 倍上采样倍数resblock_kernel_sizes[3, 7, 11]残差块卷积核大小列表resblock_dilations[[1,3,5],[1,3,5],[1,3,5]]每个残差块的膨胀系数列表与 resblock 数量一一对应use_additional_convsTrue残差块中是否使用额外卷积层biasTrue卷积层是否带偏置nonlinear_activationleakyrelu非线性激活函数negative_slope: 0.1use_weight_normTrue是否对全部卷积层施加权重归一化weight normalization生成器由输入卷积层、若干上采样层与残差块组成输入卷积将 80 维梅尔特征映射到 512 维随后每一级上采样卷积把时间分辨率提高对应倍数再接一组多核残差块核大小 3/7/11、膨胀 1/3/5 的排列来细化高频细节最后通过输出卷积还原为 1 通道波形。配置文件头部还注明了本示例相对官方 HiFiGAN V1 配置的调整优化器从 AdamW 改为 Adambetas从[0.8, 0.99]改为[0.5, 0.9]调度器从 ExponentialLR 改为 MultiStepLR同时因帧移不同对上采样倍数做了对应修改。5.3 判别器网络结构discriminator_params定义了 HiFiGAN 的双重判别机制多尺度判别器Multi-Scale Discriminatorscales: 3表示 3 个不同时间尺度通过scale_downsample_pooling: AvgPool1D核 4、步长 2、填充 2逐级下采样每个尺度判别器初始通道 128、最大下采样通道 1024、最大分组数 16下采样倍数[4, 4, 4, 4, 1]卷积核序列[15, 41, 5, 3]并启用follow_official_norm: True遵循官方归一化设置多周期判别器Multi-Period Discriminatorperiods: [2, 3, 5, 7, 11]共 5 个周期将一维波形重排为二维period, frames后做 2D 卷积判别每个周期判别器初始通道 32下采样倍数[3, 3, 3, 3, 1]卷积核[5, 3]默认use_weight_norm: True、use_spectral_norm: False。5.4 损失函数与训练策略「STFT LOSS SETTING」与「ADVERSARIAL LOSS SETTING」定义了训练目标的组成use_stft_loss: False默认不启用多分辨率 STFT 损失lambda_aux仍保留为 45.0 供启用时使用use_mel_loss: True启用梅尔谱损失mel_loss_params定义计算梅尔谱时的 STFT 参数fs24000、fft2048、hop300、win1200、hann 窗、80 个梅尔、fmin0、fmax12000用于度量生成波形与真实波形的梅尔谱差异use_feat_match_loss: True启用特征匹配损失feature matching lossinclude_final_outputs: False表示不包含判别器最终输出层损失加权系数lambda_adv: 1.0对抗损失、lambda_feat_match: 2.0特征匹配损失。「OPTIMIZER SCHEDULER SETTING」采用生成器/判别器双优化器结构配置项默认值说明generator_optimizer_paramsbeta1: 0.5, beta2: 0.9, weight_decay: 0.0生成器 Adam 优化器generator_scheduler_paramslr: 2.0e-4, gamma: 0.5, milestones: [200000, 400000, 600000, 800000]生成器 MultiStepLR到达里程碑时学习率乘 0.5generator_grad_norm-1梯度裁剪范数-1 表示不裁剪discriminator_optimizer_params/scheduler_params同生成器判别器独立优化与调度discriminator_grad_norm-1判别器梯度裁剪范数「INTERVAL SETTING」控制训练节奏generator_train_start_steps: 1表示从第 1 步开始更新生成器discriminator_train_start_steps: 0表示判别器从第 0 步即开始更新train_max_steps: 2500000为总训练步数save_interval_steps: 5000为 checkpoint 保存间隔eval_interval_steps: 1000为验证间隔num_snapshots: 10限制最多保留的快照数seed: 42固定随机种子。数据加载方面batch_size: 16、batch_max_steps: 8400每条音频采样长度需能被 hop_size 整除、num_workers: 2。训练与更新的具体逻辑判别器更新、生成器更新、损失回传顺序封装在 paddlespeech/t2s/models/hifigan/hifigan_updater.py 中。六、波形合成synthesize.py 详解6.1 合成入口local/synthesize.sh 调用${BIN_DIR}/../synthesize.py即 paddlespeech/t2s/exps/gan_vocoder/synthesize.py可从metadata.jsonl直接合成波形FLAGS_allocator_strategynaive_best_fit \ FLAGS_fraction_of_gpu_memory_to_use0.01 \ python3 ${BIN_DIR}/../synthesize.py \ --config${config_path} \ --checkpoint${train_output_path}/checkpoints/${ckpt_name} \ --test-metadatadump/test/norm/metadata.jsonl \ --output-dir${train_output_path}/test \ --generator-typehifigan注意合成阶段限制了显存占用FLAGS_fraction_of_gpu_memory_to_use0.01适合在推理时按需申请显存。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/中选择一个--test-metadata测试集元数据示例中使用处理目录下dev/norm子目录中的metadata.jsonl此处 README 中描述为 dev 数据脚本实际传入dump/test/norm/metadata.jsonl可结合实际数据划分调整--output-dir合成音频输出目录--ngpuGPU 数量为 0 时使用 CPU。6.2 generator-type 与模型类的映射synthesize.py内部维护了一个生成器类型到模型类的映射class_map { hifigan: HiFiGANGenerator, mb_melgan: MelGANGenerator, pwgan: PWGGenerator, style_melgan: StyleMelGANGenerator, }因此在 examples/aishell3/voc5 中使用--generator-typehifigan会加载 hifigan.py 中的HiFiGANGenerator从 checkpoint 恢复生成器权重后将归一化的梅尔谱特征逐句还原为波形。七、预训练模型与部署产物7.1 可下载的模型产物PaddleSpeech 为 AISHELL-3 HiFiGAN 发布了多类模型产物zip 压缩包可从 PaddleSpeech 官方发布的 CDN 资源地址获取动态图 checkpointhifigan_aishell3_ckpt_0.2.0.zip包含训练配置、归一化统计量与生成器权重静态图模型hifigan_aishell3_static_1.1.0.zipPIR 静态图模型hifigan_aishell3_static_pir_1.1.0.zip——运行 PIR 模型需要设置FLAGS_enable_pir_api1且 PIR 模型仅支持paddlepaddle3.0.0b2ONNX 模型hifigan_aishell3_onnx_1.1.0.zip便于跨框架部署Paddle-Lite 模型hifigan_aishell3_pdlite_1.3.0.zip用于端侧移动/嵌入式推理。7.2 checkpoint 内容hifigan_aishell3_ckpt_0.2.0解压后包含三个文件hifigan_aishell3_ckpt_0.2.0 ├── 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 hifigandefault.yaml训练 HiFiGAN 时使用的默认配置feats_stats.npy训练时用于谱图归一化的统计量均值/标准差合成阶段必须与之一致才能正确反归一化snapshot_iter_2500000.pdz训练 250 万步时的生成器权重可直接用于合成。7.3 预训练模型评估指标官方给出的默认配置在 1 张 GPU 上训练 250 万步后的验证集指标如下ModelStepeval/generator_losseval/mel_losseval/feature_matching_lossdefault1(gpu) x 250000024.0600.10687.499其中eval/generator_loss为生成器总损失eval/mel_loss为梅尔谱损失衡量生成波形与真实波形在梅尔域的接近程度eval/feature_matching_loss为判别器特征匹配损失。八、代码归属与致谢本示例的代码部分改编自 ParallelWaveGANkan-bayashi/ParallelWaveGAN的实现思路HiFiGAN 模型结构基于 jik876/hifi-gan 移植到 PaddlePaddle特征提取模块LogMelFBank则参考了 ESPnet 的实现。如需进一步了解训练/推理细节可深入阅读 hifigan 训练入口、生成器实现 与 合成入口并结合 conf/default.yaml 逐项对照验证。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-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/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐Telegraf OpenWeatherMap 输入插件天气与预报数据采集配置全解Telegraf OpenWeatherMap 输入插件天气与预报数据采集配置全解 Telegraf 的 OpenWeatherMap 输入插件 input人工智能语音音频PaddleSpeech HiFiGAN 声码器源码全解生成器、判别器与训练配置实战PaddleSpeech HiFiGAN 声码器源码全解生成器、判别器与训练配置实战 导读 本文以 PaddleSpeech 中 HiFiGAN 声码器的核心人工智能语音音频NLP媒体生成PaddleSpeech 中的 HiFiGAN 声码器模型结构、训练配置与推理实现详解PaddleSpeech 中的 HiFiGAN 声码器模型结构、训练配置与推理实现详解 导读 HiFiGAN 是当前 TTSText to Speech系人工智能语音音频上一篇解决90%开发者痛点go-reform ORM实战排坑指南下一篇突破Git Subtree性能瓶颈splitsh-lite全方位问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考