跳到正文

sherpa-asr-server (纯 Rust 统一语音识别服务) ​

基于 Rust 2021 重构的统一本地 Sherpa 语音识别服务,单进程同时提供:

  1. WebSocket 流式识别端口 (默认 10096):兼容 FreeSWITCH mod_audio_fork 与 apps/callflow-esl,提供实时 Partial 转写、Silero VAD 语音断句、零长帧快速定稿、以及基于 SenseVoice 的 2-Pass 高精度终态重识别。
  2. HTTP 离线转写与 Whisper 兼容端口 (默认 10095):兼容原有 sherpa-asr-offline-server 的 POST /asr、POST /recognize、GET /health,以及标准 OpenAI Whisper POST /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 格式。
  • 健康检查:GET http://127.0.0.1:10095/health

构建与运行 ​

1. 构建交付包 ​

必须使用 PowerShell 7 (pwsh) 执行构建(自动编译 Release 并装配至 dist/win_x64/):

powershell
pwsh ./build.ps1

Linux 平台执行:

bash
./build.sh

2. 运行服务 ​

开发方式:

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 --silence

2. 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

文档与代码在同一仓库维护,现有 Markdown 是唯一内容源。