使用 Candle 运行 Silero VAD:基于 ONNX 的 Rust 流式语音活动检测实战
人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载语音活动检测Voice Activity Detection, VAD是音频处理中最基础也最关键的环节之一它决定了这段音频里人到底有没有在说话。本文基于当前仓库中的 candle-examples/examples/silero-vad/README.md 与对应示例源码完整讲解如何用 Rust 与 Candle 加载 Silero VAD v5 的 ONNX 模型通过命令行管道stdin消费流式 PCM 音频逐帧输出说话概率预测。读完本文你将掌握该示例的全部命令行参数、两种麦克风采集方案arecord 与 SoX、帧/上下文frame/context机制的源码级原理以及如何在 Candle 的 ONNX 推理链路中维护 VAD 的循环状态state。Silero VAD 是什么为什么选择在 Candle 中运行Silero VAD v5 是一个开源的语音活动检测模型专为流式音频场景设计它按固定长度的帧chunk接收音频对每一帧输出一个 0 到 1 之间的说话概率并维护一个跨帧传递的内部状态state从而让模型能感知历史音频上下文在噪声、静音与人声交界处做出更稳定的判断。由于模型以 ONNX 格式分发恰好与 Candle 的 ONNX 推理能力candle-onnx天然契合——不需要训练或转换权重直接从 Hugging Face Hub 拉取 ONNX 文件即可在纯 Rust 程序中完成推理。当前仓库中的示例使用 onnx-community/silero-vad 可以看到默认情况下它会通过 Candle 的 hub 封装candle-examples/src/hub.rs自动下载该模型也支持通过--model-id直接指定本地模型文件路径绕过在线下载。构建与运行前的准备该示例并不是默认 feature需要显式启用onnx特性这一约束在 candle-examples/Cargo.toml 中有明确声明[[example]] name silero-vad required-features [onnx]因此构建命令必须带上--features onnxcargo run --example silero-vad --release --features onnx -- --sample-rate 16000几点补充说明onnx特性对应candle-onnx依赖见 candle-examples/Cargo.toml它负责解析 ONNX protobuf 并执行计算图求值。如果你打算用 CUDA 加速可以再加上--features cuda在 candle-examples/Cargo.toml 中cuda特性会联动启用candle/cuda与cudaforgemacOS 上则可选用--features metal。编译candle-onnx时要求系统中有protoc可用如果报 Could not findprotocinstallation需要先安装 protoc 并加入PATH详见 candle-onnx/README.md。首次运行会自动从 Hugging Face Hub 下载模型缓存机制与进度显示见 candle-examples/src/hub.rs之后会命中本地缓存不再重复下载。命令行参数逐一解析主程序使用clap解析参数见 main.rs全部参数如下表参数类型默认值说明--cpu布尔false强制在 CPU 上运行而非 GPU--tracing布尔false开启 Chrome tracing生成trace-timestamp.json性能分析文件--input字符串无指定输入源当前实现中音频从 stdin 读取--sample-rate枚举无必填采样率仅支持8000或16000--model-id字符串无本地 ONNX 模型文件路径不传则自动从 Hub 下载--config-file字符串无配置文件路径--which枚举silero选择模型目前仅有silero一个取值其中最关键的是--sample-rate。它直接决定了两组核心参数见 main.rs8 kHz帧大小frame_size 256上下文大小context_size 3216 kHz帧大小 512上下文大小 64。--which枚举中保留了一个量化的SileroQuantized分支但源码中以注释明确标注 candle-onnx doesnt support Int8 dtypemain.rs因此当前只有 FP32 的silero模型可以实际运行。方式一用 arecord 采集麦克风arecord是 ALSAAdvanced Linux Sound Architecture自带的命令行录音工具。原文档给出的命令$ arecord -t raw -f S16_LE -r 16000 -c 1 -d 5 - | cargo run --example silero-vad --release --features onnx -- --sample-rate 16000命令拆解-t raw输出原始无容器PCM 数据-f S16_LE16 位有符号小端整数signed 16-bit little-endian这与示例中I16Frames的解析逻辑一一对应-r 16000采样率 16 kHz-c 1单声道-d 5录制 5 秒末尾的-表示将音频写到 stdout通过管道|送入示例程序的 stdin。注意示例程序约定 stdin 输入的采样率必须与--sample-rate一致如果录音用了 8 kHz运行参数就应改为--sample-rate 8000程序会按 256 帧长处理。方式二用 SoX 采集并重采样如果声卡/麦克风不支持直接输出 16 kHz或者你想用 48 kHz 的通用采集配置原文档提供的 SoX 双段管道可以把采样率转换为模型所需的 16 kHz$ rec -t raw -r 48000 -b 16 -c 1 -e signed-integer - trim 0 5 | sox -t raw -r 48000 -b 16 -c 1 -e signed-integer - -t raw -r 16000 -b 16 -c 1 -e signed-integer - | cargo run --example silero-vad --release --features onnx -- --sample-rate 16000命令拆解第一段recSoX 的录音命令以 48 kHz、16 bit、单声道、signed-integer 格式录制原始 PCMtrim 0 5表示截取开头 5 秒输出到 stdout第二段sox把 48 kHz 的原始 PCM 流读入-t raw -r 48000 -b 16 -c 1 -e signed-integer -重采样到 16 kHz 后以同样的原始格式写出-t raw -r 16000 -b 16 -c 1 -e signed-integer -最后送入cargo run --example silero-vad ... --sample-rate 16000。这套写法完全兼容示例程序的输入约定无论采集端是多少采样率最终喂给模型的都是 16 kHz / S16_LE / 单声道的原始 PCM。源码剖析从 stdin 字节流到说话概率理解了命令后我们再深入 main.rs 看它内部是如何一步步完成推理的这既是理解该示例的关键也是后续将其嵌入自有音频管线的基础。1. 字节流 → i16 → f32 的帧迭代器I16Framesmain.rs是一个自定义迭代器负责从任意std::io::Read这里是 stdin中按帧读取数据。它的工作方式初始化时按frame_size * 2字节每个 i16 占 2 字节分配缓冲区每次读取累积到一帧完整大小后把每 2 个字节按小端序还原为i16i16::from_le_bytes再除以i16::MAX归一化到[-1.0, 1.0]的 f32 范围若音频流提前结束且不足一帧则直接丢弃不足部分对应 main.rs 中chunk.len() frame_size时的continue。2. 模型加载与设备选择模型加载分两步若未指定--model-id通过candle_examples::hub::Api从onnx-community/silero-vad仓库获取onnx/model.onnxmain.rs用candle_onnx::read_file读取并解码 ONNX protobuf得到ModelProto对应 candle-onnx/src/lib.rs 中的 prost 解码逻辑。设备选择则交给candle_examples::device(args.cpu)candle-examples/src/lib.rs--cpu强制 CPU否则按 CUDA → Metal → CPU 的优先级自动选择可用设备并在回退到 CPU 时打印提示如 Running on CPU, to run on GPU(metal), build this example with--features metal。3. 循环状态state与上下文context的维护VAD 的核心在于跨帧的循环状态。示例用State结构体封装了三样东西main.rssample_rate作为输入张量传给 ONNX 图的sr输入state形状为(2, 1, 128)的 F32 张量初始化为全零承载模型的循环记忆context形状为(1, context_size)的张量保存上一帧末尾的音频样本用于帧间平滑衔接。每帧推理的流程main.rs将当前帧chunk转为形状(1, frame_size)的张量用Tensor::cat把上一帧的context拼到当前帧前面得到(1, frame_size context_size)的输入构造输入字典{input: ..., sr: ..., state: ...}调用candle_onnx::simple_eval执行 ONNX 计算图从图输出中取出两个结果第一个输出作为本帧说话概率标量第二个输出作为新的state写入下一轮取当前帧末尾context_size个样本作为下一轮的context。simple_eval的实现见 candle-onnx/src/eval.rs它会先把图中的 initializer 常量填充进值表再按输入张量校验形状与 dtype最后顺序执行算子。从代码注释eval.rs可以看出当前实现是每次求值直接跑一遍 proto 计算图的直译模式尚未引入中间表示缓存优化因此在实时场景中单次推理的开销主要来自图求值本身。4. 输出解读每帧推理后程序打印一行vad chunk prediction: {output}其中 output 是 0~1 的说话概率程序用assert_eq!(output.len(), 1)确认模型输出确实是标量。全部帧处理完后还会打印所有帧预测的算术平均vad chunk prediction: 0.0143 vad chunk prediction: 0.9876 ... vad average prediction: 0.5123如果你的应用只需要某段时间是否有人说话这类粗粒度判断可以直接看平均预测如果需要逐帧门限比如帧概率 0.5 判定为语音段可以基于每帧输出自行叠加阈值逻辑——示例本身只负责输出原始概率不做门限判定。另外程序启动时还会打印一行 SIMD 能力摘要avx: true, neon: false, simd128: false, f16c: false这是通过candle::utils::with_avx()等查询编译时启用的指令集特性见 main.rs可用于确认当前构建是否启用了 AVX 等 CPU 加速。5. Tracing 与性能定位带--tracing运行时程序会通过tracing_chrome::ChromeLayerBuilder构建 Chrome tracing 层输出trace-timestamp.json性能分析文件main.rs。在排查哪一步耗时高模型下载、模型加载、逐帧推理时可以借助它逐段分析代码中已经用Instant分别记录了下载、加载、推理三段耗时并打印。运行结果预期与常见问题输出流程序从 stdin 读入原始 PCM每处理完一帧输出一行预测音频结束后输出平均预测。5 秒 16 kHz 对应 160000 个样本按 512 帧长约产生 312 帧预测输出。静音与说话概率Silero VAD 对静音帧通常输出接近 0 的概率对人声帧输出接近 1 的概率数值表现取决于具体音频与噪声环境示例不提供阈值调节参数。量化模型暂不可用onnx-community/silero-vad同时提供了model_quantized.onnx但受限于 candle-onnx 暂不支持 Int8 权重main.rs 中的 TODO 注释示例只使用 FP32 模型。管道断裂如果在运行中提前结束录音程序如 CtrlCstdin EOF 后迭代器会正常终止并输出平均预测不会产生错误。小结通过这个示例你可以看到 Candle 处理流式音频模型的一条完整通路hf-hub拉取 ONNX 权重 →candle_onnx::read_file解析模型 →simple_eval逐帧求值 → 手动维护 state/context 实现跨帧记忆。它既是一个开箱即用的 VAD 命令行工具也是一个很好的如何用 Rust Candle 跑带循环状态的 ONNX 模型的参考模板。如果你想进一步改造可以把I16Frames换成任意来源的音频块文件、网络流、语音引擎回调只需保持 S16_LE 单声道与--sample-rate对应的帧长即可无缝接入。延伸阅读完整的示例代码见 candle-examples/examples/silero-vad/main.rs运行说明见 candle-examples/examples/silero-vad/README.mdONNX 推理引擎的解析与求值实现见 candle-onnx/src/lib.rs 与 candle-onnx/src/eval.rs模型下载与缓存逻辑见 candle-examples/src/hub.rs。赞分享人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载相关推荐LiveKit Agents Silero VAD 插件实战基于 ONNX 的实时语音活动检测与轮次控制LiveKit Agents Silero VAD 插件实战基于 ONNX 的实时语音活动检测与轮次控制 导读 livekit plugins sileroAI Agent人工智能语音AI 应用多模态Switch 自制系统报 Fatal Error 010000000000002b 怎么办三步排查彻底修复Switch 自制系统报 Fatal Error 010000000000002b 怎么办三步排查彻底修复 先别慌也别反复按电源键硬开机。玩 Atmosph固件操作系统嵌入式系统编程国家中小学智慧教育平台电子课本下载批量存成 PDF 离线用免费国家中小学智慧教育平台电子课本下载批量存成 PDF 离线用免费 开学要上新课备课先找教材。tchMaterial parser 帮你在国家中小学智慧教育平网页爬虫教育上一篇Markn重新定义Markdown预览体验的实时渲染解决方案下一篇终极指南5分钟掌握IDM激活脚本的完整使用方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →