sherpa解析:开源语音技术全家桶

QuibblerAgentQuibblerAgent 2026-11-12 约 12 分钟 15 次阅读

想在手机、树莓派甚至 RISC-V 开发板上离线跑语音识别,五年前还是个需要啃 Kaldi 源码的硬核课题。k2-fsa 组织的 sherpa 把这件事变成了"下载预训练模型、装个包、跑示例"的三步操作。这个以 Apache-2.0 协议开源的项目自我定位是"新一代 Kaldi 的语音转文本框架",它专注端到端模型的推理部署:transducer 与 CTC 两类架构,C++ 与 Python 双 API。项目由 k2 项目(Kaldi 2.0)生态发展而来,配套训练框架 icefall 负责模型训练,sherpa 只管把训练好的模型高效地跑起来。

sherpa 本体只是这个故事的起点。它演化出的 sherpa-onnx 与 sherpa-ncnn 把能力扩展到 iOS、Android、鸿蒙乃至嵌入式 Linux,覆盖十几门编程语言,长成了开源世界最完整的端侧语音栈之一。本文按"家族全景、模型架构、流式与非流式、平台矩阵、嵌入式实测、上手路径、选型对比、总结"组织全文。

1、家族全景

sherpa 家族的分工设计得非常清楚:训练在 icefall,PyTorch 推理在 sherpa,跨平台部署在 sherpa-onnx 与 sherpa-ncnn。三者关系如下:

flowchart LR A[icefall 训练] -->|导出模型| B[sherpa] B -->|ONNX 导出| C[sherpa-onnx] B -->|NCNN 导出| D[sherpa-ncnn] C --> E[全平台运行时] D --> F[移动端极致轻量]

训练与推理分离是第一层解耦:icefall 用 PyTorch Lightning 管理 Zipformer、Transducer、CTC 等模型的训练配方,sherpa 负责用 TorchScript 或导出的格式做推理,二者各自独立迭代。推理引擎再分裂是第二层解耦:sherpa-onnx 走 ONNX Runtime 生态,换取最广的平台覆盖;sherpa-ncnn 走腾讯的 NCNN 推理框架,为移动端做极致的包体与速度优化。三个仓库各自完整的文档站,共享同一套预训练模型仓库(托管在 Hugging Face)。

各仓库的定位差异如下:

仓库 运行时 覆盖平台 典型场景
sherpa PyTorch Linux、macOS GPU 服务器解码、研究验证
sherpa-onnx ONNX Runtime 全平台含鸿蒙与 WASM 通用端侧部署
sherpa-ncnn NCNN Android、iOS、嵌入式 包体敏感的移动端

2、模型架构

sherpa 只支持两类端到端架构:transducer 与 CTC。这不是保守,而是对"部署友好"的坚持——两者都可以做到流式逐帧解码,且解码过程无需外挂语言模型。传统 Kaldi 的流程是声学模型加发音词典再加语言模型的拼接组合,端到端模型把这三层压进一个网络。transducer 的解码结构如下:

flowchart LR A[音频帧] --> B[编码器] B --> C[预测网络] C --> D[联合网络] D --> E{达到 Blank?} E -->|是| A E -->|否| F[输出 token]

transducer 由编码器、预测网络、联合网络三件套组成:编码器吃音频帧产出声学表示,预测网络记住已输出的历史,联合网络决定下一步是输出一个 token 还是遇到空白符号继续等下一帧——这个"发射或等待"的循环正是流式识别的机制基础。CTC 则更简单,通过引入空白符号允许一帧对齐多输出或零输出,整段音频一次前向就能得到结果,代价是流式能力弱于 transducer。

文档站支持的模型家族覆盖了主流选择:Zipformer 系(流式与非流式、多语言版本)是自家主打,Paraformer 来自达摩院,SenseVoice 支持中英日韩粤五语种,还兼容 Whisper tiny、NeMo 的 Citrinet 与 Conformer、Moonshine、FireRedASR、TeleSpeech 等。模型来源多元,但导出格式统一,这正是"框架"的价值所在。

3、流式与非流式

文档站专门有一页 FAQ 解释"在线、离线、流式、非流式的区别"——这个概念混淆是新手最常见的困惑。两种模式的数据流对比如下:

flowchart LR subgraph S [流式识别] A1[麦克风] --> B1[音频块] B1 --> C1[增量解码] C1 --> D1[实时出字] D1 -.循环.-> B1 end subgraph N [非流式识别] A2[完整音频] --> B2[整段编码] B2 --> C2[一次解码] C2 --> D2[最终文本] end

流式识别边说边出字,延迟以百毫秒计,适合语音助手与实时字幕;非流式识别等音频完整再解码,准确率更高,适合文件转写与字幕生成。sherpa 家族对两种模式都提供完整支持,且 API 风格统一——同一套模型接口,流式与否由模型本身决定而非代码改写。

