外观
FunASR ASR Server (Rust 统一服务端)
onnx-platform/funasr-asr-server 是纯 Rust 重构的统一 FunASR 语音识别服务。单进程内部同时运行双端口 Listener:
- WebSocket 流式推流端口
10099:对外提供/health与ws://host:10099/audio,完全兼容 FreeSWITCHmod_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 动态库。
核心特性
- 单进程双端口监听:
- WS 流式(
10099)与 HTTP 离线(10094)在同一二进制进程中并发运行,统一共享模型实例,大幅降低内存驻留与 CPU 资源开销。
- WS 流式(
- 纯 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 流式调度门面。
- 当前调用契约兼容:
- WebSocket 输出与
sherpa-asr-server使用相同的核心事件字段(transcription、speechStarted、speechActive、speechSegmentCompleted、isFinal)。 - HTTP 接口保留原离线服务的调用路径,并兼容 OpenAI Whisper 标准。
- WebSocket 输出与
专题导航
目录结构
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 --silence3. 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