☰
ESPnet egs2 说话人日志示例的 Kaldi 依赖解析:mini_librispeech/diar1 与 `wav-to-duration`
2026/9/25 6:05:13 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频
  • 深度学习
  • NLP

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

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

本文围绕 egs2/mini_librispeech/diar1/NOTE.md 展开,说明一个容易被忽略的部署事实:ESPnet 的egs2示例目录本应在无 Kaldi 的环境下运行,但说话人日志(Speaker Diarization)示例mini_librispeech/diar1因数据处理脚本的限制,仍强制依赖 Kaldi 工具集中的wav-to-duration程序。读完本文,你将理解该依赖产生的具体原因、它在数据流水线中的调用位置与回退逻辑,以及如何正确配置 Kaldi 路径以避免运行中断。

背景:egs2 目录与 Kaldi 的“一般约定”

ESPnet 官方安装文档对egs(experiment/grid 的简称)目录有明确分工:egs是面向 Kaldi 兼容工作流的旧版示例集合,而egs2是新一代、不依赖 Kaldi 的示例集合。也就是说,按照一般约定,egs2下的食谱(recipe)只需要 ESPnet 自身的 Python 环境(由tools/下脚本激活)即可运行,无需安装完整 Kaldi 工具链。

mini_librispeech/diar1却打破了这一约定。正如 NOTE.md 所述,该示例位于egs2目录中、本不应要求安装 Kaldi,但“由于与数据处理相关的脚本的限制”(due to the limitation of a script related to data processing),它仍然需要一个名为wav-to-duration的 Kaldi 程序,因此必须按照安装指引正确设置 Kaldi 的路径。

依赖的根源:get_reco2dur.sh与get_utt2dur.sh的持续时长计算

wav-to-duration并非被示例的业务代码直接调用,而是藏在其引入的 Kaldi 数据工具脚本中。本示例在生成模拟混合语音数据后,需要为每个录音(recording)计算时长并生成reco2dur文件,这一步由以下两个脚本承担:

  • egs2/mini_librispeech/diar1/utils/data/get_reco2dur.sh
  • egs2/mini_librispeech/diar1/utils/data/get_utt2dur.sh

以get_reco2dur.sh为例,其工作流程是(脚本第 56–124 行):

  1. 优先尝试从wav.scp指向的 SPHERE 格式文件头(sample_rate -i、sample_count -i)解析时长,无需读取整个音频文件;
  2. 若wav.scp不是 sph2pipe + sphere 文件的标准格式(例如指向普通 WAV 文件),Perl 解析会失败,脚本打印 “could not get recording lengths from sphere-file headers, using wav-to-duration”;
  3. 回退路径检查wav-to-duration是否在PATH中,若不存在则直接报错退出:
    if ! command -v wav-to-duration >/dev/null; then echo "$0: wav-to-duration is not on your path" exit 1; fi
  4. 将wav.scp按并行度nj(默认 4)切分后,通过队列命令逐 JOB 调用:
    wav-to-duration --read-entire-file=$read_entire_file \ scp:$temp_data_dir/JOB/wav.scp ark,t:$temp_data_dir/JOB/reco2dur

    --read-entire-file默认为false,但当wav.scp中包含sox ... speed加速扰动命令时会被置为true,此时必须读完整文件以修正时长,脚本会提示这会明显变慢。

get_utt2dur.sh的机制与之一致(脚本第 78–101 行),用于在segments缺失时从wav.scp推导每个 utterance 的时长。

调用链:从data.sh的混合语音模拟到reco2dur

在mini_librispeech/diar1中,触发该依赖的具体调用链如下:

  • egs2/mini_librispeech/diar1/run.sh 是顶层入口,它把train_set、valid_set、test_sets全部指向模拟数据目录(如simu/data/train_clean_5_ns2_beta2_500),并调用 diar.sh 执行完整流水线;
  • 数据准备阶段由 egs2/mini_librispeech/diar1/local/data.sh 完成:先下载并切分 Mini-LibriSpeech(dev-clean-2、train-clean-5)、噪声(musan)与模拟 RIR(sim_rir_8k.zip),再调用local/simulation/下的random_mixture.py/make_mixture.py等脚本生成两说话人混合语音;
  • 混合数据就绪后,data.sh 第 124–128 行 依次执行utils/combine_data.sh合并分片数据、用steps/segmentation/convert_utt2spk_and_segments_to_rttm.py生成 RTTM 标注,并调用utils/data/get_reco2dur.sh计算录音时长;
  • 此处的wav.scp指向的是刚生成的普通 WAV 文件(8 kHz 采样率),并非 SPHERE 格式,因此get_reco2dur.sh必然走入第 3–4 步的wav-to-duration回退路径——这正是 NOTE.md 所警告的 Kaldi 依赖被触发的实际位置。

