ARTICLE DETAIL

资讯详情

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

SpeechBrain 实战:基于 SepFormer 的 Microsoft DNS-4 语音增强全流程指南

SpeechBrain 实战:基于 SepFormer 的 Microsoft DNS-4 语音增强全流程指南 SpeechBrain 实战基于 SepFormer 的 Microsoft DNS-4 语音增强全流程指南【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain本指南以 SpeechBrain 仓库中的 recipes/DNS/README.md 为核心完整讲解如何在 Microsoft Deep Noise SuppressionDNSChallenge 4ICASSP 2022数据集上用 SepFormer 模型构建一套实时非个性化语音增强Speech Enhancement系统。你将掌握从数据下载、WebDataset 分片打包、噪声合成到训练与 DNSMOS 主观质量评估的完整三步式实操流程并了解 SpeechBrain 在超大数据集上的工程化处理方式shard 化、并行下载、动态混音等。一、挑战赛背景与方案概览1.1 DNS-4 挑战赛的两个赛道Microsoft 在第 4 届深度噪声抑制挑战赛ICASSP 2022 举办中设置了两个赛道Real Time Non-Personalized DNS实时非个性化 DNS——对所有说话人通用要求实时处理Real Time Personalized DNS (PDNS) for Fullband Audio实时个性化 DNS全频带音频——针对特定说话人进行个性化降噪。本仓库的食谱只实现了第一个赛道实时非个性化 DNS。整个方案围绕 SepFormer 模型Attention is All You Need in Speech Separation原发表于 ICASSP 2021展开并使用500 小时全频带fullband音频进行训练。1.2 评估策略ITU-T P.835 与 DNSMOS P.835挑战赛官方采用 ITU-T P.835 主观测试框架从三个维度分别评分SIG语音质量Speech QualityBAK背景噪声质量Background Noise QualityOVRL整体音频质量Overall Audio Quality。由于主观 MOS 打分成本极高方案采用 DNSMOS P.835 正是本地跑 DNSMOS 的脚本。1.3 本食谱的三步总览步骤内容关键脚本Step 1下载 DNS-4 数据集并打包为 WebDataset shardsdns_download.py、create_wds_shards.pyStep 2合成带噪语音并打包为 shardsnoisyspeech_synthesizer_singleprocess.pyStep 3训练与评估train.py、dnsmos_local.py二、DNS-4 数据集结构与磁盘需求2.1 解压后的目录结构与大小DNS-4 数据集解压后目录结构及体量如下来自 recipes/DNS/README.mddatasets_fullband 892G -- dev_testset 1.7G -- impulse_responses 5.9G -- noise_fullband 58G \-- clean_fullband 827G -- emotional_speech 2.4G -- french_speech 62G -- german_speech 319G -- italian_speech 42G -- read_speech 299G -- russian_speech 12G -- spanish_speech 65G -- vctk_wav48_silence_trimmed 27G \-- VocalSet_48kHz_mono 974M可见clean_fullband是绝对主力827G其中又以德语319G和朗读语音 read_speech299G占比最大。这些语料覆盖了多语种用于提升模型的泛化能力。2.2 磁盘空间规划关键注意点dns_download.py下载的是 Real-time DNS 赛道的数据并自动解压其磁盘占用分两个阶段压缩包约550 GB解压后的音频文件约1 TB。解压后仓库会把散落的音频文件打包成更大的shardsWebDataset 格式。但这还没完下载的干净语音、RIR房间脉冲响应与噪声音频还会被进一步用来合成 clean-noisy 语音对用于训练合成结果同样被打包成 shards。因此还需要额外空间存放合成的 clean-noisy shards。整体规划磁盘时务必把三个阶段压缩包、解压音频、合成 shards的空间都算进去。2.3 下载耗时与并行化数据集下载非常耗时共126 个 splittrain、noise 与 dev 数据脚本默认串行逐个下载。dns_download.py提供--parallel_download参数开启并行下载其底层实现见 dns_download.py使用 Pythonconcurrent.futures.ThreadPoolExecutor创建与 CPU 核心数相等的线程并发下载适合大型集群环境。此外也可以改用array job 一次性提交 126 个任务同时下载并解压所有 split。从源码看dns_download.py 还有两个值得注意的工程细节断点续传与大小校验validate_file()会通过 HTTP 请求比对服务器与本地文件大小两者相差超过 100 MB 即视为下载不完整并触发Range断点续传见 dns_download.py应对微软 Azure 链接偶发的下载中断RIR 来源选择挑战赛官方仅提供真实 RIR而该脚本改用 OPENSLR 同时下载真实与仿真 RIRsim_rir_16k.zip与rirs_noises.zip并自动解压重命名为SLR26、SLR28同时下载RIR_table_simple.csv见 dns_download.py该表后续会被噪声合成器使用。三、安装额外依赖在开始之前先安装本食谱所需的额外 Python 依赖定义在 extra_requirements.txtpip install -r extra_requirements.txt该文件包含librosa音频处理、mir_evalSDR 等分离指标、onnxruntimeDNSMOS 推理、pesqPESQ 指标、pyroomacoustics0.7.3混响仿真、pystoiSTOI 指标、tensorboard训练日志、webdatasetshards 读取。四、Step 1下载数据集并创建 WebDataset shards4.1 下载 Real-time DNS 数据集串行下载python dns_download.py --compressed_path DNS-dataset --decompressed_path DNS-compressed并行下载推荐适用于多核机器/集群python dns_download.py --compressed_path DNS-dataset --decompressed_path DNS-compressed --parallel_download参数说明依据 dns_download.py 的命令行定义参数默认值作用--compressed_pathDNS-compressed压缩包存放目录--decompressed_pathDNS-dataset解压后音频存放目录--parallel_download关闭开启多线程并行下载注意README 中命令行参数的命名与实际效果是压缩文件下载到DNS-compressed解压后的音频在DNS-dataset二者目录名的对应关系以实际使用为准仓库文档此处描述存在轻微不一致实际操作时建议按脚本参数含义理解。脚本还会在结束后自动改写RIR_table_simple.csv中的路径把datasets/impulse_responses/SLR26/...等替换为本地绝对路径并把该表移动到noisyspeech_synthesizer目录下供合成阶段使用。4.2 创建 WebDataset shards将解压后的目录结构{french,german,...}_speech/../*.wav转换为 WebDataset 格式便于高效流式读取## webdataset shards for clean_fullband每次选择一个语言如 read、german 等 python create_wds_shards.py DNS-dataset/datasets_fullband/clean_fullband/read_speech/german_speech/french_speech/.../ DNS-shards/clean_fullband/ ## webdataset shards for noise_fullband python create_wds_shards.py DNS-dataset/datasets_fullband/noise_fullband/ DNS-shards/noise_fullband ## webdataset shards for baseline dev-set python create_wds_shards.py DNS-dataset/datasets_fullband/dev_testset/noisy_testclips/ DNS-shards/devsets_fullbandcreate_wds_shards.py 的行为要点源码级通过dns_folder_path.rglob(*.wav)递归收集所有 wav读取时长并过滤掉短于--min-duration默认 3.0 秒的样本见 create_wds_shards.py样本 key 中的.会被替换为_因为WebDataset 的 key 不允许包含句点见 create_wds_shards.py每个 shard 默认最多5000个样本--samples_per_shard写入模式为shard-%06d.tar会额外生成meta.json记录language_ids、每个语言的样本 key 列表与样本总数num_data_samples训练脚本会读取它来估算总样本数支持--seed默认 12345控制写入前 shuffle使同一 shard 内语言多样性更好。五、Step 2合成带噪语音并打包 shards5.1 合成原理训练语音增强模型需要clean-noisy 配对数据。合成器的思路是对 clean fullband 语音加噪声noise并施加混响RIR得到 clean-noisy 对。脚本位于noisyspeech_synthesizer目录源自微软 DNS-Challenge 官方实现。进入目录并为每种语言分别执行合成示例以 read、german、italian 为例spanish、russian、french 同理cd noisyspeech_synthesizer ## synthesize read speech python noisyspeech_synthesizer_singleprocess.py noisyspeech_synthesizer.yaml --input_shards_dir ../DNS-shards --split_name read_speech --synthesized_data_dir synthesized_data_shards ## synthesize German speech python noisyspeech_synthesizer_singleprocess.py noisyspeech_synthesizer.yaml --input_shards_dir ../DNS-shards --split_name german_speech --synthesized_data_dir synthesized_data_shards ## synthesize Italian speech python noisyspeech_synthesizer_singleprocess.py noisyspeech_synthesizer.yaml --input_shards_dir ../DNS-shards --split_name italian_speech --synthesized_data_dir synthesized_data_shards建议并行执行这些命令以缩短总耗时。合成输出会按train_shards/split_name与valid_shards/split_name分开存放见 noisyspeech_synthesizer.yaml。耗时提示合成 500 小时的带噪数据约需140 小时这也是后续训练采用动态混音dynamic mixing等加速手段的原因。5.2 合成器配置参数详解核心配置位于 noisyspeech_synthesizer.yaml可按需修改参数默认值含义input_shards_dir!PLACEHOLDER输入 shards 根目录如../DNS-shardssplit_name!PLACEHOLDER要合成的语言 splitread_speech、german_speech 等rirsRIR_table_simple.csvRIR 参数表sampling_rate16000合成信号的采样率audioformat*.wav音频格式audio_length4每条 clean/noisy 音频的时长秒silence_length0.2clean 语音之间插入的静音时长秒total_hours100需要合成的数据总量小时snr_lower/snr_upper-5 / 15SNR 上下界dBrandomize_snrTrue是否随机化 SNRtarget_level_lower/target_level_upper-35 / -15写音频前的目标电平上下界dBtotal_snrlevels21SNR 层级数在上下界之间划分的档位数clean_activity_threshold0.6clean 语音的活动阈值noise_activity_threshold0.0噪声的活动阈值fileindex_start/fileindex_endNone文件名起始/结束编号is_test_setFalse是否为测试集input_sampling_rate48000输入信号的采样率DNS 原始数据为 48kHz 全频带samples_per_shard5000每个合成 shard 的样本数synthesized_data_dir!PLACEHOLDER合成数据输出目录shard_cache_dir空若 shards 托管在网络上指定本地大磁盘缓存目录use_singing_data0是否加入歌唱语音VocalSet1 启用singing_choice31 仅男声、2 仅女声、3默认男女声use_emotion_data0是否加入情感语音emotional_speechuse_mandarin_data0是否加入中文数据需另行下载 AISHELLrir_choice31 仅真实 RIR、2 仅仿真 RIR、3默认两者都用lower_t60/upper_t600.3 / 1.3混响 T60 范围秒noise_types_excludedNone需要排除的噪声类型log_dirsplit_name_logs日志目录其中clean_fullband_shards与noise_fullband_shards通过shard-{000000..999999}.tar这样的 brace 通配模式指向 Step 1 生成的 shardsclean_meta、noise_meta指向各 split 的meta.json。六、Step 3开始训练6.1 启动训练进入 enhancement 目录并执行cd enhancement python train.py hparams/sepformer-dns-16k.yaml --data_folder path/to/synthesized_shards_data --baseline_noisy_shards_folder path/to/baseline_shards_data命令行覆盖的两个!PLACEHOLDER分别对应训练/验证 shards 根目录与基线 dev 噪声 shards 目录sepformer-dns-16k.yaml 中data_folder和baseline_noisy_shards_folder的占位。6.2 训练超参数全景sepformer-dns-16k.yaml 中关键配置如下类别参数值说明基础seed1234随机种子数据audio_length4训练音频时长秒数据sample_rate16000采样率训练N_epochs100最大训练轮数训练batch_size/batch_size_test4 / 1训练/测试 batch 大小训练lr0.00015Adam 初始学习率训练clip_grad_norm5梯度裁剪范数训练loss_upper_lim999999可接受损失上限超过则跳过该 batch训练limit_training_signal_lenFalse是否将训练序列裁剪到固定长度训练training_signal_len32000裁剪长度采样点即 2 秒16k训练ckpt_interval_minutes60检查点保存间隔分钟训练precisionfp16混合精度可选 bf16/fp16/fp32增强use_speedperturbTrue速度扰动95/100/105%增强use_wavedrop/use_rand_shiftFalse波形丢弃 / 随机平移增强drop_freq_*见配置频带随机置零DropFreq增强drop_chunk_*见配置时间片段随机丢弃DropChunk损失lossget_si_snr_with_pitwrapperSI-SNR 损失含 PIT 包装损失threshold_byloss/thresholdTrue / -30对损失做阈值过滤丢弃过易样本调度lr_schedulerReduceLROnPlateaufactor 0.5、patience 2、第 85 轮后才开始减半模型结构方面源码见 sepformer-dns-16k.yamlEncoderspeechbrain.lobes.models.dual_path.Encoderkernel_size16、stride8、输出 256 通道MaskNetDual_Path_Model由两个SBTransformerBlockintra 与 inter各 8 层、d_model256、8 头注意力、d_ffn1024组成块长 K250层归一化lnintra 块周围有 skip 连接Decoderspeechbrain.lobes.models.dual_path.Decoder将 256 通道映射回单声道stride8、biasFalse。训练时noisy_w Encoder(noisy)→est_mask masknet(noisy_w)→est_source Decoder(noisy_w * est_mask)即掩码式mask-based增强随后会对卷积导致的时域长度差异做 padding/裁剪对齐见 train.py。6.3 训练流程与工程细节源码级train.py 基于 SpeechBrain 的sb.Brain框架实现数据管线dataio_prep()把 read/german/french/italian/spanish/russian 六种语言的 shards 通过webdataset.WebDataset拼接成组合数据集并启用shardshuffleTrue、.repeat()无限循环与.shuffle(1000)训练集与验证集各生成一个meta.json汇总样本数以计算每个 nominal epoch 的步数见 train.py。looped_nominal_epoch由num_samples // batch_size计算得出供无限流式数据集定步长使用验证集划分DNS 挑战赛的 dev 集不提供 ground-truth clean因此从训练集中随机划出 5% 作为验证集以便计算 Si-SNR、PESQ 等有参考指标在线数据增强训练阶段在torch.no_grad()下做速度扰动add_speed_perturb、可选随机平移、波形丢弃与频带丢弃并支持limit_training_signal_len随机裁剪cut_signals见 train.py损失阈值threshold_byloss开启时仅对大于threshold-30的样本损失取均值跳过过易样本利于收敛见 train.py检查点管理验证阶段按max_keys[pesq]保存最佳模型save_all_checkpointsFalse时只保留最优微调支持YAML 末尾提供了注释掉的pretrained_enhancementspeechbrain.utils.parameter_transfer.Pretrainer取消注释并填入 encoder/decoder/masknet 的预训练权重路径即可微调。七、评估DNSMOS 与验证集指标7.1 DNSMOS 本地评估先按官方说明下载 DNSMOS 评估模型sig_bak_ovr.onnx并放入DNSMOS目录。然后对两种输入分别打分# ModelSepFormer对基线测试片段做增强后的结果 python dnsmos_local.py -t results/sepformer-enhancement-16k/1234/save/baseline_audio_results/enhanced_testclips/ -o dnsmos_enhance.csv # ModelNoisy未增强的原始噪声测试片段 python dnsmos_local.py -t path-to/datasets_fullband/dev_testset/noisy_testclips/ -o dnsmos_noisy.csvdnsmos_local.py 的实现要点通过onnxruntime加载 ONNX 模型推理对每个片段按 1 秒步长、9.01 秒窗口滑动切段取各段 SIG/BAK/OVRL 的均值再用一组多项式拟合系数p_ovr/p_sig/p_bak见 dnsmos_local.py把原始模型输出映射为最终 MOS 分数结果写入 CSV。7.2 验证集与基线 dev 集结果由于 dev 集无 ground-truthREADME 中给出了两套评估结果1验证集训练集随机划出 5%表现采样率Valid Si-SNRValid PESQ16k-10.62.062DNS4 2022 基线 dev 集上的 DNSMOS 对比ModelSIGBAKOVRLNoisy2.9842.5602.205Baseline: NSNet23.0143.9422.712SepFormer2.9993.0762.437以上数据均来自 enhancement/README.md供参考对照。7.3 训练成本与建议官方配方使用8 × NVIDIA RTX A6000 48GB进行多卡 DDP 分布式训练处理约1300 小时的 clean-noisy 对45 个 epoch 耗时约17 天平均每 epoch 约 9.25 小时。文档明确建议至少训练 90~100 个 epoch以获得更好的性能。这说明该配方对计算资源的要求极高适合具备大型 GPU 集群的研究环境若资源有限可考虑用 YAML 中预留的pretrained_enhancement机制加载预训练模型做微调或先以更少的语言 split、更小的total_hours做小规模验证。7.4 更多评估能力enhancement 目录还提供composite_eval.py计算 CSIG、CBAK、COVL 等复合指标train.py 中的save_results()在验证集上输出 SDR、SDRi、SI-SNR、SI-SNRi、PESQ、STOI、CSIG、CBAK、COVL 的逐条 CSV 与均值见 train.py训练结束会自动把基线 dev 噪声片段增强后保存到save_folder/baseline_audio_results/enhanced_testclips/供 DNSMOS 等无参考指标评估。八、总结这条 DNS-4 语音增强食谱体现了 SpeechBrain 应对超大规模数据集 复杂模型的完整工程范式用下载脚本处理 126 个 split 与断点续传用 WebDataset shards 解决 TB 级数据的流式读取用合成器按需生成 clean-noisy 配对语料再以 SepFormer 的 encoder-masknet-decoder 结构配合 SI-SNR 损失、在线增强与混合精度完成训练最后用 DNSMOS 无参考指标与 Si-SNR/PESQ 有参考指标双轨验证。无论你是复现挑战赛基线还是以此为模板构建自己的语音增强系统都可以直接沿用这套三步流程。九、引用若在研究或业务中使用 SpeechBrain请引用misc{speechbrainV1, title{Open-Source Conversational AI with SpeechBrain 1.0}, author{Mirco Ravanelli and Titouan Parcollet and Adel Moumen and Sylvain de Langen and Cem Subakan and Peter Plantinga and Yingzhi Wang and Pooneh Mousavi and Luca Della Libera and Artem Ploujnikov and Francesco Paissan and Davide Borra and Salah Zaiem and Zeyu Zhao and Shucong Zhang and Georgios Karakasidis and Sung-Lin Yeh and Pierre Champion and Aku Rouhe and Rudolf Braun and Florian Mai and Juan Zuluaga-Gomez and Seyed Mahed Mousavi and Andreas Nautsch and Xuechen Liu and Sangeet Sagar and Jarod Duret and Salima Mdhaffar and Gaelle Laperriere and Mickael Rouvier and Renato De Mori and Yannick Esteve}, year{2024}, eprint{2407.00463}, archivePrefix{arXiv}, primaryClass{cs.LG}, }SepFormer 原始论文Attention is All You Need in Speech SeparationICASSP 2021inproceedings{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}, }DNS-4 数据集论文ICASSP 2022 Deep Noise Suppression ChallengeICASSP 2022inproceedings{dubey2022icassp, title{ICASSP 2022 Deep Noise Suppression Challenge}, author{Dubey, Harishchandra and Gopal, Vishak and Cutler, Ross and Matusevych, Sergiy and Braun, Sebastian and Eskimez, Emre Sefik and Thakker, Manthan and Yoshioka, Takuya and Gamper, Hannes and Aichner, Robert}, booktitle{ICASSP}, year{2022}, }【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表