跳到正文

FunASR ASR Server (Rust 统一服务端) ​

onnx-platform/funasr-asr-server 是纯 Rust 重构的统一 FunASR 语音识别服务。单进程内部同时运行双端口 Listener:

  • WebSocket 流式推流端口 10099:对外提供 /health 与 ws://host:10099/audio,完全兼容 FreeSWITCH mod_audio_fork 与 audio.drachtio.org 子协议;支持 2-Pass 双流模式(Paraformer-Online 流式 CIF 毫秒级 partial 上屏 + 句尾 Paraformer 离线大模型 + CT-Transformer 标点纠错 final)。
  • HTTP 离线识别端口 10094:对外提供 GET /health、POST /asr、POST /recognize 以及 OpenAI Whisper 兼容接口 POST /v1/audio/transcriptions。

底层推理完全使用 Rust 自研前端特征提取(80 维 Fbank、512 点 FFT、流式 LFR 动态拼帧与 CMVN 归一化)、BPE Tokenizer、FSMN-VAD 语音端点检测与 CT-Transformer 中文标点恢复,废弃了原旧版 C++ fanasr-runtime 与 fanasr-onnx 动态库,仅依赖官方 onnxruntime 动态库。


核心特性 ​

  1. 单进程双端口监听:
    • WS 流式(10099)与 HTTP 离线(10094)在同一二进制进程中并发运行,统一共享模型实例,大幅降低内存驻留与 CPU 资源开销。
  2. 纯 Rust 核心引擎 (src/engine/):
    • frontend.rs:Kaldi 兼容的 80 维 Mel-Filterbank 特征提取、动态加窗预加重与流式 LFR 拼帧/CMVN 归一化。
    • tokenizer.rs:无额外依赖的词表加载与中英文字符双向 Token 编解码。
    • vad.rs:FSMN-VAD 248 分类概率抽取、状态机滑动窗与端点切句保护。
    • online.rs:Paraformer-Online 双模型流式推流与纯 Rust CIF 连续积分点火器。
    • paraformer.rs:Paraformer 离线大模型 GreedySearch 贪心解码与时间戳抽取。
    • punc.rs:CT-Transformer 标点模型与 jieba-rs 切词回填。
    • session.rs:多会话状态完全隔离的 2-Pass 流式调度门面。
  3. 当前调用契约兼容:
    • WebSocket 输出与 sherpa-asr-server 使用相同的核心事件字段(transcription、speechStarted、speechActive、speechSegmentCompleted、isFinal)。
    • HTTP 接口保留原离线服务的调用路径,并兼容 OpenAI Whisper 标准。

专题导航 ​


目录结构 ​

text
onnx-platform/funasr-asr-server/
├── Cargo.toml               # Rust 依赖与构建配置 (axum, ort, ndarray, jieba-rs 等)
├── config.toml              # 运行时配置 (server/concurrency/asr/vad/ffmpeg/logging)
├── build.ps1                # Windows x64 构建与交付包装配脚本 (PowerShell 7)
├── build.sh                 # Linux x64 构建与交付包装配脚本
├── run-server.mjs           # 启动包装脚本
├── request-ws.js            # WebSocket 流式实时联调与回归测试客户端
├── docs/                    # 完整专题技术文档库
│   ├── architecture.md      # 架构设计与 2-Pass 流水线
│   ├── java-ts-developer-guide.md # Java/TS 开发者导读
│   ├── dsp-and-models.md    # 特征工程与四大模型
│   └── api-and-protocols.md # 协议帧与 HTTP 接口说明
├── dist/
│   ├── win_x64/             # Windows 自包含交付目录
│   └── linux_x64/           # Linux 自包含交付目录
└── src/
    ├── main.rs              # 主入口:初始化引擎、启动双 Listener 与优雅停机
    ├── config.rs            # 配置结构反序列化
    ├── logging.rs           # tracing 日志子系统
    ├── engine/              # 纯 Rust 推理引擎模块
    │   ├── frontend.rs      # Fbank + LFR + CMVN
    │   ├── tokenizer.rs     # 词表编解码
    │   ├── vad.rs           # FSMN-VAD 状态机
    │   ├── online.rs        # Paraformer-Online + CIF
    │   ├── paraformer.rs    # Paraformer 离线大模型
    │   ├── punc.rs          # CT-Transformer 标点恢复
    │   ├── sensevoice.rs    # SenseVoice 标签解析
    │   ├── session.rs       # 2-Pass 会话调度门面
    │   └── mod.rs
    └── server/              # 双端口网络协议层
        ├── protocol.rs      # WS 帧与 HTTP 响应序列化
        ├── ws_streaming.rs  # 10099 端口 WebSocket 服务
        ├── http_offline.rs  # 10094 端口 HTTP 服务
        ├── ffmpeg.rs        # FFmpeg 音频转码辅助
        └── mod.rs

构建与运行 ​

1. 构建交付包 ​

在 Windows 上使用 PowerShell 7:

powershell
pwsh ./onnx-platform/funasr-asr-server/build.ps1

在 Linux 上:

bash
./onnx-platform/funasr-asr-server/build.sh
# 或在仓库根目录执行:
bun run funasr:build:linux

构建脚本将自动执行 cargo build --release 并将可执行文件、config.toml 与 ONNX Runtime 动态库装配至 dist/win_x64/(或 dist/linux_x64/)。

2. 启动服务 ​

通过包装脚本启动交付包:

bash
bun ./onnx-platform/funasr-asr-server/run-server.mjs
# 或在仓库根目录执行:
bun run dev:funasr

验证与测试 ​

1. 健康检查 ​

bash
curl http://127.0.0.1:10099/health   # 验证 WS 流式监听
curl http://127.0.0.1:10094/health   # 验证 HTTP 离线监听

2. WebSocket 流式推流测试 ​

使用自带测试客户端:

bash
# 测试指定 WAV 音频(自动支持 8k/16k 多声道重采样并按 20ms RTP 节奏推流)
bun run ./onnx-platform/funasr-asr-server/request-ws.js "C:\path\to\audio.wav"

# 极速推流模式
bun run ./onnx-platform/funasr-asr-server/request-ws.js "C:\path\to\audio.wav" --fast

# 静音回归验证(发送 3 秒全零 PCM,断言不产生虚假文本)
bun run ./onnx-platform/funasr-asr-server/request-ws.js --silence

3. HTTP 离线识别测试 ​

bash
# 标准 ASR 识别接口
curl -X POST http://127.0.0.1:10094/asr -F "file=@audio.wav"

# OpenAI Whisper 兼容接口
curl -X POST http://127.0.0.1:10094/v1/audio/transcriptions -F "file=@audio.wav"

4. 静态门禁与单元测试 ​

在根目录执行 Rust 门禁:

bash
bun run check:rust

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