ARTICLE DETAIL

资讯详情

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

SpeechBrain 实战:基于 MetricGAN-U 的无监督语音去混响 Recipe 解析与训练指南

SpeechBrain 实战:基于 MetricGAN-U 的无监督语音去混响 Recipe 解析与训练指南 SpeechBrain 实战基于 MetricGAN-U 的无监督语音去混响 Recipe 解析与训练指南【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain导读本文围绕 SpeechBrain 仓库中的 MetricGAN-U 去混响 Recipe 展开系统讲解如何基于MetricGAN-UUnsupervised MetricGAN在只有带混响reverberated语音、没有干净参考语音的情况下完成去混响模型的训练。MetricGAN-U 的核心思想是用判别器Metric Estimator拟合一个可微的目标指标打分器从而把 PESQ、SRMR、DNSMOS 等不可导的客观指标转化为生成器的训练信号。读完本文你将掌握该 Recipe 的数据准备流程、全部超参数含义、生成器与判别器网络结构、三阶段判别器训练机制以及从安装依赖到复现官方结果PESQ 2.07 / SRMR 8.265的完整操作路径。MetricGAN-U 原理无监督地优化不可导的语音指标传统语音增强/去混响方法通常依赖干净参考语音构造监督损失如 MSE、SI-SNR而评价语音质量的客观指标PESQ、SRMR 等既不可导又无法直接作为损失函数。MetricGANICML 2019提出用判别器网络来估计指标分数从而将指标优化问题转化为对抗训练问题MetricGAN-U 进一步将其推广到无监督场景——训练时完全不需要干净语音只使用带噪/带混响语音即可完成训练论文标题MetricGAN-U: Unsupervised speech enhancement/dereverberation based only on noisy/reverberated speech。本 Recipe 的关键设计体现在 train.py 的MetricGanBrain中生成器Generator输入带混响语音的幅度谱输出掩码mask将掩码乘回幅度谱得到增强谱再借助带混响语音的相位通过 resynthesize 重建波形判别器Discriminator / Metric Estimator输入增强谱或带噪谱输出一个标量作为对该语音客观指标如 SRMR的估计训练信号判别器通过score()函数调用真实的指标计算函数SRMRpy、DNSMOS 等拿到真分数作为回归目标生成器则被要求把判别器估计的分数推向target_score归一化后的理想值 1.0。值得注意的是SRMR 与 DNSMOS 都是无参考指标——这一点在源码中体现得十分直接srmrpy_eval 和 dnsmos_eval 的注释都写明target is not used in the function因此只用带混响语音即可完成整个训练闭环。Recipe 目录与文件结构本 Recipe 位于 recipes/Voicebank/dereverb/MetricGAN-U/包含以下核心文件文件作用README.md使用说明、运行命令、结果与引用信息train.py主训练脚本MetricGanBrain、指标函数、数据管线voicebank_revb_prepare.py把原始 VoiceBank-SLR 数据整理为 JSON 标注文件hparams/train_dereverb.yaml全部训练超参数FFT、数据、目标指标、学习率等hparams/models/MetricGAN_U.yaml模型定义指定生成器与判别器类extra_requirements.txt额外依赖SRMRpy 的安装来源其中生成器与判别器的网络实现位于 SpeechBrain 核心库 speechbrain/lobes/models/MetricGAN_U.py属于可复用的speechbrain.lobes.models.MetricGAN_U模块。第一步手动下载并准备 VoiceBank-SLR 数据集本 Recipe 使用VoiceBank-SLR去混响版本数据集该数据集需要手动下载官方 README 中给出的下载入口为 VoiceBank-SLR 项目主页下载后请确认数据目录包含以下四个子目录由 voicebank_revb_prepare.py 定义data_folder/ ├── clean_trainset_28spk_wav_16k/ # 训练集干净语音28 说话人16 kHz ├── reverb_trainset_28spk_wav_16k/ # 训练集混响语音与干净语音一一对应 ├── clean_testset_wav_16k/ # 测试集干净语音 └── reverb_testset_wav_16k/ # 测试集混响语音准备脚本prepare_voicebank()会扫描上述目录并生成三个 JSON 标注文件train_revb.json训练集来自 28 个训练说话人中的 26 个valid_revb.json验证集由valid_speaker_count2控制默认取TRAIN_SPEAKERS列表中的前 2 个说话人p226、p287作为验证说话人见 voicebank_revb_prepare.py保证验证说话人在训练中完全不可见test_revb.json测试集使用独立的reverb_testset_wav_16k。每个 JSON 条目包含noisy_wav混响语音路径、clean_wav干净语音路径与length时长按 16 kHz 采样率换算见create_json()。注意训练时干净语音路径虽然存在但训练管线只读取noisy_sig——audio_pipeline_train只加载noisy_wavtrain.py干净语音仅在验证/测试阶段用于计算 PESQ、STOI、SI-SNR 等有参考指标。准备脚本由训练主程序自动调用通过run_on_main(prepare_voicebank, ...)也可在超参数中将skip_prep: True跳过该步骤。第二步安装额外依赖训练默认目标指标是SRMRSpeech-to-Reverberation Modulation Energy Ratio其计算依赖 SRMRpy 库。安装方式在 extra_requirements.txt 中声明README 中写作 extra-dependencies.txt仓库内实际文件名是extra_requirements.txtpip install -r extra_requirements.txt注意DNSMOS 选项如果希望把目标指标切换为DNSMOStarget_metric: dnsmos则需要先向 DNS Challenge 组织者dns_challengemicrosoft.com申请访问密钥并在 train.py 顶部的AUTH_KEY变量中填入该密钥。DNSMOS 通过向微软的评分 Web 服务发送请求获取 MOS 分数dnsmos_eval中对请求失败会等待 10 秒后重试因此在线评分、耗时较长且依赖网络这也是默认配置中calculate_dnsmos_on_validation_set: False的原因。第三步读懂核心超参数配置 train_dereverb.yamlhyperparams/train_dereverb.yaml 是本 Recipe 唯一需要关注的配置文件。以下按类别解读关键参数基础与路径参数参数默认值说明seed12234随机种子通过speechbrain.utils.seed_everything在创建任何带参数对象之前生效保证可复现data_folder!PLACEHOLDER数据集根目录必须通过命令行--data_folder传入output_folder./results/seed实验输出根目录save_folderoutput_folder/save检查点保存目录MetricGAN_folder/enhanced_folderoutput_folder/enhanced_wavs判别器训练期间写出的增强波形目录historical_fileoutput_folder/historical.txt历史样本含分数记录的 pickle 文件用于跨 epoch 的判别器复习use_tensorboardFalse是否启用 TensorBoard 日志FFT 特征参数16 kHz参数默认值说明Sample_rate16000采样率数据与指标计算统一使用Win_length32窗长 32 ms源码 STFT 会将毫秒换算为采样点Hop_length16帧移 16 msN_fft512FFT 点数幅度谱维度为 257N_fft/2 1window_fntorch.hamming_window分析窗函数compute_feats()train.py的流程是先经compute_STFT得到复数谱再用spectral_magnitude(feats, power0.5)取幅度谱power0.5 即对幅度开根号作为生成器的输入特征。目标指标与数据采样参数参数默认值说明target_metricsrmr要优化的无参考指标目前仅支持srmr与dnsmos源码中score()对其它值直接抛ValueError见 train.pytarget_score1归一化后的目标分数SRMR/DNSMOS 分数经 sigmoid 或线性归一化到 0~1生成器要把估计分数推向 1n_jobs1并行计算指标的工作进程数调大可加速 SRMR 计算calculate_dnsmos_on_validation_setFalse是否在验证集上额外计算 DNSMOS非常耗时默认关闭number_of_samples100每个 epoch 从训练集中采样的样本数D 与 G 通过 ReproducibleWeightedRandomSampler 保证取到相同样本见make_dataloadertrain.pyhistory_portion0.2历史判别器训练时从历史样本中采样的比例min_mask0.2生成器输出掩码的下限mask.clamp(minmin_mask)防止掩码过小导致语音过度抑制见 train.py训练与优化参数参数默认值说明number_of_epochs250总训练轮数train_N_batch/valid_N_batch1/20训练/验证批大小训练批很小因为批内每一条都要实时计算 SRMRG_lr0.000002生成器学习率2e-6极小配合对抗训练稳定性D_lr0.0005判别器学习率mse_weight0.6生成器损失中频谱 MSE 正则项的权重cost mse_weight * mse_cost见 train.py组件装配hyperpyyaml 对象compute_cost: !name:speechbrain.nnet.losses.mse_loss # 判别器回归损失 / 生成器 MSE 正则 compute_si_snr: !name:speechbrain.nnet.loss.si_snr_loss.si_snr_loss compute_STFT / compute_ISTFT: # STFT/ISTFT 模块 resynth: !name:speechbrain.processing.signal_processing.resynthesize # 幅度谱带噪相位重建波形 checkpointer: !new:speechbrain.utils.checkpoints.Checkpointer # 保存 G/D/epoch 计数器 lr_annealing: !new:speechbrain.nnet.schedulers.NewBobScheduler # 基于验证 PESQ 的学习率调度其中resynth使用的 resynthesize 从带混响语音的 STFT 中提取相位torch.atan2再与增强幅度谱组合成复数谱后经 iSTFT 重建波形——这是典型的幅度增强 相位保持策略。lr_annealingNewBobScheduler在验证阶段以5.0 - pesq作为监控量调用train.py即当 PESQ 不再提升时降低生成器学习率。第四步理解生成器与判别器网络结构模型定义在 hparams/models/MetricGAN_U.yaml通过!include机制被主配置文件引用kernel_size: (5,5) base_channels: 15 generator: !new:speechbrain.lobes.models.MetricGAN_U.EnhancementGenerator discriminator: !new:speechbrain.lobes.models.MetricGAN_U.MetricDiscriminatorEnhancementGenerator生成器实现在 speechbrain/lobes/models/MetricGAN_U.py是一个BLSTM 两层全连接 Sigmoid结构的掩码生成器双向 LSTMinput_size257对应 N_fft512 的幅度谱维度、hidden_size200、2 层、双向自定义初始化循环层weight_ih用 xavier_uniform、weight_hh用 orthogonal、bias 置零输入/输出层用xavier_init_layer初始化输出头linear1(400→300) LeakyReLU(0.3) linear2(300→257) Sigmoid输出每个时频点的掩码值0~1。训练循环中还会对生成器内Learnable_sigmoid相关参数做clamp(max3.5)防止梯度爆炸train.py。MetricDiscriminator判别器 / 指标估计器实现在 speechbrain/lobes/models/MetricGAN_U.py结构为BatchNorm2d(num_features1)归一化输入4 层 Conv2dbase_channels15、kernel_size(5,5)每层都经spectral_norm谱归一化 xavier 初始化 LeakyReLU通道平均torch.mean(out, (2, 3))将卷积特征图压平3 层全连接Linear1(15→50)→Linear2(50→10)→Linear3(10→1)输出单个标量作为指标估计值。谱归一化的使用保证了判别器训练的 Lipschitz 稳定性是这类指标估计器能够稳定拟合的关键设计。第五步三阶段判别器训练机制CURRENT / HISTORICAL / GENERATOR这是 MetricGAN-U 训练流程的灵魂由SubStage枚举train.py与train_discriminator()train.py实现。在每个 epoch 开始on_stage_start时判别器先经历三轮数据传递CURRENT当前数据D_enh D_noisy在训练集上同时优化两类判别任务——D_enh对生成器增强后的语音用score()计算真实 SRMR 分数作为回归目标让判别器学会估计增强语音的分数D_noisy对原始带混响语音同样计算真实分数save_noisy_scores缓存让判别器学会估计带噪语音的分数HISTORICAL历史数据D_enh从historical_set之前 epoch 保存的增强波形 真实分数记录中采样history_portion比例的样本继续训练判别器防止生成器变了、判别器却忘了旧分布的遗忘问题CURRENT 再跑一遍再次在当前数据上更新确保判别器始终贴合最新生成器输出。只有完成以上三步后才进入GENERATOR子阶段生成器以target_score为回归目标优化判别器估计分数同时叠加mse_weight * mse_cost频谱一致性正则。判别器训练期间产出的增强波形与分数通过write_wavs()写入MetricGAN_folder并序列化到historical_filetrain.py供后续历史训练使用。fit_batch()train.py根据sub_stage分派梯度更新且无论哪个阶段都会执行clip_grad_norm_梯度裁剪。第六步运行训练与验证确认依赖安装完成、数据集就位后在 Recipe 目录下执行python train.py hparams/train_dereverb.yaml --data_folder /path/to/data_folder训练流程由 train.py 的main驱动sb.parse_arguments解析命令行与 hyperpyyaml 覆盖项run_on_main(prepare_voicebank, ...)自动生成 JSON 标注已生成时跳过dataio_prep构造DynamicItemDataset其中训练集只输出[id, noisy_sig]验证/测试集额外输出clean_sigsb.create_experiment_directory创建实验目录并保存超参数副本构造MetricGanBrain加载历史文件调用fit()训练最后evaluate()在测试集上评估max_keypesq表示加载 PESQ 最优检查点。验证/测试阶段评估的指标在compute_objectives的非训练分支中train.py每个验证/测试样本都会计算SI-SNRsi_snr_loss负值作为 cost日志中取负显示为正PESQpesq_eval使用宽带模式modewb分数由 -0.5~4.5 归一化到 0~1(pesq0.5)/5STOIstoi_lossSRMRsrmrpy_eval_valid输出未归一化的真实 SRMR 分数训练时用的是 sigmoid 归一化版本srmrpy_eval两者对比可见 train.pyDNSMOS可选dnsmos_eval_valid仅当calculate_dnsmos_on_validation_set: True时启用。此外验证/测试阶段的增强波形会被写入enhanced_folder以id.wav命名16 kHz可直接用于主观试听或第三方工具评测。官方结果与检查点README 中记录的可复现结果如下实验日期超参数文件PESQSRMR2021-10-31train_dereverb.yaml2.078.265检查点按验证 PESQ 择优保存on_stage_end中调用checkpointer.save_and_keep_only(metastats, max_keys[pesq])train.py即始终保留验证集 PESQ 最高的模型。完整实验文件夹检查点、日志等的信息可在 README 中查找如需中断后续训历史文件historical_file与检查点机制共同保证可从断点恢复。总结MetricGAN-U Recipe 展示了一种极具工程价值的研究范式把任意不可导的语音质量指标转化为可微的对抗训练目标并彻底摆脱对干净参考语音的依赖。通过target_metric参数你可以在 SRMR 与 DNSMOS 之间切换优化目标而无需改动任何模型代码通过SubStage三阶段判别器训练、历史样本回放与ReproducibleWeightedRandomSampler训练过程兼顾了判别器稳定性和生成器收敛质量。若希望深入源码建议从 train.py 的MetricGanBrain与 speechbrain/lobes/models/MetricGAN_U.py 两个文件入手它们完整承载了本文所述的全部机制。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表