可以推断:get_reco2dur.sh/get_utt2dur.sh是从 Kaldi 工具集直接复制的通用脚本(脚本头部版权标注 Johns Hopkins University 的 Daniel Povey 等人,Apache 2.0 许可),它们保留了基于 SPHERE 头的快速路径与基于wav-to-duration的通用回退路径,因而把 Kaldi 依赖“带进”了本应无 Kaldi 的egs2示例。

正确配置 Kaldi 路径

NOTE.md 给出的核心行动建议是:务必按照 ESPnet 安装指引正确设置 Kaldi 的路径。结合仓库现状,具体落地方式如下:

  1. 安装 Kaldi 并确保wav-to-duration可执行:在 ESPnet 的tools/目录完成 Kaldi 安装后,wav-to-duration会被编译到 Kaldi 的src/featbin(或src/bin)下;
  2. 让示例的PATH包含 Kaldi 的featbin目录:egs2/mini_librispeech/diar1/path.sh 会把$PWD/utils/加入PATH,并通过tools/extra_path.sh引入 ESPnet 自身工具;当检测到tools/activate_python.sh时还会激活 Python 环境。Kaldi 的二进制目录通常由安装脚本或环境变量(如KALDI_ROOT)间接加入PATH,运行前可用以下命令自检:
    command -v wav-to-duration # 有输出则路径配置正确
  3. 验证数据流水线:重新运行local/data.sh --stage 1(或完整的run.sh),若wav-to-duration不在PATH中,get_reco2dur.sh会在日志中打印wav-to-duration is not on your path并以非零状态退出;配置正确后,会在simu/data/<simuid>/下生成与wav.scp行数一致的reco2dur文件(脚本末尾还会对两者行数做一致性检查,见 get_reco2dur.sh 第 131–139 行)。

延伸:该示例的数据规模与模型配置

除 Kaldi 依赖外,mini_librispeech/diar1还自带完整的模拟数据参数与训练/解码配置,可一并了解:

  • 模拟配置(local/data.sh 第 15–20 行):simu_opts_overlap=yes(说话人重叠)、simu_opts_num_speaker=2(双说话人)、simu_opts_sil_scale=2、simu_opts_rvb_prob=0.5(混响概率)、simu_opts_num_train=500(每集合 500 条混合语音);
  • 训练/解码配置:conf/train_diar.yaml 对应 SA-EEND 模型(已知说话人数),conf/train_diar_eda.yaml 对应 EEND-EDA 模型(无需说话人数先验,但仍将训练与测试说话人数限制为 2),两者共用 conf/decode_diar.yaml 解码配置;
  • 结果复现:egs2/mini_librispeech/diar1/README.md 记录了dev_clean_2_ns2_beta2_500上的 DER 结果表,其中 SA-EEND 在threshold 0.5 / median 11 / collar 0.0下 DER 为 29.37%,EEND-EDA 同参数下为 32.50%——可作为运行后自检的参考基准(注意其为 2021 年记录的初步实验数据)。

小结

mini_librispeech/diar1/NOTE.md用极简的篇幅指出了一个关键的环境前提:即便在egs2目录下,说话人日志示例仍因get_reco2dur.sh/get_utt2dur.sh的通用回退逻辑而依赖 Kaldi 的wav-to-duration。只要在运行前确保wav-to-duration已安装且位于PATH中,整个模拟数据生成、RTTM 标注与 EEND 系列模型训练/解码流程即可正常推进。这一案例也提醒所有使用egs2示例的开发者:个别食谱可能保留 Kaldi 遗留依赖,动手前先阅读该示例的NOTE.md与数据处理脚本,能省去大量排错时间。

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

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

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

相关推荐

上一篇:Atlassian Agent:企业级许可证管理解决方案
下一篇:为什么Arc Theme成为最受欢迎的Linux扁平主题?核心功能深度测评

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

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

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

立即咨询