SpeechBrain 语音增强实战:基于 WHAM!/WHAMR! 数据集的 SepFormer 训练与评估指南 SpeechBrain 语音增强实战基于 WHAM!/WHAMR! 数据集的 SepFormer 训练与评估指南【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrainSpeechBrain 在 recipes/WHAMandWHAMR/enhancement 目录下提供了一套完整的**单通道语音增强speech enhancement**训练配方覆盖 WHAM!带噪与 WHAMR!带噪 混响两个经典数据集。本指南以该 recipe 的 README 为骨架结合仓库内的 train.py、prepare_data.py、dynamic_mixing.py 等源码完整讲解环境安装、数据准备、模型选择、动态混合训练、测试评估与预训练模型使用。读完本文你将能够在自己的 WHAM!/WHAMR! 数据上完整复现 SepFormer 语音增强训练流程并理解其背后的数据管线与训练机制。数据集与任务概览WHAM!WSJ0 Hipster Ambient Mixtures与 WHAMR!增加混响的版本是基于 WSJ0-2/3 Mix 生成的带噪、带混响数据集。二者的区别在于WHAM!混合语音叠加真实环境噪声来自咖啡馆、酒吧、餐馆、地铁等场景data_folder指向名为wham_original的顶层目录WHAMR!在 WHAM! 基础上额外叠加房间混响RIRdata_folder指向名为whamr的顶层目录。在**语音增强enhancement**任务下num_spks设为 1目标是从单通道混合信号mix中恢复干净语音s1同时抑制噪声及混响而 separation 配方则将num_spks设为 2目标是分离出多路说话人。两者的核心训练脚本结构相同仅数据管线与目标数不同。该 recipe 的 README 明确说明支持以下模型架构SepFormerAttention is All You Need in Speech Separation, ICASSP 2021DPRNNDual-Path RNNConvTasnetDPTNet从 hparams 目录 的配置文件看仓库实际还提供了更多变体cnntransformer-wham-DM.yaml、cnntransformer-whamr-DM.yaml、convtasnet-whamr-DM.yaml、dprnn-whamr-DM.yaml以及hparams/models/下的2DFCNBLSTM.yaml、2DFCN.yaml、BLSTM.yaml、CNNTransformer.yaml等子模型配置。由于实验脚本train.py通过 HyperPyYAML 动态加载网络结构只需更换 YAML 中的Encoder / MaskNet / Decoder定义即可切换到不同架构。安装额外依赖运行本 recipe 前除 SpeechBrain 基础依赖外还需安装两个额外包定义在 extra_requirements.txtmir-eval0.6 pyroomacoustics0.7.3mir_eval用于测试阶段计算 SDR / SDRibss_eval_sourcespyroomacoustics用于 WHAMR! 的 RIR 生成与混响仿真。安装命令README 原文pip install -r ../extra_requirements.txt注意该相对路径是相对于 enhancement 目录的即仓库中的 recipes/WHAMandWHAMR/extra_requirements.txt。快速开始训练与测试标准训练进入 enhancement 目录后直接运行python train.py hparams/sepformer-wham.yaml --data_folder yourpath/wham_original python train.py hparams/sepformer-whamr.yaml --data_folder yourpath/whamr训练过程中日志打印的 loss 是负 SI-SNR该 recipe 将负 SI-SNR 直接作为损失函数值因此 loss 越小越好。仅测试若已训练好或已加载预训练模型只想在测试集上跑评估追加--test_only标志python train.py hparams/sepformer-wham.yaml --data_folder yourpath/wham_original --test_only python train.py hparams/sepformer-whamr.yaml --data_folder yourpath/whamr --test_only--test_only是 SpeechBrainBrain类提供的标准运行选项之一配合--epoch_counter或直接加载 checkpoint即可跳过训练阶段直接评估。数据集目录约定与自动识别机制README 强调了一个关键约定顶层文件夹的命名决定数据集类型。WHAM! 数据集顶层目录必须命名为wham_original内含wav8k子文件夹WHAMR! 数据集顶层目录必须命名为whamr。脚本通过--data_folder参数中的路径字符串自动区分两者。这一逻辑在 prepare_data.py 中体现if wham_original in datapath: create_wham_whamr_csv(datapath, savepath, fs, savenamewhamorg_, add_reverbFalse, tasktask) elif whamr in datapath: create_wham_whamr_csv(datapath, savepath, fs, add_reverbTrue, tasktask) else: raise ValueError(Unsupported Dataset)create_wham_whamr_csv会扫描wav{8k|16k}/{min|max}/{tr,cv,tt}/下的mix_singleenhancement 任务用或mix_bothseparation 任务用、s1/、s2/、noise/等目录生成 SpeechBrain 数据加载所需的 CSV 文件whamorg_tr.csv/whamr_tr.csv等保存于output_folder/save。同时它也支持--sample_rate 16000对应wav16k与--version max等参数。关键运行参数命令行覆盖train.py通过sb.parse_arguments解析命令行参数并允许以--key value方式覆盖 YAML 中的任意配置项。常用覆盖项参数默认值sepformer-wham.yaml说明--data_folder/yourpath/wham_original数据集根目录命名需遵循约定--base_folder_dm/yourpath/wsj0-processed/si_tr_s/动态混合所需的 WSJ0 训练集路径--rir_path占位符WHAMR! 必填RIR 目录不存在时自动生成--dynamic_mixingTrueWHAM!/FalseWHAMR! 基础版是否启用动态混合--test_onlyFalse仅运行测试评估--sample_rate8000采样率另有 16k 配置--skip_prepFalse跳过 CSV 准备混响增强RIR与 WHAMR! 支持WHAMR! 的训练会自动使用数据集自带的房间冲激响应Room Impulse Responses, RIR做数据增强。相关逻辑位于 train.pyif whamr in hparams[data_folder] and hparams[use_speedperturb]: from create_whamr_rirs import create_rirs from prepare_data import create_whamr_rir_csv if not os.path.exists(hparams[rir_path]): print(Creating Room Impulse Responses...) run_on_main(create_rirs, kwargs{output_dir: hparams[rir_path], sr: hparams[sample_rate]}) run_on_main(create_whamr_rir_csv, kwargs{...}) hparams[reverb] sb.processing.speech_augmentation.AddReverb(...)要点RIR 目录可自动创建若--rir_path指定的目录不存在create_whamr_rirs.py会自动从 Hugging Face 元数据speechbrain/sepformer-whamr拉取 WHAMR! 官方 RIR 生成脚本所需的参数表基于wham_room.py中的WhamRoom类生成 RIR 波形参见 create_whamr_rirs.py手动生成也可以直接运行../meta/create_whamr_rirs.py即 recipes/WHAMandWHAMR/meta/create_whamr_rirs.py预先准备好 RIR 数据去混响目标WHAMR! 配置中dereverberate: True表示训练目标为无混响的干净语音anechoic在训练前向阶段train.py若dereverberateFalse则把混响后的语音作为目标混合信号则由混响目标求和得到。动态混合Dynamic MixingREADME 特别强调本 recipe 支持动态混合——在训练过程中实时构造新的混合音频从而获得无穷多种说话人组合显著提升数据多样性。前置条件需要准备WSJ0数据集LDC 目录编号 LDC93S6A并提供一个指向其训练集si_tr_s的路径--base_folder_dm。脚本会自动完成以下工作采样率转换若 WSJ0 目录尚未转换为目标采样率8k 或 16k会调用preprocess_dynamic_mixing.py中的resample_folder利用scipy.signal.resample_poly递归重采样并归一化峰值生成base_folder_dm _processed8k或_processed_16k16k目录见 train.py构建说话人哈希表build_spk_hashtable遍历 WSJ0 所有 wav 文件按说话人 ID文件名前 3 个字符分组并统计每个说话人的样本数作为采样权重见 dynamic_mixing.py实时合成audio_pipeline按权重随机选取说话人与话语以随机偏移截取等长片段按 WHAM! 的统计规律施加随机增益第一个源 ~N(-27.43, 2.57) dB第二个源相对第一个偏移 ~N(-2.51, 2.66) dB均截断到 [-45, 0] dB叠加 WHAM! 噪声后整体缩放防止削波见 dynamic_mixing.py。启用动态混合后训练集使用torch.utils.data.DataLoadercollate_fnPaddedBatch每个 worker 独立设置随机种子以保证可复现性。模型架构与超参数详解以 sepformer-wham.yaml 为例网络由 Encoder、MaskNetDual-Path 模型与 Decoder 三部分组成组件类关键参数说明Encoderspeechbrain.lobes.models.dual_path.Encoderkernel_size: 16,out_channels: 2561D 卷积编码器将波形映射为特征MaskNetspeechbrain.lobes.models.dual_path.Dual_Path_Modelnum_spks: 1,K: 250,num_layers: 2,norm: ln双路径模型预测掩码SBtfintra / SBtfinterSBTransformerBlocknum_layers: 8,nhead: 8,d_ffn: 1024段内 / 段间 TransformerDecoderspeechbrain.lobes.models.dual_path.Decoderkernel_size: 16,stride: 8,out_channels: 11D 卷积解码器重构波形其他核心训练超参数优化器Adamlr: 0.00015weight_decay: 0损失speechbrain.nnet.losses.get_si_snr_with_pitwrapper带 PIT 包装的 SI-SNR增强任务中 PIT 退化为普通 SI-SNR学习率调度ReduceLROnPlateaufactor: 0.5patience: 2WHAM! 配置从第 65 epoch 起才允许衰减WHAMR! 为第 85 epochdont_halve_until_epoch混合精度precision: fp16WHAM! / WHAMR! 基础版部分配置如convtasnet-whamr-DM.yaml使用fp32数据增强use_speedperturb: True速度扰动speed_changes: [95, 100, 105]、use_rand_shift: False、use_wavedrop: False以及可选的DropFreq/DropChunk参数块loss 阈值threshold_byloss: True、threshold: -30用于过滤过难的训练样本梯度裁剪clip_grad_norm: 5epoch 数N_epochs: 200。WHAMR! 的 sepformer-whamr.yaml 与 WHAM! 版本的主要差异是dereverberate: True、dynamic_mixing: False、save_audio: True并保存前 20 条测试音频n_audio_to_save: 20、学习率调度起点为 85。16k 版本 sepformer-whamr-16k.yaml 则启用limit_training_signal_len: True将训练序列截断到 64000 个采样点。训练与评估流程源码解析train.py 定义了继承自sb.Brain的Separation类核心环节如下前向与损失compute_forward / compute_objectivesmix_w self.hparams.Encoder(mix) est_mask self.modules.masknet(mix_w) mix_w torch.stack([mix_w] * self.hparams.num_spks) sep_h mix_w * est_mask est_source torch.cat([self.hparams.Decoder(sep_h[i]).unsqueeze(-1) for i in range(self.hparams.num_spks)], dim-1)流程为Encoder 提取特征 → MaskNet 预测掩码 → 特征与掩码逐元素相乘 → Decoder 重构波形。由于 1D 卷积会改变时间维长度代码会用 padding 或裁剪将est_source恢复为原始mix长度train.py。compute_objectives中时域模型直接对targets与predicted_wavs计算 SI-SNR 损失若配置为频域模型use_freq_domain: True如 2DFCN 系列则先经compute_featsspectral_magnitude(power0.5)log1p得到幅度谱再计算谱域损失。训练批处理fit_batch中实现了两处实用技巧train.pyloss 硬阈值当threshold_bylossTrue时只对 loss 高于threshold默认 -30的样本求均值过滤过简单样本非有限 loss 保护若 batch 的 loss 为无穷大或为空则跳过该 batch 并计数nonfinite_count避免训练崩溃。评估与指标验证 / 测试阶段evaluate_batch、on_stage_start会计算并记录SI-SNR作为 lossPESQ通过pesq库计算16k 采样率用宽带wb模式8k 用窄带nb模式checkpoint 按验证集 PESQ 保存最优save_and_keep_only(meta{pesq: ...}, max_keys[pesq])。测试结束后save_results会额外调用mir_eval.separation.bss_eval_sources计算SDR / SDRi并将逐条结果与平均值写入output_folder/test_results.csv列snt_id, sdr, sdr_i, si-snr, si-snr_i, pesq。若save_audio: True还会把混合音、干净目标与估计源保存为save_folder/audio_results/item{id}_{mix,source,sourcehat}.wav。复现结果该 recipe 的 README 给出了 SepFormer 在 WHAM! / WHAMR! 测试集上的官方复现结果动态混合训练SepFormer, WHAM!SI-SNRPESQDynamic Mixing14.43.05SepFormer, WHAMR!SI-SNRPESQDynamic Mixing10.62.84训练时间在 NVIDIA V10032GB上WHAMR!动态混合与 WHAM! 均约需2 小时 30 分钟。预训练模型README 提供了可直接使用的预训练模型托管于 Hugging Face模型卡名称如下可结合 SpeechBrain 的from_pretrained接口加载speechbrain/sepformer-wham-enhancementWHAM! 增强speechbrain/sepformer-whamr-enhancementWHAMR! 增强speechbrain/sepformer-whamr16k16 kHz 版 WHAMR!此外训练日志与 checkpoints 的备份亦可从 README 提供的 Dropbox 链接获取。加载预训练模型有两种途径一是在 YAML 中配置pretrained_separatortrain.py 检测到该键时自动下载并加载权重二是直接使用 SpeechBrain 推理接口参考 inference 目录下的增强 / 分离接口。命令速查表场景命令WHAMR! 动态混合训练python train.py hparams/sepformer-whamr.yaml --data_folder yourpath/whamr --base_folder_dm yourpath/wsj0-processed/si_tr_s --rir_path yourpath/rir_wavs --dynamic_mixing TrueWHAM! 动态混合训练python train.py hparams/sepformer-wham.yaml --data_folder yourpath/wham_original --base_folder_dm yourpath/wsj0-processed/si_tr_s --dynamic_mixing TrueWHAMR! 静态训练python train.py hparams/sepformer-whamr.yaml --data_folder yourpath/whamr --rir_path yourpath/rir_wavsWHAM! 静态训练python train.py hparams/sepformer-wham.yaml --data_folder yourpath/wham_original仅测试上述命令追加--test_only引用若将本 recipe 用于研究或商业用途请按 README 中的说明引用 SpeechBrain 论文与 SepFormer 论文misc{speechbrainV1, title{Open-Source Conversational AI with SpeechBrain 1.0}, author{Mirco Ravanelli and others}, year{2024}, eprint{2407.00463}, archivePrefix{arXiv}, primaryClass{cs.LG} } inproceedings{subakan2021attention, title{Attention is All You Need in Speech Separation}, author{Cem Subakan and Mirco Ravanelli and Samuele Cornell and Mirko Bronzi and Jianyuan Zhong}, year{2021}, booktitle{ICASSP 2021} }小结本 recipe 以统一的SeparationBrain 类为核心将数据集准备CSV 生成、数据增强速度扰动、DropFreq/DropChunk、RIR 混响、动态混合、多架构模型切换SepFormer / DPRNN / ConvTasnet / DPTNet 等、指标评估SI-SNR / SDR / PESQ与 checkpoint 管理整合为一条完整的训练流水线。无论是复现论文结果、在 WHAM!/WHAMR! 上对比不同增强架构还是基于预训练模型做下游任务这个目录都是 SpeechBrain 语音增强方向的可靠起点。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考