一个基于 Sherpa-ONNX 的高性能语音识别服务,支持实时 VAD(语音活动检测)、多语言识别和声纹识别。
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y libc++1 libc++abi1 build-essential
# CentOS/RHEL
sudo yum install -y libcxx libcxxabi gcc gcc-c++
git clone https://github.com/MindDock/VoxID.git
cd VoxID
go mod download
⚠️ 重要:本项目需要手动下载以下模型文件才能运行。
方式 A:使用 wget 下载
# 创建目录
mkdir -p models/asr/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17
# 下载模型文件
wget -O models/asr/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/model.int8.onnx \
https://huggingface.co/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/resolve/main/model.int8.onnx
# 下载 tokens 文件
wget -O models/asr/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/tokens.txt \
https://huggingface.co/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/resolve/main/tokens.txt
方式 B:使用 git-lfs 克隆(需要先安装 git-lfs)
# 安装 git-lfs
sudo apt-get install git-lfs # Ubuntu/Debian
# 或
brew install git-lfs # macOS
# 初始化 git-lfs
git lfs install
# 克隆模型仓库
git clone https://huggingface.co/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17 \
models/asr/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17
国内镜像加速 如果 HuggingFace 下载速度慢,可以使用国内镜像:
# 使用 HF-Mirror 镜像站
export HF_ENDPOINT=https://hf-mirror.com
# 然后执行上面的下载命令
Silero VAD 模型文件通常需要从项目中获取:
mkdir -p models/vad/silero_vad
# 下载 silero_vad.onnx
wget -O models/vad/silero_vad/silero_vad.onnx \
https://github.com/snakers4/silero-vad/raw/master/files/silero_vad.onnx
如果需要声纹识别功能:
mkdir -p models/speaker
# 下载声纹模型
wget -O models/speaker/3dspeaker_speech_campplus_sv_zh_en_16k-common_advanced.onnx \
https://huggingface.co/csukuangfj/speaker-embedding-models/resolve/main/3dspeaker_speech_campplus_sv_zh_en_16k-common_advanced.onnx
如果不需要声纹识别,可以在 config.json 中禁用:
{
"speaker": {
"enabled": false,
...
}
}
# 复制动态库到系统目录
sudo cp lib/*.so /usr/lib/
sudo cp lib/ten-vad/lib/Linux/x64/libten_vad.so /usr/lib/
# 或者设置 LD_LIBRARY_PATH(推荐)
export LD_LIBRARY_PATH=$PWD/lib:$PWD/lib/ten-vad/lib/Linux/x64:$LD_LIBRARY_PATH
mkdir -p logs data/speaker
# 方式 A:直接运行
go run main.go
# 方式 B:编译后运行
go build -o asr_server
./asr_server
访问 http://localhost:8080/ 查看测试页面,点击"启动系统"按钮开始语音识别测试。
主要配置文件:config.json
系统支持两种 VAD 引擎:
{
"vad": {
"provider": "silero_vad",
"pool_size": 200,
"threshold": 0.5,
"silero_vad": {
"model_path": "models/vad/silero_vad/silero_vad.onnx",
"min_silence_duration": 0.1,
"min_speech_duration": 0.25,
"max_speech_duration": 8.0,
"window_size": 512,
"buffer_size_seconds": 10.0
}
}
}
{
"vad": {
"provider": "ten_vad",
"ten_vad": {
"hop_size": 512,
"min_speech_frames": 12,
"max_silence_frames": 5
}
}
}
{
"recognition": {
"model_path": "models/asr/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/model.int8.onnx",
"tokens_path": "models/asr/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/tokens.txt",
"language": "auto",
"num_threads": 16,
"provider": "cpu"
}
}
{
"speaker": {
"enabled": true,
"model_path": "models/speaker/3dspeaker_speech_campplus_sv_zh_en_16k-common_advanced.onnx",
"num_threads": 8,
"threshold": 0.6,
"data_dir": "data/speaker"
}
}
{
"server": {
"port": 8080,
"host": "0.0.0.0",
"read_timeout": 20
}
}
更多配置选项请参考 config.json 文件。
连接到 ws://localhost:8080/ws,发送音频数据(16kHz, 16-bit PCM):
const ws = new WebSocket('ws://localhost:8080/ws');
ws.onopen = () => {
console.log('WebSocket 连接已建立');
// 发送音频数据
ws.send(audioBuffer);
};
ws.onmessage = (event) => {
const result = JSON.parse(event.data);
console.log('识别结果:', result);
};
ws.onerror = (error) => {
console.error('WebSocket 错误:', error);
};
ws.onclose = () => {
console.log('WebSocket 连接已关闭');
};
curl http://localhost:8080/health
curl http://localhost:8080/stats
curl -X POST http://localhost:8080/api/speaker/register \
-H "Content-Type: application/json" \
-d '{"speaker_id": "user123", "audio_data": "..."}'
curl -X POST http://localhost:8080/api/speaker/recognize \
-H "Content-Type: application/json" \
-d '{"audio_data": "..."}'
项目提供了测试脚本用于验证功能:
cd test/asr
python audiofile_test.py
cd test/asr
python stress_test.py --connections 100 --audio-per-connection 2
参数说明:
--connections: 并发连接数--audio-per-connection: 每个连接发送的音频文件数┌────────────────────┐ ┌──────────────────────┐ ┌────────────────────┐ │ WebSocket客户端 │ │ VAD语音活动检测池 │ │ ASR识别器模块 │ │ │ │ │ │ (动态new stream) │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ 音频流输入 │◄─┼───►│ │ VAD实例 │◄──┼───►│ │ Recognizer │ │ │ └──────────────┘ │ │ └──────────────┘ │ │ └──────────────┘ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ │ │ 识别结果接收 │ │ │ │ 缓冲队列 │ │ │ │ │ └──────────────┘ │ │ └──────────────┘ │ └────────────────────┘ └────────────────────┘ └──────────────────────┘ │ ▼ ┌────────────────────┐ ┌──────────────────────┐ ┌────────────────────┐ │ 会话管理器 │ │ 声纹识别模块(可选) │ │ 健康检查/监控 │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ │ │ 连接状态管理 │ │ │ │ 说话人注册 │ │ │ 监控/状态接口 │ │ └──────────────┘ │ │ └──────────────┘ │ └────────────────────┘ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ 资源分配释放 │ │ │ │ 声纹特征提取 │ │ │ └──────────────┘ │ │ └──────────────┘ │ └────────────────────┘ └──────────────────────┘
VoxID/ ├── main.go # 主程序入口 ├── config.json # 配置文件 ├── go.mod # Go 依赖管理 ├── go.sum ├── internal/ # 内部包 │ ├── bootstrap/ # 应用启动初始化 │ ├── logger/ # 日志模块 │ ├── router/ # 路由配置 │ └── ... ├── lib/ # 动态链接库 │ └── ten-vad/ ├── models/ # 模型文件目录(需自行下载) │ ├── asr/ # ASR 模型 │ ├── vad/ # VAD 模型 │ └── speaker/ # 声纹模型 ├── static/ # 静态资源 │ ├── index.html # 测试页面 │ ├── css/ │ └── js/ ├── data/ # 数据存储 │ └── speaker/ # 声纹数据 ├── logs/ # 日志文件 └── test/ # 测试脚本 ├── asr/ └── speaker/
问题:从 HuggingFace 下载模型缓慢或失败
解决方案:
export HF_ENDPOINT=https://hf-mirror.com问题:运行时提示找不到 .so 文件
解决方案:
# 设置库路径
export LD_LIBRARY_PATH=$PWD/lib:$PWD/lib/ten-vad/lib/Linux/x64:$LD_LIBRARY_PATH
# 或复制到系统目录
sudo cp lib/*.so /usr/lib/
问题:前端无法连接 WebSocket
解决方案:
config.json 中的 server.host 配置logs/app.log问题:音频发送成功但没有识别结果
解决方案:
threshold、min_speech_duration)问题:服务运行一段时间后内存占用较高
解决方案:
vad.pool_size 参数pool.worker_countrate_limit 限制并发连接数| 参数 | 说明 | 推荐值 | 影响 |
|---|---|---|---|
vad.pool_size | VAD 实例池大小 | 200 | 影响并发处理能力 |
recognition.num_threads | ASR 线程数 | 8-16 | 影响识别速度 |
pool.worker_count | 工作协程数 | 500 | 影响并发连接数 |
vad.threshold | VAD 检测阈值 | 0.5 | 影响语音检测灵敏度 |
speaker.threshold | 声纹相似度阈值 | 0.6 | 影响说话人识别准确度 |
num_threadspool_size 和 worker_countten_vad 替代 silero_vadrate_limit 防止过载欢迎贡献代码!请遵循以下步骤:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)本项目整体采用 MIT 许可证。但请注意:
vad.provider 设为 ten_vad),需遵守 ten-vad 的 Licensevad.provider 设为 silero_vad),可直接遵循 MIT 许可证请根据实际使用的 VAD 类型,遵守相应的开源协议。
本项目基于以下优秀的开源项目:
如有问题或建议,欢迎:
如果这个项目对你有帮助,欢迎给个 Star ⭐️!