☰
使用 ESPnet 复现 ICASSP 2022 DNS Challenge 4 语音增强:DNS4 配方实战指南
2026/9/25 5:20:31 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频
  • 深度学习
  • NLP

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

项目地址:https://gitcode.com/gh_mirrors/es/espnet
点击查看免费下载

本指南以 ESPnet 仓库中egs2/dns_icassp22/enh1配方为核心,完整讲解如何在 ESPnet 环境下复现 ICASSP 2022 深度噪声抑制(Deep Noise Suppression, DNS)挑战赛第 4 轮(DNS Challenge 4, 实时主赛道)的语音增强系统。读者将掌握 DNS4 数据集下载与混合仿真、Kaldi 风格数据目录构建、基于卷积编码器/解码器与 TCN 分离器的单通道增强模型训练,以及 STOI/SDR/SI-SNR 等指标的自动评估全流程。

DNS Challenge 4 与 ESPnet 增强配方概览

DNS Challenge 4 是微软发起的 ICASSP 2022 深度噪声抑制挑战赛的实时(Real-Time)主赛道,目标是构建低延迟的语音增强前端,从带噪语音中恢复清晰语音。ESPnet 在egs2/dns_icassp22/enh1目录下提供了完整的 Recipe,覆盖数据下载、噪声-语音混合仿真、模型训练、推理增强与客观指标评测。

该配方与 ESPnet 其他增强任务(如egs2/libri2mix/enh1、egs2/wsj0_2mix/enh1)遵循同一套enh.sh主流程,但其特殊性在于:

  • 使用 48 kHz 全频带(fullband)音频,而非常用的 16 kHz;
  • 训练数据全部由官方脚本在线合成(clean + noise 混音),无需手工准备标注;
  • 面向实时赛道,模型设计为因果(causal)结构,支持流式推理。

配方目录结构如下(核心文件):

egs2/dns_icassp22/enh1/ ├── run.sh # 顶层入口,调用 enh.sh ├── enh.sh # 增强任务主脚本(stage 1-12) ├── conf/tuning/train.yaml # 模型与训练配置 ├── local/ │ ├── data.sh # 数据准备三阶段调度 │ ├── download_dns4_dataset.sh │ ├── dns_create_mixture.sh # 混合仿真 │ ├── dns_data_prep.sh # 生成 Kaldi 数据目录 │ └── noisyspeech_synthesizer.py └── scripts/utils/show_enh_score.sh # 结果汇总脚本

复现环境

原 README 记录的本配方复现环境如下(来自 README.md 的 Environments 部分):

  • date:Wed Sep 14 09:01:46 UTC 2022
  • python version:3.9.12 (main, Jun 1 2022, 11:38:51) [GCC 7.5.0]
  • espnet version:espnet 202207
  • pytorch version:pytorch 1.12.1+cu102
  • Git hash:13db69d3befc3c82a5ff5a11e28bf79d5030603f
    • Commit date:Mon Aug 29 13:44:35 2022 +0000

需要说明的是:上述环境信息只是配方作者当时的运行环境记录,当前仓库已随 ESPnet 版本演进,只要安装满足 installation.md 要求的 ESPnet(含 espnet2 增强模块、torch-complex 依赖),即可运行该配方;训练 48 kHz 全频带数据建议配备 GPU。

数据准备:下载、混合仿真与数据目录构建

local/data.sh将数据准备拆成三个 stage,通过run.sh中的--local_data_opts "--total_hours 150 --nj 8 --fs 48k"传入参数控制:

# local/data.sh 支持参数(节选) Usage: $0 [--stage <stage>] [--stop_stage <stop_stage>] [--total_hours <total_hours>] [--nj <nj>] [--fs] <fs> --total_hours: 合成带噪语音的时长(小时,默认=150,DNS4 英文朗读语音约 600 小时, 建议设在此值以下以避免数据重复) --nj: 合成带噪数据的并行任务数(默认=1) --fs: 合成带噪数据的采样率(默认=48000)

其中DNS4数据根目录变量定义在 db.sh(DNS4=downloads),即数据默认下载到downloads目录;若使用data.sh,请确认该变量已正确填写。

Stage 0:数据集下载

