sherpa-asr-server (纯 Rust 统一语音识别服务)
基于 Rust 2021 重构的统一本地 Sherpa 语音识别服务,单进程同时提供:
- WebSocket 流式识别端口 (默认
10096):兼容 FreeSWITCHmod_audio_fork与apps/callflow-esl,提供实时 Partial 转写、Silero VAD 语音断句、零长帧快速定稿、以及基于 SenseVoice 的 2-Pass 高精度终态重识别。 - HTTP 离线转写与 Whisper 兼容端口 (默认
10095):兼容原有sherpa-asr-offline-server的POST /asr、POST /recognize、GET /health,以及标准 OpenAI WhisperPOST /v1/audio/transcriptions接口。
核心特色在于单进程共享底层 SenseVoice 离线模型池(OfflineRecognizerPool),同时为流式识别的 2-Pass 尾句重识别与 HTTP 离线转写提供并发推理服务,彻底避免双进程部署重复加载模型的显存/内存浪费。
架构概览
+-------------------------------------------------------------+
| sherpa-asr-server (Rust) |
| |
| +--------------------------+ +------------------------+ |
| | Axum WS 端口 (10096) | | Axum HTTP 端口 (10095)| |
| | - /audio (实时推流) | | - /asr, /recognize | |
| | - /health (健康检查) | | - /v1/audio/transcr. | |
| +------------+-------------+ +------------+-----------+ |
| | | |
| +------------v-------------+ | |
| | Online Stream (1-Pass) | | |
| | - Zipformer-zh (流式) | | |
| | - Silero VAD (断句) | | |
| +------------+-------------+ | |
| | (语音段定稿请求) | |
| v v |
| +------------------------------------------------------+ |
| | 共享 OfflineRecognizerPool (SenseVoice) | |
| | - 预加载多实例池 (默认 4 个实例,无锁借用) | |
| | - 兼顾 2-Pass 终态重转写 与 HTTP 离线调用 | |
| +------------------------------------------------------+ |
+-------------------------------------------------------------+端口与接口契约
1. WebSocket 流式端口 (10096)
- 端点:
ws://127.0.0.1:10096/audio(子协议audio.drachtio.org) - 握手 Metadata(首包文本 JSON):json
{ "channelUuid": "call-12345", "hotwordProfile": "default", "hotwords": "办理业务 优惠套餐" } - 音频流(二进制包):
- 发送 16kHz 16-bit 单声道 PCM(默认每包 640 字节 = 20ms)。
- 发送 0 字节二进制包触发服务端即时 Flush 定稿。
- 服务端事件帧格式:json
{ "type": "transcription", "data": { "text": "你好我想咨询业务", "isFinal": true, "utteranceIndex": 1, "speechStarted": false, "speechActive": false, "speechSegmentDetected": true, "speechSegmentCompleted": true, "serverSessionId": "session-1", "language": "zh", "emotion": "NEUTRAL", "event": "SPEECH" } } - 健康检查:
GET http://127.0.0.1:10096/health
2. HTTP 离线端口 (10095)
- 标准 ASR 转写:
POST http://127.0.0.1:10095/asr或/recognize- 支持
multipart/form-data(字段file或audio)、原始二进制 PCM/WAV 流、以及 JSON Base64。 - 请求参数支持
language、use_itn、hotwords。
- 支持
- OpenAI Whisper 接口:
POST http://127.0.0.1:10095/v1/audio/transcriptions- 返回标准 OpenAI 结构
{"text": "识别文本"}或verbose_json格式。
- 返回标准 OpenAI 结构
- 健康检查:
GET http://127.0.0.1:10095/health
构建与运行
1. 构建交付包
必须使用 PowerShell 7 (pwsh) 执行构建(自动编译 Release 并装配至 dist/win_x64/):
powershell
pwsh ./build.ps1Linux 平台执行:
bash
./build.sh2. 运行服务
开发方式:
bash
bun run run-server.ts直接运行交付包:
powershell
cd dist/win_x64
.\sherpa_asr_server.exe客户端测试工具
以下命令在本服务目录执行。四个客户端均支持无参数运行:连接本机默认端口并自动查找模型目录中的中文 WAV,输入准备见 ONNX 测试入口。
1. WebSocket 实时推流测试 (scripts/request-ws.ts)
bash
# 使用默认中文样本
bun scripts/request-ws.ts
# 测试指定 WAV 文件
bun scripts/request-ws.ts "C:\path\to\test.wav"
# 极速压测推流
bun scripts/request-ws.ts "C:\path\to\test.wav" --fast
# 静音回归测试(发送 3 秒静音验证无误识别与误打断)
bun scripts/request-ws.ts --silence2. HTTP 离线转写测试 (scripts/request-http.ts)
bash
# 使用默认中文样本
bun scripts/request-http.ts
# 测试 /asr 与 /v1/audio/transcriptions
bun scripts/request-http.ts "C:\path\to\test.wav"3. 流式延迟与首帧元数据回归
bash
bun scripts/bench-stream-latency.ts
bun scripts/test-metadata-parity.ts