☰
ESPnet LibriMix 语音分离实验结果解析:从 Conv-TasNet 配置到 SI-SNR 评估全流程
2026/9/25 5:48:31 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频
  • 深度学习
  • NLP

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

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

本文以 ESPnet 仓库中 egs2/librimix/enh1/RESULTS.md 记录的一份官方语音分离(speech separation)实验结果为切入点,完整解读其背后的数据生成、模型配置、训练与评分链路。读完本文,你将掌握 ESPnet2 增强(enh)任务的 LibriMix 实验复现方法、conf/train.yaml中 Conv-TasNet 风格模型的每一处关键参数,以及 STOI / SAR / SDR / SIR 等分离指标在enhanced_dev、enhanced_test上的解读方式。

RESULTS.md 记录了什么

egs2/librimix/enh1/RESULTS.md是 ESPnet2 语音增强/分离任务的标准结果登记文件,内容精炼但信息密度很高,完整记录了:

  • 实验运行环境(ESPnet 版本、Python、PyTorch、Git 提交号与日期);
  • 训练入口与模型命名(enh_train_raw,模型权重托管于 Zenodo);
  • 数据与任务设定(采样率8k、混合方式min_or_max=min);
  • 验证集与测试集的四类分离指标(STOI、SAR、SDR、SIR)。

该文件的生成并不依赖人工撰写:当enh.sh完成第 8 阶段(Scoring)后,会调用./scripts/utils/show_enh_score.sh "${_dir}/../.." > "${_dir}/../../RESULTS.md"自动汇总各数据集评分并输出到RESULTS.md(见 enh.sh)。因此这份文件既是结果快照,也是 ESPnet 增强任务"训练 → 推理 → 自动评分 → 汇总"闭环的最终产物。

实验环境快照

原文档记录的运行环境如下(数值与版本信息均出自 RESULTS.md 原文,不应当作当前仓库的推荐环境):

  • date:Mon Jan 25 19:16:45 CST 2021
  • python version:3.6.3 |Anaconda, Inc.| (default, Nov 20 2017, 20:41:42) [GCC 7.2.0]
  • espnet version:espnet 0.9.7
  • pytorch version:pytorch 1.6.0
  • Git hash:dcaba2585e28b85c815807165ba9953565ee8694
  • Commit date:Thu Jan 21 21:26:59 2021 +0800

这段环境信息提示我们:RESULTS.md属于早前版本(ESPnet 0.9.7)的归档结果。在复现时,应优先使用当前仓库对应的依赖与安装方式,并以自己跑出的评分为准;该表可作为模型能力与训练策略的参考基线。

任务与数据设定:Libri2Mix + WHAM 噪声的 8k 分离任务

RESULTS.md中enh_train_raw一节写明sample_rate: 8k、min_or_max: min,这两个参数直接对应 run.sh 中的顶层设定:

sample_rate=8k min_or_max=min # "min" or "max". This is to determine how the mixtures are generated in local/data.sh.

其语义在 local/data.sh 中有明确定义:

  • --min_or_max:决定混合信号的生成方式。min表示按"较短语音"长度对齐生成混合;max表示按"较长语音"长度对齐。脚本会校验取值只能是min或max,否则直接报错退出(data.sh);
  • --sample_rate:只允许8k或16k(data.sh)。RESULTS.md记录的是8k版本,采样率降低后计算成本与数据体积更小,便于快速验证模型;
  • num_spk:支持2或3,默认2,对应 Libri2Mix / Libri3Mix(data.sh)。

local/data.sh的完整流水线分为五个阶段(data.sh):

  1. stage 0:下载 WHAM! 噪声数据(约 17.65 GB,解压后约 35 GB),可自行通过wham_noise变量指定本地已有噪声目录;
  2. stage 1:克隆 LibriMix 工具仓库,执行augment_train_noise.py扩充训练集噪声,再用create_librimix_from_metadata.py依据--freqs(采样率)、--modes(min/max)、--n_src(说话人数)生成mix_clean、mix_both、mix_single三类混合;
  3. stage 2:从 Libri2Mix 的mix_both元数据构造 Kaldi 风格数据目录,产出wav.scp、spk1.scp、spk2.scp、noise1.scp、utt2spk等文件——这正是--use_noise_ref true所需的噪声参考轨道;
  4. stage 3:按train-100/train-360子集切分训练数据;
  5. stage 4:基于 LibriSpeech 文本,为每个说话人生成text_spk1、text_spk2等标注文件(供后续可选 ASR 评分使用)。