local/download_dns4_dataset.sh改编自 DNS-Challenge 官方仓库的下载脚本(原始许可证为 CC-BY 4.0)。脚本从微软 Azure Blob(dns4public.blob.core.windows.net)拉取数据并解压,需要注意以下几点:

  • 存储开销巨大:解压后全部数据约 892G(含各语种语音、噪声、冲激响应等),归档压缩态约 550GB,下载前务必确认磁盘空间;
  • 默认仅下载英文朗读语音与全频带噪声:脚本中BLOB_NAMES数组默认启用了read_speech_000~039(共 40 个分片,约 299G)与noise_fullband(audioset 7 个分片 + freesound 2 个分片,约 58G),法语/德语/意大利语/俄语/西语/情感语音/VocalSet/VCTK 等分片默认注释,可按需取消注释;
  • 下载完成后,脚本还会克隆 DNS-Challenge 官方仓库并git checkout 5582dcf5ba43155621de72a035eb54a7d233af14,将noisyspeech_synthesizer.cfg、audiolib.py、utils.py复制到配方local/目录,作为后续混合仿真的依赖。

Stage 1:混合仿真(Data Simulation)

local/dns_create_mixture.sh通过sed改写官方noisyspeech_synthesizer.cfg中的输入/输出路径与参数,生成新的训练配置data/noisyspeech_synthesizer.cfg,随后调用local/noisyspeech_synthesizer.py并行合成带噪语音:

# 关键路径改写(节选,见 local/dns_create_mixture.sh) noise_dir=${dns}/datasets_fullband/noise_fullband speech_dir=${dns}/datasets_fullband/clean_fullband/read_speech # 输出 noisy_wav=${dns_wav}/noisy clean_wav=${dns_wav}/clean noise_wav=${dns_wav}/noise

默认不使用歌唱语音、中文语音与情感语音(use_singing_data=0、use_mandarin_data=0、use_emotion_data=0),如需引入可在脚本中开启。脚本执行后会生成noisy/、clean/、noise/三个 wav 目录,文件名带相同的fileid_N编号,用于后续对齐。

Stage 2:数据准备(Data Preparation)

local/dns_data_prep.sh将混合仿真产物转换为 ESPnet/Kaldi 标准数据目录,最终生成tr_synthetic、cv_synthetic、tt_synthetic三个集合:

  • 扫描noisy/下全部 wav,按 80%/10%/10% 比例切分为训练/验证/测试(对应tr/cv/tt);
  • 为每个集合生成wav.scp、utt2spk、spk2utt、text;
  • 通过sed正则替换路径,生成噪声参考noise1.scp与干净语音参考spk1.scp,例如将带噪路径映射为clean_fileid_N.wav与noise_fileid_N.wav。

注意该配方在训练时不使用噪声与去混响参考(见下文run.sh中--use_dereverb_ref false --use_noise_ref false),但noise1.scp/spk1.scp仍被生成,其中spk1.scp正是增强训练的监督信号(clean 参考)。

顶层入口 run.sh 解读

run.sh 是本配方的唯一入口,核心调用如下:

sample_rate=48k train_set=tr_synthetic valid_set=cv_synthetic test_sets="cv_synthetic tt_synthetic" ./enh.sh \ --lang en \ --train_set "${train_set}" \ --valid_set "${valid_set}" \ --test_sets "${test_sets}" \ --fs ${sample_rate} \ --ngpu 1 \ --ref_num 1 \ --local_data_opts "--total_hours 150 --nj 8 --fs ${sample_rate}" \ --enh_config ./conf/tuning/train.yaml \ --use_dereverb_ref false \ --use_noise_ref false \ --max_wav_duration 31 \ --inference_model "valid.loss.best.pth" \ --nj 8 \ "$@"

参数语义:

  • --fs 48k:全频带采样率;--max_wav_duration 31:训练时过滤掉超过 31 秒的样本(DNS 官方混合片段约 30 秒量级);
  • --ref_num 1:单说话人增强任务,只有一个干净参考通道spk1.scp;
  • --enh_config ./conf/tuning/train.yaml:训练配置文件(原 README 中写为./conf/train.yaml,实际位于conf/tuning/下);
  • --inference_model valid.loss.best.pth:推理时选取验证 loss 最优的模型权重;
  • 末尾"$@"允许用户在命令行追加--stage、--stop_stage等覆盖参数。

训练配置详解(enh_train_raw)

原 README 的enh_train_raw小节即对应 conf/tuning/train.yaml。该配置可分为训练策略与模型架构两大部分:

训练策略

optim: adam init: xavier_uniform max_epoch: 100 batch_type: folded batch_size: 32 num_workers: 4 optim_conf: lr: 5.0e-04 eps: 1.0e-08 weight_decay: 1.0e-7 patience: 10 val_scheduler_criterion: - valid - loss best_model_criterion: - - valid - si_snr - max - - valid - loss - min keep_nbest_models: 1 scheduler: reducelronplateau scheduler_conf: mode: min factor: 0.7 patience: 1
  • 优化器为 Adam,初始学习率5.0e-04,权重衰减1.0e-7;参数采用 Xavier Uniform 初始化;
  • 训练 100 个 epoch,batch_type: folded表示按折叠方式批处理,batch_size: 32;
  • 学习率调度采用reducelronplateau,以验证集 loss 为监控指标,连续 1 个 epoch 无改善则乘以factor: 0.7;整体早停patience: 10;
  • 模型挑选标准best_model_criterion同时考虑验证集 SI-SNR(越大越好)与 loss(越小越好),keep_nbest_models: 1仅保留最优权重。

模型架构:卷积编码器/解码器 + TCN 分离器

encoder: conv encoder_conf: channel: 512 kernel_size: 960 # 20ms for 48k sample rate stride: 480 # 10ms for 48k sample rate decoder: conv decoder_conf: channel: 512 kernel_size: 960 # 20ms for 48k sample rate stride: 480 # 10ms for 48k sample rate separator: tcn separator_conf: num_spk: 1 layer: 8 stack: 3 bottleneck_dim: 128 hidden_dim: 512 kernel: 3 causal: True norm_type: "gLN" nonlinear: "relu"
  • 编码器:ConvEncoder(实现见 espnet2/enh/encoder/conv_encoder.py),512 个卷积通道,kernel_size: 960在 48 kHz 下对应 20 ms 窗长,stride: 480对应 10 ms 帧移——这是典型的时域 Conv-TasNet 风格前端,将波形映射为 512 维特征序列;
  • 解码器:ConvDecoder(见 espnet2/enh/decoder/conv_decoder.py),与编码器对称,将掩蔽后的特征重建为波形;
  • 分离器:TCNSeparator(见 espnet2/enh/separator/tcn_separator.py),8 层 × 3 栈的时间卷积网络,bottleneck 128 维、隐藏 512 维、卷积核 3;
  • causal: True是面向实时赛道的关键设置:TCN 采用因果卷积,配合流式接口forward_streaming可实现逐帧低延迟推理;
  • norm_type: "gLN"(全局层归一化),掩码非线性为 ReLU,采用掩蔽式(masking)增强而非映射式(mapping)——从TCNSeparator.forward源码可见,网络输出各说话人掩码后与输入特征逐元素相乘得到增强结果。

训练目标

criterions: # The first criterion - name: si_snr conf: eps: 1.0e-7 wrapper: fixed_order wrapper_conf: weight: 1.0

训练损失为尺度不变信噪比(SI-SNR),eps: 1.0e-7用于数值稳定,fixed_order包装器以固定顺序匹配参考与估计,权重 1.0。这与 README 中评估表格的SI_SNR指标一致,即"用什么训练、用什么评测"。

enh.sh 全流程:从数据到模型发布的 12 个 Stage

enh.sh 是 ESPnet 增强任务的通用主脚本,本配方通过 run.sh 传入参数驱动。其核心阶段如下:

Stage内容说明
1数据准备调用local/data.sh,完成下载/混合/切分
2速度扰动本配方未启用(speed_perturb_factors为空)
3格式化 wav.scp将 scp 指向的音频按--fs 48k重采样为dump/raw下的标准格式,并生成spk1.scp、utt2num_samples
4过滤短/长音频依据--min_wav_duration(默认 0.1s)与--max_wav_duration 31过滤训练/验证集
5统计收集espnet2.bin.enh_train --collect_stats true并行计算形状文件
6模型训练espnet2.bin.launch拉起分布式训练,输出到exp/enh_train_raw(由--enh_config推导的 tag)
7推理增强espnet2.bin.enh_inference对验证/测试集输出增强语音spk1.scp
8指标评分espnet2.bin.enh_scoring计算 STOI/SAR/SDR/SIR/SI_SNR,并调用show_enh_score.sh生成RESULTS.md
9-10(可选)ASR 评测使用预训练 ASR 计算 WER/CER
11模型打包espnet2.bin.pack生成可发布 zip
12上传 HuggingFace需配置hf_repo与 git-lfs

