- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
本文以 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):
- stage 0:下载 WHAM! 噪声数据(约 17.65 GB,解压后约 35 GB),可自行通过
wham_noise变量指定本地已有噪声目录; - stage 1:克隆 LibriMix 工具仓库,执行
augment_train_noise.py扩充训练集噪声,再用create_librimix_from_metadata.py依据--freqs(采样率)、--modes(min/max)、--n_src(说话人数)生成mix_clean、mix_both、mix_single三类混合; - stage 2:从 Libri2Mix 的
mix_both元数据构造 Kaldi 风格数据目录,产出wav.scp、spk1.scp、spk2.scp、noise1.scp、utt2spk等文件——这正是--use_noise_ref true所需的噪声参考轨道; - stage 3:按
train-100/train-360子集切分训练数据; - 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的结果表如下(数值为原文档记录):
| dataset | STOI | SAR | SDR | SIR |
|---|---|---|---|---|
| enhanced_dev | 0.85 | 11.10 | 10.67 | 22.65 |
| enhanced_test | 0.85 | 10.92 | 10.42 | 22.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,符合分离网络"优先压制干扰、再优化整体失真"的典型训练行为。
快速复现路径
如需在当前仓库复现本实验,可按以下步骤(仓库为只读,所有操作均在本地副本进行):
- 进入实验目录:
egs2/librimix/enh1/,按 tools/README.md 安装好 ESPnet 及其依赖; - 在 egs2/librimix/enh1/db.sh 中填写本机
LIBRISPEECH数据路径(local/data.sh会据此生成 Libri2Mix 混合数据); - 直接运行
./run.sh,脚本会自动完成 WHAM 噪声下载、LibriMix 数据模拟、数据准备、训练(4 GPU)、推理与评分;也可以按需追加参数,例如./run.sh --stage 3 --stop_stage 8跳过数据下载直接训练,或用--enh_args "--max_epoch 100"缩短训练周期; - 训练完成后,在
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
相关推荐
SpeechBrain 盲 SI-SNR 估计(Blind SI-SNR Estimation)实战指南:基于 REAL-M 与 LibriMix/WHAMR! 的无参考语音分离质量评估
SpeechBrain 盲 SI SNR 估计(Blind SI SNR Estimation)实战指南:基于 REAL M 与 LibriMix/WHAMR!
人工智能深度学习语音音频NLP预训练ESPnet语音分离评估指标:SDR、SI-SNR与PESQ
ESPnet语音分离评估指标:SDR、SI SNR与PESQ 在语音处理领域,如何客观评价语音分离模型的性能是一项关键任务。本文将详细介绍ESPnet工具包中常
人工智能语音音频深度学习NLPSpeechBrain中的Conv-TasNet:双通道语音分离实现
SpeechBrain中的Conv TasNet:双通道语音分离实现 在日常会议、视频通话或嘈杂环境中,我们常常需要从混合语音中分离出特定说话人的声音。想象一下
人工智能深度学习语音音频NLP预训练
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考