如何用 NeMo MarbleNet 完成语音活动检测(VAD)推理
如何用 NeMo MarbleNet 完成语音活动检测VAD推理【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech你手上有一批音频需要判断哪些时间区间里有人说话并得到带起止时间的语音片段。NeMo Speech 仓库中的 MarbleNet 就是为语音活动检测VAD设计的端到端神经网络Frame-VAD 对每个 20ms 帧输出语音/非语音概率再经后处理生成 RTTM 格式的语音片段文件。本文走仓库examples/asr/speech_classification目录中的默认 Frame-VAD 推理路径frame_vad_infer.py 预训练模型vad_multilingual_frame_marblenet覆盖输入准备、执行推理、核对输出、带 groundtruth 评估的完整过程。先了解 MarbleNet VAD 模型MarbleNet 基于 MatchboxNet是 1D 时间-通道可分离卷积网络模型族命名为MarbleNet_[BxRxC]B 个 block每个 block 含 R 个卷积子块C 为通道数每个子块包含 1-D 可分离卷积、batch normalization、ReLU 和 dropout在 AVA speech 数据集上达到 state-of-the-art 性能由nemo.collections.asr.models.EncDecClassificationModel实例化详见 models.rst。仓库中有两类 VAD 模型Frame-VAD逐帧预测默认每 20ms 帧一个概率和 Segment-VAD每段音频给一个标签默认段长 0.63s。本文主路径是 Frame-VADSegment-VAD 放在文末替代路线。推理脚本自动选择设备有 CUDA 用 CUDA否则用 CPU见 frame_vad_infer.py。准备输入 manifest推理输入是一个 manifest json 文件每行一个 Python 字典audio_filepath、offset、duration为必需字段文档示例/path/to/...需替换为你环境中的实际音频路径{audio_filepath: /path/to/audio_file1, offset: 0, duration: 10000} {audio_filepath: /path/to/audio_file2, offset: 0, duration: 10000}注意事项音频文件名必须唯一。脚本以文件名主干stem作为 key 匹配输入与输出重名会导致输出对应关系混乱。duration的取值单位在文档示例中并不统一脚本 docstring 示例写的是10000而配置文件注释示例写的是1.23秒。按配置文件注释示例它是秒为时长的单位自己写 manifest 时填入音频的实际时长。推理配置固定sample_rate: 16000音频会按 16kHz 采样率处理见 frame_vad_infer_postprocess.yaml。执行 Frame-VAD 推理主路径环境要求Python 中已安装 torch 和 NeMo含 ASR collection。在examples/asr/speech_classification目录下运行文档命令的相对路径基于该目录python frame_vad_infer.py \ --config-path../conf/vad --config-nameframe_vad_infer_postprocess \ input_manifest/path/to/manifest.json \ output_dir/path/to/outputinput_manifest上一步准备好的 manifest。注意speech_classification README 的示例写的是dataset但脚本代码与 docstring 实际校验的是input_manifest未提供会直接抛ValueError本文按代码为准。output_dir结果输出目录脚本自动创建如果目录已存在日志会警告该目录仅适合在后处理参数调参时复用。模型来自配置的vad.model_path默认vad_multilingual_frame_marblenet可以填预训练模型名也可以填本地.nemo文件路径。脚本默认开启长音频自动切分prepare_manifest.split_duration: 400秒以避免 CUDA OOM。运行中会按顺序看到这些日志说明各阶段已完成Split long audio file to avoid CUDA memory issue切分长音频Loading manifest file ...加载 manifestFinish generating VAD frame level prediction. You can find the prediction in dir帧级预测完成Converting frame level prediction to RTTM files.后处理生成语音片段Finished writing VAD output to manifest: path和Done!推理结束核对输出与验证结果输出目录下的产物如下内容位置帧级预测output_dir/frame_preds/语音片段RTTM 格式output_dir/rttm_preds/输出 manifestoutput_dir/manifest_vad_output.json输出 manifest 是在输入 manifest 基础上为每条记录追加rttm_filepath字段指向该音频的 RTTM 文件如果某个 RTTM 文件没找到日志会打印警告该字段写为空字符串。配置中vad.use_rttm默认为True输出 RTTM 格式改成False则输出起止时间表格而非 RTTM。直接打开 RTTM 文件即可查看该音频检测到的语音片段起止时间。也可以用仓库提供的函数把波形和 VAD 标签画在一起核对文档示例audio_file、rttm_file从输出 manifest 中取duration1000为示例值from nemo.collections.asr.parts.utils.vad_utils import plot_sample_from_rttm plot_sample_from_rttm( audio_file/path/to/audio_file.wav, rttm_file/path/to/rttm_file.rttm, offset0.0, duration1000, save_pathvad_pred.png )有 groundtruth 时评估 AUROC 与 DER如果你的 manifest 带标注可以量化模型检测效果在 frame_vad_infer_postprocess.yaml 中把evaluate设为true默认false在 manifest 中提供 groundtruth两种方式任选其一文档示例{audio_filepath: /path/to/audio_file1.wav, offset: 0, duration: 10000, label: 0 1 0 0 0 1 1 1 0}{audio_filepath: /path/to/audio_file1.wav, offset: 0, duration: 10000, rttm_filepath: /path/to/rttm_file1.rttm}脚本在日志末尾输出评估结果日志格式示例具体数值由运行时计算不是固定值AUROC: 0.xxxx DetERx.xxxx, False Alarmx.xxxx, Missx.xxxx with params: {...当前 postprocessing 参数...}可选调整语音段后处理参数配置中vad.parameters.postprocessing控制帧级预测如何转成语音段默认值为含义见配置文件注释onset: 0.3/offset: 0.3检测语音开始、结束的阈值pad_onset: 0.2/pad_offset: 0.2每个语音段前后追加的时长min_duration_on: 0.2/min_duration_off: 0.2删除过短语音段 / 过短非语音段的阈值filter_speech_first: True。配置文件注释明确提醒这些参数未在大数据集上调整过使用默认参数需留意。调参时脚本允许复用已有输出目录检测到目录已存在时会打印警告提示该目录仅用于调参场景。替代路线Segment-VAD 与 ASRVAD 脚本Segment-VAD可选对每段音频默认窗口 0.63s、步进 0.08s预测单个标签模型为vad_multilingual_marblenet在examples/asr/speech_classification目录下运行python vad_infer.py \ --config-path../conf/vad \ --config-namevad_inference_postprocessing \ dataset/path/to/manifest.json说明原 README 中这条命令缺少行尾续行符此处已修正形式。帧级预测输出到vad_frame默认输出 manifest 为vad_out.json见 vad_inference_postprocessing.yaml。ASRVAD 脚本的 VAD-only 模式可选examples/asr/asr_vad 提供speech_to_text_with_vad.py可同时跑 ASR 和 VAD也可以只跑 VAD。只跑 VAD 时设asr_modelNone并同时指定vad_model和vad_configpython speech_to_text_with_vad.py \ manifest_filepath/path/to/MANIFEST.json \ vad_modelvad_multilingual_frame_marblenet \ asr_modelNone \ vad_config../conf/vad/frame_vad_infer_postprocess.yaml该脚本除 manifest 外也支持直接传入音频目录audio_diraudio_type默认wav。限制与注意长音频默认每 400 秒切分一次推理切分点附近的帧因上下文被截断表现可能变差若仍遇到 CUDA 内存不足把prepare_manifest.split_duration调小。Frame-VAD 要求shift_length_in_sec为 0.02、window_length_in_sec为 0预训练 NeMo VAD 模型的固定约束见配置注释。配置中的smoothing和overlap对 Frame-VAD 标记为 Deprecated可忽略。进一步参考speech_classification READMEFrame-VAD / Segment-VAD 的训练、推理与评估说明asr_vad READMEASRVAD 推理管线的输入输出与 RTTM 用法frame_vad_infer.py本文主路径脚本的完整参数与日志逻辑【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考