其中 Stage 3 的format_wav_scp.sh会把wav.scp(可能含管道命令)转换为真实音频文件并统一采样率;Stage 8 评分时对观测信号(observation)与增强信号各评一次,最终增强结果的 Markdown 表格由 scripts/utils/show_enh_score.sh 自动汇总生成——README 中的结果表格即由此脚本产出。

常用运行方式(从数据准备开始全流程执行,或在已有数据上从训练阶段开始):

# 在 egs2/dns_icassp22/enh1 目录下 ./run.sh --stage 1 --stop_stage 12 # 全流程 ./run.sh --stage 5 --stop_stage 8 # 数据已就绪,只做训练与评测 ./run.sh --stage 7 --stop_stage 8 # 模型已训练,只做推理与评分

评估结果与指标解读

原 README 记录的训练配置(enh_train_raw)在 DNS4 合成验证集上的客观指标如下:

datasetSTOISARSDRSIRSI_SNR
enhanced_cv_synthetic91.1415.7615.760.0015.56

指标说明(与espnet2.bin.enh_scoring实现一致):

  • STOI(91.14):短时客观可懂度,衡量增强语音的可懂性,越接近 100 越好;
  • SAR(15.76)/ SDR(15.76):信号到伪影比 / 信号失真比,SDR 是整体分离质量的综合指标;
  • SIR(0.00):信号到干扰比。由于本配方是单通道单说话人纯降噪任务(ref_num=1,无其他说话人干扰),干扰项基本为 0,故 SIR 为 0.00,这是正常现象而非缺陷;
  • SI_SNR(15.56):尺度不变信噪比,与训练目标一致,反映降噪前后信噪比提升程度。

需要说明的是,上述数值是配方作者在 2022 年环境下的复现结果,不同数据子集、训练随机性与硬件条件下重新运行会略有浮动;该表格可通过show_enh_score.sh在本地复现后对比。

实战要点与注意事项

  1. 磁盘与带宽是首要瓶颈:仅默认子集(read_speech + noise_fullband)解压后即超过 350G,务必在 download_dns4_dataset.sh 中按需裁剪BLOB_NAMES,例如实验量较小时可只保留少量read_speech分片;
  2. 混合时长控制:--total_hours 150远低于 DNS4 朗读语音总量(约 600 小时),意在避免训练与官方测试集数据重叠;加大该值可提升数据多样性,但会线性增加合成时间;
  3. 因果模型与流式推理:causal: True保证低延迟实时可用,TCNSeparator提供了forward_streaming接口支撑逐帧处理;若追求非因果的更高离线指标,可将其改为false(需同步调整 kernel/stride 配置);
  4. 评测口径:Stage 8 会分别输出观测信号(dump/raw/RESULTS.md)与增强信号(exp/.../RESULTS.md)的评分,对比两者可量化模型带来的增益;
  5. 从 Model Zoo 直接推理:enh.sh支持--download_model选项从 ESPnet Model Zoo 拉取预训练增强模型并直接推理评分,适合不想从零训练的用户。

小结

egs2/dns_icassp22/enh1是 ESPnet 中面向 48 kHz 全频带、因果实时语音增强的完整范本:官方数据下载与在线混合仿真解决了训练数据来源问题,conf/tuning/train.yaml给出了 Conv-TasNet 风格(卷积编码/解码 + 因果 TCN)的紧凑配置,enh.sh则把数据格式化、统计、训练、推理、评分、打包串联为可复现的流水线。读者既可端到端复现 README 中记录的 STOI 91.14 / SI-SNR 15.56 结果,也可在此基础上调整--total_hours、--fs、causal等参数,快速迁移到自己的降噪任务。

  • 人工智能
  • 语音
  • 音频
  • 深度学习
  • NLP

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

项目地址:https://gitcode.com/gh_mirrors/es/espnet
点击查看免费下载

相关推荐

上一篇:终极指南:StofDoctrineExtensionsBundle 常见问题快速解决方案
下一篇:基于 MCP 构建 Microsoft 365 Copilot 声明式 Agent:mcp-m365-agent-expert 实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询