跳到正文

sherpa-asr-offline-server

基于 sherpa-onnxZipformer Transducer / SenseVoice 等多语种语音模型的本地化、高性能离线 ASR 独立 HTTP 服务。

  • 默认模型sherpa-onnx-zipformer-multi-zh-hans-2023-9-2(高精度多方言中文/普通话离线识别)。
  • 模型支持
    • sherpa-onnx-zipformer-multi-zh-hans-2023-9-2:Zipformer Transducer 中文多方言离线识别模型
    • sherpa-onnx-zipformer-zh-en-2023-11-22:Zipformer Transducer 中英双语离线识别模型
    • sherpa-onnx-sense-voice:SenseVoice 多语种(中/英/粤/日/韩)大模型,内置 ITN、语种/情绪识别与声音事件检测
    • sherpa-onnx-paraformer-zh:Paraformer 离线识别模型

目录结构

onnx-platform/sherpa-asr-offline-server/
├── CMakeLists.txt              # CMake 构建文件
├── build.ps1                   # Windows x64 一键构建与安装
├── build.sh                    # Linux x64 构建脚本
├── config.json                 # 服务配置文件
├── README.md                   # 本手册
├── request-asr.js              # Node.js 测试请求脚本
└── src/                        # C++17 源码目录
    ├── main.cpp                # 入口函数
    ├── config.h / .cpp         # 配置管理与多模型解析
    ├── logging.h / .cpp        # 日志输出
    ├── types.h                 # 数据类型定义
    ├── text_utils.h / .cpp     # SenseVoice 标签解析与纯文本过滤
    ├── audio_decoder.h / .cpp  # WAV/PCM/FFmpeg 音频解析
    ├── offline_asr_service.h / .cpp # 离线识别引擎与并发池
    ├── http_protocol.h / .cpp  # HTTP 协议解析
    └── http_server.h / .cpp    # 多线程非阻塞 Socket 服务端

构建与安装

Windows (MSVC x64)

onnx-platform/sherpa-asr-offline-server/ 下运行:

powershell
.\build.ps1

构建成功后,可执行文件与运行时依赖动态库将自动安装至 target/win_x64/

Linux (x64)

bash
chmod +x ./build.sh
./build.sh

构建成功后,安装至 target/linux_x64/


运行服务

进入安装目录运行服务:

powershell
cd onnx-platform\sherpa-asr-offline-server\target\win_x64
.\sherpa_asr_offline_server.exe

默认监听端口为 10095


HTTP 接口说明

1. 健康检查

  • 请求GET /healthGET /healthz
  • 返回示例
    json
    {
      "code": 0,
      "msg": "ok",
      "data": {
        "status": "ok",
        "service": "sherpa-asr-offline-server",
        "activeModel": "sherpa-onnx-zipformer-multi-zh-hans-2023-9-2",
        "provider": "cpu",
        "sampleRate": 16000,
        "uptimeSeconds": 36,
        "totalRequests": 5
      }
    }

2. 离线识别接口

  • 请求POST /asrPOST /recognize
  • 支持内容类型
    1. multipart/form-data(推荐):
      • fileaudio:音频文件二进制(支持 .wav.mp3 等)
      • language(可选):语种代码,默认 auto(SenseVoice 模型支持 zhenyuejako
      • use_itn(可选):是否启用逆文本归一化,默认 true
      • hotwords(可选):热词列表
    2. application/json
      • audioBase64:音频文件 base64 字符串
      • audioPath:本地音频绝对路径
      • languageuseItnhotwords
    3. audio/wav / application/octet-stream:直接发送音频原始二进制流,参数通过 URL Query 传递(如 POST /asr?language=zh&use_itn=true)。
  • 返回示例
    json
    {
      "code": 0,
      "msg": "ok",
      "data": {
        "cleanText": "甚至出现交易几乎停滞的情况。",
        "text": "甚至出现交易几乎停滞的情况。",
        "lang": "",
        "emotion": "",
        "event": "",
        "durationMs": 3120,
        "processTimeMs": 68.5,
        "rtf": 0.022,
        "timestamps": [0.12, 0.35, 0.58],
        "tokens": ["甚至", "出现", "交易", "几乎", "停滞", "的", "情况"]
      }
    }

3. OpenAI 兼容音频转录接口

  • 请求POST /v1/audio/transcriptions
  • 格式multipart/form-data(包含 file 参数)
  • 返回示例
    json
    {
      "text": "甚至出现交易几乎停滞的情况。"
    }

验证与调用示例

通过自带 Node.js / Bun 脚本测试:

bash
node request-asr.js

指定音频文件与服务地址:

bash
node request-asr.js ../models/sherpa-onnx-zipformer-multi-zh-hans-2023-9-2/test_wavs/0.wav http://127.0.0.1:10095

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