ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleSpeech WaveRNN 声码器实战:基于 CSMSC 中文标准语音库的完整训练与推理指南

PaddleSpeech WaveRNN 声码器实战:基于 CSMSC 中文标准语音库的完整训练与推理指南 人工智能语音音频【免费下载链接】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/gh_mirrors/pa/PaddleSpeech点击查看免费下载导读本文以 PaddleSpeech 仓库中的 examples/csmsc/voc6 示例为主线系统讲解如何使用 WaveRNN 神经声码器在中文标准普通话语音库CSMSCChinese Standard Mandarin Speech Copus即 BZNSYP 数据集上完成从数据预处理、模型训练到波形合成的完整流程。读完本文你将掌握 voc6 示例中全部脚本与配置文件的用法、WaveRNN 网络的源码结构以及如何加载官方预训练模型与静态模型进行语音合成。示例背景WaveRNN 声码器与 voc6 示例WaveRNN 是一种自回归式神经声码器其核心思路是以梅尔频谱等声学特征为条件逐样本sample-level预测并生成原始波形。PaddleSpeech 将其实现为一个独立的声码器模块源码位于 paddlespeech/t2s/models/wavernn/wavernn.py该实现注释中注明参考了 fatchord/WaveRNN 项目。voc6 示例即围绕这一模型在 CSMSC 中文语料上组织的完整训练配方。示例目录结构如下examples/csmsc/voc6 ├── conf/ │ └── default.yaml # WaveRNN 训练与特征提取配置 ├── local/ │ ├── preprocess.sh # 数据预处理 │ ├── train.sh # 模型训练 │ └── synthesize.sh # 波形合成 ├── README.md ├── path.sh # 环境与路径初始化 └── run.sh # 一键执行入口其中 path.sh 负责定位仓库根目录MAIN_ROOT、设置PYTHONPATH并将BIN_DIR指向paddlespeech/t2s/exps/wavernn即训练与合成 Python 脚本所在目录。一、数据集准备CSMSC 下载与 MFA 对齐结果1.1 下载并解压 CSMSC从 CSMSC 官方渠道下载中文标准普通话语音库解压到~/datasets目录使数据集位于~/datasets/BZNSYP。该数据集为中文单说话人语音是 PaddleSpeech 各类 TTS 与声码器示例tts0/tts3、voc1/voc3/voc5/voc6 等共用的标准测试语料。1.2 获取 MFA 对齐结果以裁剪静音voc6 使用 Montreal Forced AlignerMFA的音素级对齐结果来裁剪音频边缘的静音段。官方提供了已训练好的对齐结果包baker_alignment_tone.tar.gz带声调版本下载后解压到示例目录下使其路径为./baker_alignment_tone也可以参考仓库中 examples/other/mfa 示例自行训练 MFA 模型。对齐结果的后续使用方式见 local/preprocess.sh 的 stage 0脚本调用仓库工具utils/gen_duration_from_textgrid.py遍历--inputdir./baker_alignment_tone下的 TextGrid 文件输出durations.txt作为后续特征提取的时长依据。二、一键执行入口run.sh 与 stage 控制假设数据路径为~/datasets/BZNSYP、MFA 结果路径为./baker_alignment_tone直接运行./run.sh该脚本会依次完成四件事source path初始化环境→ 预处理数据集 → 训练模型 → 合成 wav默认从dump/dump_gta_test中的metadata.jsonl合成波形。脚本内部通过stage/stop_stage两个变量控制执行区间全部逻辑集中在 run.shgpus0,1 # 训练所用 GPU stage0 # 起始阶段 stop_stage100 # 结束阶段默认全跑 conf_pathconf/default.yaml train_output_pathexp/default test_inputdump/dump_gta_test ckpt_namesnapshot_iter_100000.pdz如需只执行某一个阶段可显式设置stage等于stop-stage例如仅做数据预处理./run.sh --stage 0 --stop-stage 0三个阶段的对应关系为stage 0 预处理调用local/preprocess.sh、stage 1 训练调用local/train.sh、stage 2 合成调用local/synthesize.sh。参数解析依赖仓库通用工具 utils/parse_options.sh因此可以用--stage N --stop-stage N的形式覆盖脚本内默认值。三、数据预处理特征提取、统计与归一化预处理入口为 local/preprocess.sh其完整调用方式为./local/preprocess.sh ${conf_path}脚本内部划分为 4 个 stage核心逻辑如下生成 durations由 MFA 的 TextGrid 对齐结果生成durations.txt提取特征调用paddlespeech/t2s/exps/gan_vocoder/preprocess.py声码器示例共用指定--rootdir~/datasets/BZNSYP/、--datasetbaker、--dumpdirdump、--dur-filedurations.txt并开启--cut-silTrue按对齐结果裁剪静音--num-cpu20并行加速计算统计量调用 utils/compute_statistics.py对dump/train/raw/metadata.jsonl的feats字段计算均值与标准差输出feats_stats.npy归一化对 train / dev / test 三个子集分别调用gan_vocoder/normalize.py统一使用训练集统计量进行归一化dev、test 必须复用 train 的统计量避免信息泄漏并跳过 wav 拷贝--skip-wav-copy。预处理完成后当前目录下生成dump文件夹结构如下dump ├── dev │ ├── norm │ └── raw ├── test │ ├── norm │ └── raw └── train ├── norm ├── raw └── feats_stats.npy其中raw子目录存放每条语音的对数幅度梅尔频谱log magnitude mel spectrogramnorm子目录存放归一化后的频谱归一化统计量feats_stats.npy只存在于dump/train下。数据被划分为 train / dev / test 三部分每个子目录下还有一个metadata.jsonl表格式文件逐行记录每条语音的 id 与频谱文件路径训练与推理脚本均以它作为数据索引。四、配置详解特征提取与模型参数所有关键配置集中在 conf/default.yaml分为特征提取、模型结构、推理、数据加载、优化器与训练间隔六大部分。4.1 特征提取设置STFT 与梅尔频谱fs: 24000 # 采样率 n_fft: 2048 # FFT 大小样本数 n_shift: 300 # 帧移样本数即 12.5ms win_length: 1200 # 窗长样本数即 50ms window: hann # 窗函数 n_mels: 80 # 梅尔滤波器组数量 fmin: 80 # 梅尔计算最低频率Hz fmax: 7600 # 梅尔计算最高频率Hz mu_law: True # 是否对波形做 mu-law 编码推荐开启以抑制噪声这里n_shift300hop size同时是 WaveRNN 上采样网络的整体缩放倍数依据必须与模型配置中的upsample_scales乘积一致见下文 4.2。mu_law: True意味着训练时对原始波形进行 mu-law 压扩量化这与源码 wavernn.py 中推理时调用decode_mu_law还原波形的逻辑相互对应。4.2 模型结构设置model: rnn_dims: 512 # RNN 隐藏层维度 fc_dims: 512 # 全连接层维度 bits: 9 # 信号位深RAW 模式下类别数为 2**bits aux_context_window: 2 # 辅助特征上下文窗口取 2 时考虑前后各 2 帧 aux_channels: 80 # 辅助特征卷积通道数必须等于 n_mels upsample_scales: [4, 5, 3, 5] # 上采样倍数乘积必须等于 hop size4*5*3*5300 compute_dims: 128 # MelResNet 中 Conv1D 维度 res_out_dims: 128 # MelResNet 输出维度 res_blocks: 10 # 残差块数量 mode: RAW # raw 对原始比特做 softmax或 mold 从混合逻辑分布采样对照 wavernn.py 的WaveRNN类实现可以看到mode决定输出头RAW模式输出2**bits类默认 9 bit 即 512 类MOL模式输出10 * 3个混合逻辑分布参数源码第 200-205 行aux_context_window决定 MelResNet 首个卷积的核大小k_size aux_context_window * 2 1即2*215第 59-62 行上采样网络UpsampleNetwork由 MelResNet、Stretch2D与一组固定权重的升采样卷积组成总缩放倍数为np.prod(upsample_scales)第 98 行生成器主体为两层 GRUrnn1、rnn2加三层全连接fc1/fc2/fc3条件信息通过四个切分的辅助特征a1~a4在不同层级注入第 265-288 行。4.3 推理与数据加载设置inference: gen_batched: True # 是否以批量模式生成样本 target: 12000 # 每个 batch 条目生成的目标样本数 overlap: 600 # 批次间交叉淡化crossfade的样本数 batch_size: 64 # 批大小 batch_max_steps: 4500 # 每个 batch 中音频长度需能被 hop size 整除 num_workers: 2 # DataLoader 工作进程数gen_batched、target、overlap对应源码WaveRNN.generate中的参数wavernn.py批量生成时先用fold_with_overlap将条件序列折叠为带重叠的片段逐片段自回归生成后再用xfade_and_unfold以 sigmoid 增益曲线做等功率交叉淡化拼接第 503-571 行从而在保持自回归采样的同时大幅提升生成吞吐。此外生成结束时还会对末尾10 * hop_length个样本做淡出处理避免信号戛然而止第 414-416 行。4.4 优化器与训练间隔grad_clip: 4.0 # 梯度裁剪阈值 learning_rate: 1.0e-4 # 学习率 train_max_steps: 400000 # 总训练步数 save_interval_steps: 5000 # 保存 checkpoint 间隔 eval_interval_steps: 1000 # 评估间隔 gen_eval_samples_interval_steps: 5000 # 生成验证样本的迭代间隔 generate_num: 5 # 每个 checkpoint 生成的样本数 num_snapshots: 10 # 训练期间保留的最大快照数 seed: 42 # 随机种子五、模型训练训练入口为 local/train.sh实际执行paddlespeech/t2s/exps/wavernn/train.pyCUDA_VISIBLE_DEVICES${gpus} ./local/train.sh ${conf_path} ${train_output_path}train.py的完整命令行参数如下usage: train.py [-h] [--config CONFIG] [--train-metadata TRAIN_METADATA] [--dev-metadata DEV_METADATA] [--output-dir OUTPUT_DIR] [--ngpu NGPU] Train a WaveRNN model. optional arguments: -h, --help show this help message and exit --config CONFIG WaveRNN 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 与 dev 的norm子文件夹中的metadata.jsonl即使用归一化后的频谱特征--output-dir实验输出目录checkpoint 保存在其中的checkpoints/子目录下--ngpu使用的 GPU 数量ngpu 0时使用 CPU。train.sh 在调用时还设置了两个 Paddle 性能相关的 FLAGSFLAGS_cudnn_exhaustive_searchtrue与FLAGS_conv_workspace_size_limit4000以加速卷积运算。从 train.py 源码可以看到训练流水线的关键细节数据集通过DataTable加载metadata.jsonl以np.load作为wave与feats字段的转换器collate 函数为WaveRNNClip位于 paddlespeech/t2s/datasets/vocoder_batch_fn.py依据mode、aux_context_window、hop_size、batch_max_steps、bits将波形裁剪为可被 hop size 整除的等长片段模型构造为WaveRNN(hop_lengthconfig.n_shift, sample_rateconfig.fs, **config[model])即直接把配置中的模型字段透传给模型类优化器为Adam配合grad_clip梯度裁剪、seed_everything(config.seed)随机种子并由Trainer调度训练、评估与快照保存Snapshot、VisualDL。六、波形合成推理合成入口为 local/synthesize.sh实际调用paddlespeech/t2s/exps/wavernn/synthesize.py从metadata.jsonl合成波形CUDA_VISIBLE_DEVICES${gpus} ./local/synthesize.sh ${conf_path} ${train_output_path} ${ckpt_name}ckpt_name默认为snapshot_iter_100000.pdz。synthesize.py的完整命令行参数如下usage: synthesize.py [-h] [--config CONFIG] [--checkpoint CHECKPOINT] [--test-metadata TEST_METADATA] [--output-dir OUTPUT_DIR] [--ngpu NGPU] Synthesize with WaveRNN. optional arguments: -h, --help show this help message and exit --config CONFIG Vocoder 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.参数说明--configWaveRNN 配置文件必须与训练时使用的配置一致--checkpoint要加载的 checkpoint从训练输出目录的checkpoints中选择--test-metadata测试集 metadata即处理目录中dev/norm子文件夹下的metadata.jsonl--output-dir合成音频的保存目录--ngpu使用的 GPU 数量为 0 时使用 CPU。synthesize.sh 中设置了两个推理期 FLAGSFLAGS_allocator_strategynaive_best_fit与FLAGS_fraction_of_gpu_memory_to_use0.01用于限制显存占用。在 Paddle 动态图转静态图场景下WaveRNN.generate内的逐样本循环使用GRUCell而非完整 GRU 层进行自回归推进wavernn.py并借助Categorical分布从 softmax logits 中采样采样值再经decode_mu_law还原为真实波形。七、预训练模型与静态模型官方为 voc6 提供了可在 CSMSC 上直接推理的预训练模型下载渠道为官方发布模型列表WaveRNN 动态图模型wavernn_csmsc_ckpt_0.2.0.zip静态图推理模型wavernn_csmsc_static_0.2.0.zip以及修复 Paddle 2.3 兼容性问题的wavernn_csmsc_static_1.0.0.zip官方记录的默认配置训练指标如下ModelStepeval/lossdefault1(gpu) x 4000002.602768即单卡训练 40 万步时评估集上的 WaveRNN 损失约为 2.60。解压 checkpoint 后其内部结构与exp/default训练输出对应wavernn_csmsc_ckpt_0.2.0 ├── default.yaml # 训练 wavernn 所用的默认配置 ├── feats_stats.npy # 训练 wavernn 时用于频谱归一化的统计量 └── snapshot_iter_400000.pdz # wavernn 模型参数这与训练流程中产生的dump/train/feats_stats.npy和checkpoints/snapshot_iter_*.pdz一一对应因此拿到该包后即可直接与 synthesize.sh 配合对归一化后的测试频谱进行合成。若希望将该声码器接入完整的 TTS 流水线文本前端 → 声学模型 → 声码器可参考仓库中 csmsc 的 tts3 等示例其 tts3 配方演示了声学模型输出频谱与声码器合成之间的衔接方式。总结voc6 是 PaddleSpeech 中基于 CSMSC 中文语料训练 WaveRNN 声码器的完整示例覆盖了 MFA 静音裁剪、STFT/梅尔特征提取与归一化、RAW 模式自回归训练、批量重叠生成与交叉淡化推理的全链路。掌握该示例的脚本组织方式run.sh 的 stage 机制、local 脚本与exps/wavernn的调用关系与 conf/default.yaml 的配置语义后你可以将其迁移到其他单说话人语音数据上并借助官方预训练模型快速产出中文语音波形。赞分享人工智能语音音频【免费下载链接】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/gh_mirrors/pa/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 实战基于 CSMSC 数据集训练 Style MelGAN 声码器examples/csmsc/voc4PaddleSpeech 实战基于 CSMSC 数据集训练 Style MelGAN 声码器examples/csmsc/voc4 本篇指南围绕 Padd人工智能语音音频NLP媒体生成PaddleSpeech 实战基于 CSMSC 数据集从零训练 SpeedySpeech 中文语音合成声学模型PaddleSpeech 实战基于 CSMSC 数据集从零训练 SpeedySpeech 中文语音合成声学模型 本指南完整讲解 PaddleSpeech 仓库人工智能语音音频Solana 集群基准测试实战从 Multinode 测试网搭建到 TPS 压测与调试Solana 集群基准测试实战从 Multinode 测试网搭建到 TPS 压测与调试 本文围绕 Solana 仓库中的集群基准测试文档 docs/src/人工智能语音音频上一篇如何永久保存微信聊天记录WeChatMsg免费工具完整指南下一篇AI工程师手册路线图从 Tool Use 到 Deep ResearchAI Agent 工程师技能树全景图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表