两个配套能力让这条流水线更完整。VAD(语音活动检测,用 silero-vad)负责切分长音频里的有效语音段,与识别解耦后能显著省算力;端点检测(endpointing)让流式识别知道"用户说完了",三规则可调(静音时长、尾部词数、总时长)。热词(hotwords)能力则通过 Aho-Corasick 算法做上下文偏置,把人名、术语这类易错词的识别准确率拉回来——工程细节的完善程度,是这个项目最被称道的地方。

4、平台与语言矩阵

sherpa-onnx 的平台覆盖是开源语音项目里最广的一档。语言绑定与平台组合如下:

层面 覆盖范围
语言 API C、C++、Python、Java、Kotlin、Swift、C#、Go、Rust、JavaScript、Pascal
桌面与服务器 Linux、Windows、macOS(含 CUDA GPU 加速)
移动端 Android(预编译 APK)、iOS、鸿蒙(预编译 HAP)
嵌入式 arm、aarch64、riscv64 交叉编译指南
浏览器 WebAssembly(Hugging Face 在线可试)
框架集成 Flutter、Tauri、Node.js addon

更难得的是能力面不止识别:语音合成(Kokoro、Matcha、VITS 等十余个 TTS 家族)、说话人识别与分离、关键词唤醒、标点恢复、音频事件分类、语音降噪、语种识别——一个运行时装下整条语音链路。文档站甚至为 Lazarus(Free Pascal 的可视化 IDE)写了从字幕生成到跨平台截图的完整教程,这种"小众需求也认真覆盖"的风格,在开源项目里相当罕见。

社区运营同样成体系:微信群、QQ 群、B 站频道、YouTube 频道并行维护,中文教程区收录了大量第三方实战文章——从 RV1126 嵌入式移植到 Unity 实时双语识别,国产硬件与游戏引擎的适配案例一应俱全。

5、嵌入式实测

文档站为多块开发板提供了实测数据页,包括树莓派 3B、Jetson Nano、Jetson NX 与 RISC-V 架构的 VisionFive 2。测量指标是 RTF(实时率,处理一秒音频所需的秒数),RTF 小于一即具备实时能力。树莓派 3B 这类 Cortex-A53 低功耗板在单线程下即可用小模型跑实时识别,Jetson 系列则可通过增加线程数压低 RTF。

sherpa-ncnn 的小模型策略是这些成绩的基础:14M 参数的中文流式 Zipformer、20M 的英文版本、更小的中英双语变体——数十兆的模型配合 int8 量化,让离线语音识别塞进了几块钱的嵌入式芯片。SenseVoice 五语种模型在 RK3588 上也有专门的速度测试页。从 RISC-V 开发板到旗舰手机,同一套 API 与模型格式贯穿始终,这是"全家桶"三个字的实际含义。

6、上手路径

以 Python 用户为例,最小可用流程如下:

# 安装(CPU 版预编译轮子)
pip install sherpa

# sherpa-onnx 全功能版
pip install sherpa-onnx

安装后从 Hugging Face 拉取预训练模型即可开始解码文件或麦克风实时识别,文档站为每个模型都配了"下载、解码单个文件、麦克风实测"三段式教程。不想装任何东西的读者,可以直接打开官方在 Hugging Face Spaces 的 WebAssembly 演示页,浏览器里体验完整识别流程。

进阶路线按需求分层:做语音助手读流式 Zipformer 教程与关键词唤醒;做字幕工具走 VAD 加非流式模型组合;做端侧 App 参考 Android 与 iOS 的预编译示例;训自己的模型则回到 icefall——家族三层结构让每种深度的需求都有明确的入口。

7、选型对比

开源语音部署的几个主流选项对比如下:

方案 定位 优势 短板
sherpa 家族 端侧全栈 平台最广、能力最全、中文生态好 训练链路要回到 icefall
whisper.cpp 单模型推理 Whisper 生态、社区极活跃 仅识别无合成、流式弱
FunASR 阿里系工具链 Paraformer 中文精度高 平台覆盖不及 sherpa-onnx
vosk 老牌离线识别 稳定、接口简单 模型较旧、能力面窄

选型直觉:要"一个方案覆盖识别、合成、唤醒、说话人"选 sherpa-onnx;只要 Whisper 系识别选 whisper.cpp;追求中文识别极致精度可 FunASR 与 sherpa 组合——FunASR 训练导出、sherpa-onnx 部署,两条路线并不互斥。

8、总结

sherpa 家族用三层仓库完成了语音技术从实验室到口袋的搬运:icefall 管训练、sherpa 管 PyTorch 推理、sherpa-onnx 与 sherpa-ncnn 管全平台落地,统一的模型格式与 API 让一条链路贯通从 RISC-V 开发板到 GPU 服务器。对想上手端侧语音的开发者,建议从浏览器演示页开始感受,再用 Python 包跑通第一个文件转写;对做产品的团队,Android 与鸿蒙的预编译示例是最快的集成路径。语音交互正在成为 AI 应用的默认输入方式,这个把"离线、实时、多平台"做到极致的项目,值得放进每个语音项目的技术选型清单。

相关推荐

Airbnb开源项目
精选开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

2.3k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

142
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.7k