# model-zoo-vad
**Repository Path**: spacemit-robotics/model-zoo-vad
## Basic Information
- **Project Name**: model-zoo-vad
- **Description**: No description available
- **Primary Language**: C++
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-09
- **Last Updated**: 2026-04-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# VAD 组件
## 1. 项目简介
本组件为通用 VAD 封装,提供统一的 C++ 接口与 Python 绑定,支持本地语音活动检测,便于集成到 ASR、TTS、AI Agent 等应用中。当前已支持 Silero VAD(本地 ONNX),接口可扩展其他后端。功能特性如下:
| 类别 | 支持 |
| -------- | -------------------------------------------------------------------- |
| 部署方式 | **本地**(ONNX 推理) |
| 检测方式 | 单帧检测 `Detect()`;流式检测 `Start()` + `SendAudioFrame()` + `Stop()` |
| 后端 | Silero VAD(当前);接口可扩展 ENERGY、WEBRTC 等 |
| 接口 | C++(`include/vad_service.h`)、Python(`spacemit_vad`) |
支持的后端与配置:Silero(默认,16kHz,窗口 512 样本);阈值 `trigger_threshold`/`stop_threshold`、平滑等详见 [API.md](API.md)。
## 2. 验证模型
按以下顺序完成依赖安装、模型准备与示例运行。
### 2.1. 安装依赖
- **编译环境**:CMake ≥ 3.16,C++17 编译器(GCC/Clang/MSVC)。
- **必选**:ONNX Runtime、libcurl(模型自动下载)。
```bash
# Linux 示例
sudo apt-get update
sudo apt-get install -y build-essential cmake libcurl4-openssl-dev
# ONNX Runtime: 从 https://github.com/microsoft/onnxruntime/releases 安装,或 SpacemiT 环境 apt install onnxruntime
```
**可选:**
- **Python 绑定**:`pip install pybind11`
- **流式示例(C++)**:需 audio 组件 + PortAudio,`apt install portaudio19-dev`,构建时 `cmake .. -DBUILD_STREAM_DEMO=ON`(需存在 `examples/stream_demo.cpp`)。
### 2.2. 下载模型
使用 Silero VAD 时需将模型放到默认路径 **`~/.cache/models/vad/silero/silero_vad.onnx`**;首次运行可自动下载,也可从镜像提前下载。
**模型源:**
- **进迭时空镜像(推荐)**:
提供 VAD 模型压缩包,下载后解压到默认目录即可,例如:
```bash
mkdir -p ~/.cache/models/vad
cd ~/.cache/models/vad
wget https://archive.spacemit.com/spacemit-ai/model_zoo/vad/silero.tar.gz
tar -xzf silero.tar.gz
```
解压后需得到 `silero/` 目录(内含 `silero_vad.onnx`),即默认路径 `~/.cache/models/vad/silero/`。
- **其他渠道**:从 Silero 官方或内部渠道获取模型,拷贝至上述目录。
### 2.3. 测试
本节提供示例程序的编译与运行方式,便于开发者快速验证效果。使用前需先按下列两种方式之一完成编译,再运行对应示例。
- **在 SDK 中验证**(2.3.1):在已拉取的 SpacemiT Robot SDK 工程内用 `mm` 编译,产物部署到 `output/staging`,适合整机集成或与 ASR、TTS 等模块联调。
- **独立构建下验证**(2.3.2):在 VAD 组件目录下用 CMake 本地编译,不依赖完整 SDK,适合快速体验或在不使用 repo 的环境下使用。
#### 2.3.1. 在 SDK 中验证
**编译**:本组件已纳入 SpacemiT Robot SDK 时,在 SDK 根目录下执行。SDK 拉取与初始化见 [SpacemiT Robot SDK Manifest](https://github.com/spacemit-robotics/manifest)(使用 repo 时需先完成 `repo init`、`repo sync` 等)。
```bash
source build/envsetup.sh
cd components/model_zoo/vad
mm
```
构建产物会安装到 `output/staging`。
**运行**:运行前在 SDK 根目录执行 `source build/envsetup.sh`,使 PATH 与库路径指向 `output/staging`,然后可执行:
**C++ 简单示例:**
```bash
vad_simple_demo
```
**Python 示例**(需已安装 Python 包或设置 PYTHONPATH 指向 SDK 构建产物):
```bash
python python/examples/vad_file_demo.py
```
**流式检测**(若 SDK 构建时已开启流式示例):
```bash
vad_stream_demo
```
#### 2.3.2. 独立构建下验证
在 VAD 组件目录下完成编译后,运行下列示例。
**C++ 简单示例(默认构建即包含):**
```bash
cd /path/to/vad
mkdir -p build && cd build
cmake ..
make -j$(nproc)
./bin/vad_simple_demo
```
**Python 示例:**
```bash
make -C build vad-install-python # 或设置 PYTHONPATH
python python/examples/vad_file_demo.py
```
**流式检测(默认未开启)**:若存在 `examples/stream_demo.cpp` 且需测试 C++ 流式,需先安装 PortAudio(见 2.1),然后:
```bash
cd build
cmake .. -DBUILD_STREAM_DEMO=ON
make -j$(nproc)
./bin/vad_stream_demo
```
## 3. 应用开发
本章说明如何在自有工程中**集成 VAD 并调用 API**。环境与依赖见 [2.1](#21-安装依赖),模型准备见 [2.2](#22-下载模型),编译与运行示例见 [2.3](#23-测试)。
### 3.1. 构建与集成产物
无论通过 [2.3.1](#231-在-sdk-中验证)(SDK)或 [2.3.2](#232-独立构建下验证)(独立构建)哪种方式编译,完成后**应用开发所需**的库与头文件如下,集成时只需**包含头文件并链接对应库**:
| 产物 | 说明 |
| ---- | ---- |
| `include/vad_service.h` | **C++ API 头文件**,应用侧只需包含此头文件并链接下方库即可调用 |
| `build/lib/libvad.a` | C++ 核心库,链接时使用 |
| `build/lib/libsilero_vad.a` | Silero 后端库,链接时使用 |
| `build/python/spacemit_vad/` | Python 包,`make vad-install-python` 安装后 `import spacemit_vad` |
示例可执行文件(非集成必需):`build/bin/vad_simple_demo`、`build/bin/vad_stream_demo`(需 `-DBUILD_STREAM_DEMO=ON` 且存在流式示例源文件)。运行与验证步骤见 [2.3.1](#231-在-sdk-中验证) 或 [2.3.2](#232-独立构建下验证)。
### 3.2. API 使用
**C++**:头文件 `include/vad_service.h` 为唯一 API 入口,实现为 PIMPL。在业务代码中 `#include "vad_service.h"`,链接 `libvad.a` 与 `libsilero_vad.a`(及 ONNX Runtime、libcurl 等),即可使用。
```cpp
#include "vad_service.h"
using namespace SpacemiT;
auto config = VadConfig::Preset("silero").withTriggerThreshold(0.6f).withStopThreshold(0.35f);
auto engine = std::make_shared(config);
auto result = engine->Detect(audio_frame, 16000);
if (result && result->IsSpeech()) std::cout << result->GetProbability() << std::endl;
engine->SetCallback(std::make_shared());
engine->Start();
// ... SendAudioFrame() ...
engine->Stop();
```
**Python**:安装后 `import spacemit_vad`,详见 `python/examples/` 与 [API.md](API.md)。
```python
import spacemit_vad
result = spacemit_vad.detect(audio_array)
# 或
engine = spacemit_vad.VadEngine()
result = engine.detect(audio_frame)
```
**CMake 集成**:将本组件作为子目录引入,并链接 `vad`、包含头文件路径即可。
```cmake
add_subdirectory(vad)
target_link_libraries(your_target PRIVATE vad)
target_include_directories(your_target PRIVATE ${VAD_SOURCE_DIR}/include)
```
### 3.3. 配置参数
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `backend` | `VadBackendType` | `SILERO` | 后端类型 |
| `sample_rate` | `int` | `16000` | 采样率 |
| `window_size` | `int` | `512` | 窗口大小 (32ms @ 16kHz) |
| `trigger_threshold` | `float` | `0.5` | 语音开始阈值 |
| `stop_threshold` | `float` | `0.35` | 语音结束阈值 |
| `smoothing_window` | `int` | `10` | 平滑窗口大小 |
详见 [API.md](API.md)。
## 4. 常见问题
暂无。如有问题可提交 Issue。
## 5. 版本与发布
版本以本组件文档或仓库 tag 为准。
| 版本 | 说明 |
| ------ | ---- |
| 1.0.0 | 提供 C++ / Python 接口,支持 Silero VAD、单帧与流式检测。 |
## 6. 贡献方式
欢迎参与贡献:提交 Issue 反馈问题,或通过 Pull Request 提交代码。
- **编码规范**:C++ 代码遵循 [Google C++ 风格指南](https://google.github.io/styleguide/cppguide.html)。
- **提交前检查**:若仓库提供 lint 脚本,请在提交前运行并通过检查。
## 7. License
本组件源码文件头声明为 Apache-2.0,最终以本目录 `LICENSE` 文件为准。