run.sh将训练/验证/测试集分别设为train、dev、test,并把--use_noise_ref true、--audio_format wav、--lang en、--ngpu 4等参数透传给 enh.sh 执行完整实验(run.sh)。

模型配置详解:Conv-TasNet 风格时域分离网络

RESULTS.md中的config: ./conf/train.yaml指向 conf/train.yaml,它是本次实验的模型骨架,结构上对应经典 Conv-TasNet 的"编码器-分离器-解码器"三段式设计,但全部在时域波形上进行:

optim: adam init: xavier_uniform max_epoch: 200 batch_type: folded batch_size: 6 # batch_size 16 can be trained on 4 RTX 2080ti iterator_type: chunk chunk_length: 24000 num_workers: 4 optim_conf: lr: 1.0e-03 weight_decay: 0 patience: 5 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.5 patience: 1 model_conf: loss_type: si_snr encoder: conv encoder_conf: channel: 512 kernel_size: 16 stride: 8 decoder: conv decoder_conf: channel: 512 kernel_size: 16 stride: 8 separator: tcn separator_conf: num_spk: 2 layer: 8 stack: 3 bottleneck_dim: 128 hidden_dim: 512 kernel: 3 causal: False norm_type: "gLN" nonlinear: relu

关键参数解读如下:

  • 优化与训练:adam优化器 +xavier_uniform初始化,初始学习率1.0e-03;max_epoch: 200,配合reducelronplateau(mode: min、factor: 0.5、patience: 1)在验证 loss 停滞时减半学习率;patience: 5控制提前停止。batch_size: 6是针对 4 张 RTX 2080 Ti 的显存折中选择(配置注释明确指出 16 的 batch 也能在同样硬件上训练,可通过--enh_args "--batch_size 16"覆盖)。
  • 数据切块:iterator_type: chunk+chunk_length: 24000,即训练时从每段波形中切出 24000 个采样点(8k 采样率下约 3 秒)作为输入块,batch_type: folded将 chunk 折叠为 batch 维度。
  • 模型选择与保存:best_model_criterion采用双指标——验证集si_snr取max、验证集loss取min;keep_nbest_models: 1只保留最优模型。这与enh.sh默认的推理模型名valid.loss.ave.pth(平均化模型)形成配合。
  • 损失函数:model_conf.loss_type: si_snr,即尺度不变信噪比(Scale-Invariant SNR)损失,这是语音分离领域的主流训练目标,与评分阶段的 SI-SNR 指标呼应。
  • 时域编解码器:encoder: conv与decoder: conv共享相同配置(channel: 512、kernel_size: 16、stride: 8),相当于可学习的 STFT 与 ISTFT 替代;编码器将波形切分为 512 维的时域特征,解码器将其重建为波形。
  • TCN 分离器:separator: tcn是核心分离模块,配置为layer: 8、stack: 3(8 层 × 3 个堆叠的时域卷积块)、bottleneck_dim: 128、hidden_dim: 512、kernel: 3;causal: False表示非因果模式(可用整段上下文,通常带来更好性能);norm_type: "gLN"采用全局层归一化(global LayerNorm);nonlinear: relu。num_spk: 2对应 Libri2Mix 的双说话人分离任务。

作为对照,仓库还提供了另一份频域掩码方案 conf/tuning/train_enh_rnn_tf.yaml:它使用encoder: stft/decoder: stft(n_fft: 256、hop_length: 128),separator: rnn(4 层 BLSTM、512 单元、0.5 dropout),损失为mask_mse且掩码类型mask_type: psm(相位敏感掩码)。这组 tuning 配置说明同一数据与评分体系下,ESPnet 支持"时域端到端"与"频域掩码"两种路线,可依据计算资源与性能目标切换。

训练、推理与评分流水线

enh.sh是本次实验的执行引擎,其关键环节与RESULTS.md直接对应:

  • 实验目录命名:未显式指定--enh_exp时,默认输出目录为exp/enh_${enh_tag},其中enh_tag由配置文件自动生成,例如本实验即为enh_train_raw(train.yaml+feats_type=raw的组合,见 enh.sh)。
  • 推理:enh.sh在推理阶段并行调用espnet2.bin.enh_inference,将每个说话人输出写入spk${i}.scp,默认推理参数--normalize_output_wav true --output_format wav保证输出为可直接播放的 wav(enh.sh)。
  • 评分:第 8 阶段(Scoring)对"观测信号(原始混合)"与"增强信号(模型输出)"分别评分(score_obs=true/false两轮)。评分命令为python -m espnet2.bin.enh_scoring,通过--ref_scp传入各说话人参考轨道、--inf_scp传入待评信号,--ref_channel指定参考通道,--flexible_numspk处理输出数与参考数不一致的情形(enh.sh)。
  • 协议与汇总:默认scoring_protocol="STOI SDR SAR SIR SI_SNR"(enh.sh)。每个协议按说话人求平均后,show_enh_score.sh汇总为RESULTS.md。观测信号的结果写入dump/raw/RESULTS.md,增强信号的结果写入exp/enh_train_raw/RESULTS.md,两者可以横向对比分离带来的增益。

结果解读:STOI、SAR、SDR、SIR

RESULTS.md中enh_train_raw的结果表如下(数值为原文档记录):

datasetSTOISARSDRSIR
enhanced_dev0.8511.1010.6722.65
enhanced_test0.8510.9210.4222.08

各指标含义与解读:

  • STOI(Short-Time Objective Intelligibility):短时客观可懂度,取值 0~1,越接近 1 表示语音可懂性越高。此处 dev/test 均为0.85,说明模型在两套数据上保持了稳定且较高的可懂度。
  • SDR(Signal-to-Distortion Ratio):信号失真比,衡量分离信号相对理想源的整体质量,10.67(dev)与10.42(test)说明分离后的语音能量集中、失真较低。
  • SAR(Signal-to-Artifact Ratio):伪影比,反映分离输出中人工伪影的抑制程度,11.10/10.92表明模型几乎没有引入结构性伪影。
  • SIR(Signal-to-Interference Ratio):干扰抑制比,衡量对另一说话人串扰的抑制效果,22.65/22.08是四者中最高的,说明双说话人间的互扰被有效压制——这正是separator_conf中 3 个堆叠 TCN 块与 512 维隐藏单元所承担的核心职责。

整体来看,dev 与 test 四项指标差异极小(SDR 相差 0.25、SIR 相差 0.57),说明模型泛化稳定;SIR 显著高于 SAR 与 SDR,符合分离网络"优先压制干扰、再优化整体失真"的典型训练行为。

快速复现路径

如需在当前仓库复现本实验,可按以下步骤(仓库为只读,所有操作均在本地副本进行):

  1. 进入实验目录:egs2/librimix/enh1/,按 tools/README.md 安装好 ESPnet 及其依赖;
  2. 在 egs2/librimix/enh1/db.sh 中填写本机LIBRISPEECH数据路径(local/data.sh会据此生成 Libri2Mix 混合数据);
  3. 直接运行./run.sh,脚本会自动完成 WHAM 噪声下载、LibriMix 数据模拟、数据准备、训练(4 GPU)、推理与评分;也可以按需追加参数,例如./run.sh --stage 3 --stop_stage 8跳过数据下载直接训练,或用--enh_args "--max_epoch 100"缩短训练周期;
  4. 训练完成后,在exp/enh_train_raw/RESULTS.md查看增强信号评分,在dump/raw/RESULTS.md查看原始混合信号评分,对比分离增益。

延伸阅读

  • 任务模板与脚本:egs2/librimix/enh1/下的 run.sh、enh.sh、local/data.sh;
  • 频域掩码对照组配置:conf/tuning/train_enh_rnn_tf.yaml;
  • 增强任务通用模板与说明:egs2/TEMPLATE/enh1;
  • 评分指标实现:espnet2.bin.enh_scoring(可在 espnet2/bin 目录下找到对应源码继续深入);
  • 数据格式约定(wav.scp / spk1.scp 等):doc/espnet2_structured_data.md。

综上,这份RESULTS.md虽然只有十余行,却串联起 ESPnet2 增强任务从数据生成、模型配置到自动评分的完整证据链。以它为入口,配合 conf/train.yaml 与 enh.sh,即可在自己的数据集上复现并扩展这套 Conv-TasNet 风格的双说话人分离方案。

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

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

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

相关推荐

上一篇:工业4.0时代的Python效率革命:30秒代码片段驱动智能工厂数据处理
下一篇:es-toolkit FP 系列:用 `pipe` 组合 Fisher-Yates 洗牌的 `shuffle()` 算子

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

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

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

立即咨询