- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
本文围绕 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 行):
- 优先尝试从
wav.scp指向的 SPHERE 格式文件头(sample_rate -i、sample_count -i)解析时长,无需读取整个音频文件; - 若
wav.scp不是 sph2pipe + sphere 文件的标准格式(例如指向普通 WAV 文件),Perl 解析会失败,脚本打印 “could not get recording lengths from sphere-file headers, using wav-to-duration”; - 回退路径检查
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 - 将
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 的路径。结合仓库现状,具体落地方式如下:
- 安装 Kaldi 并确保
wav-to-duration可执行:在 ESPnet 的tools/目录完成 Kaldi 安装后,wav-to-duration会被编译到 Kaldi 的src/featbin(或src/bin)下; - 让示例的
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 # 有输出则路径配置正确 - 验证数据流水线:重新运行
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
相关推荐
ESPnet mini_librispeech diar1 配方实战:基于 SA-EEND 与 EEND-EDA 的端到端说话人日志化实验全解析
ESPnet mini_librispeech diar1 配方实战:基于 SA EEND 与 EEND EDA 的端到端说话人日志化实验全解析 说话人日志化(
人工智能语音音频深度学习NLPESPnet EEND-SS 实践指南:基于 LibriMix 的联合说话人日志与语音分离(enh_diar1)
ESPnet EEND SS 实践指南:基于 LibriMix 的联合说话人日志与语音分离(enh_diar1) 本文围绕 ESPnet 仓库中 egs2/li
人工智能语音音频深度学习NLPpyannote-audio说话人日志中精确控制说话人数量的技术解析
pyannote audio说话人日志中精确控制说话人数量的技术解析 在语音处理领域,说话人日志 diarization 是一项关键技术,它能够识别音频中不同说
人工智能语音音频深度学习预训练微调
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考