- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
本指南以 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
- Commit date:
需要说明的是:上述环境信息只是配方作者当时的运行环境记录,当前仓库已随 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 合成验证集上的客观指标如下:
| dataset | STOI | SAR | SDR | SIR | SI_SNR |
|---|---|---|---|---|---|
| enhanced_cv_synthetic | 91.14 | 15.76 | 15.76 | 0.00 | 15.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在本地复现后对比。
实战要点与注意事项
- 磁盘与带宽是首要瓶颈:仅默认子集(read_speech + noise_fullband)解压后即超过 350G,务必在 download_dns4_dataset.sh 中按需裁剪
BLOB_NAMES,例如实验量较小时可只保留少量read_speech分片; - 混合时长控制:
--total_hours 150远低于 DNS4 朗读语音总量(约 600 小时),意在避免训练与官方测试集数据重叠;加大该值可提升数据多样性,但会线性增加合成时间; - 因果模型与流式推理:
causal: True保证低延迟实时可用,TCNSeparator提供了forward_streaming接口支撑逐帧处理;若追求非因果的更高离线指标,可将其改为false(需同步调整 kernel/stride 配置); - 评测口径:Stage 8 会分别输出观测信号(
dump/raw/RESULTS.md)与增强信号(exp/.../RESULTS.md)的评分,对比两者可量化模型带来的增益; - 从 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
相关推荐
ESPnet DNS Interspeech 2020 语音增强 Recipe 实战指南:从 BLSTM 到 TFGridNet 的完整复现与评分解读
ESPnet DNS Interspeech 2020 语音增强 Recipe 实战指南:从 BLSTM 到 TFGridNet 的完整复现与评分解读 本指南以
人工智能语音音频深度学习NLPESPnet2 复现 DNS ICASSP 2021 语音增强(enh1)recipe 实战:从数据仿真到 TCN 降噪与结果评测
ESPnet2 复现 DNS ICASSP 2021 语音增强(enh1)recipe 实战:从数据仿真到 TCN 降噪与结果评测 本文以 egs2/dns_i
人工智能语音音频深度学习NLPESPnet2 MS-SNSD 语音增强 Recipe 实战指南:基于 TF-GridNet 的增强基线复现
ESPnet2 MS SNSD 语音增强 Recipe 实战指南:基于 TF GridNet 的增强基线复现 本指南以 egs2/ms_snsd/enh1/RE
人工智能语音音频深度学习NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考