给公司的安全管理类 App 做语音填单时,把 sherpa-onnx 封装成了一个开箱即用的 uni-app 插件,已经上架插件市场,把接入方式和踩坑记录分享给大家。
功能一览
- 离线流式识别:边说边出字,录音不上传、不联网、无按次费用
- 中英混说:基于 sherpa-onnx 双语流式模型
zl-voice-input组件:长按右下角麦克风说话,松手自动上屏,识别结果可编辑,支持v-model- 模型托管:约 200MB 模型首次使用自动下载(内置 hf-mirror 镜像 + 支持自有源),下载进度可监听
- 权限闭环:录音权限申请、被拒引导跳系统设置
平台范围:uni-app + Android(arm64-v8a,minSdkVersion 21),Vue2 / Vue3 均可。
三步接入
- 插件市场导入
uni_modules/sherpa-asr,制作自定义调试基座(含 Kotlin 混编与 AAR,标准基座跑不起来) - 把插件自带的
example/model-page.vue复制到pages/model/model.vue并注册路由 - 表单页直接使用组件(easycom 自动注册,无需 import):
<zl-voice-input v-model="content" placeholder="请填写排查内容" />
踩坑记录
- UTS 插件是性价比最高的原生路线:免人工审核(传统原生插件要审核约一周),
utssdk/app-android下可以直接写 Kotlin,sherpa-onnx 的 AAR 直接放libs/ - 标准基座不含第三方 AAR:必须自定义基座,否则报
Failed resolution of OnlineTransducerModelConfig - 模型管理比想象中重:多源容灾(huggingface 国内不稳,hf-mirror 兜底)、按字节数校验跳过已下载文件、临时文件清理(
uni.downloadFile会残留约 200MB 副本) - 录音链路:AudioRecord 16kHz 单声道 PCM16,JS 侧轮询
getPartial()拿实时结果,避免高频事件穿越 JS 桥 - 组件做了 Vue2 / Vue3 双兼容:同时声明
value/input与modelValue/update:modelValue
获取与反馈
- 插件市场:sherpa-asr 离线语音转文字(语音识别)(普通授权 ¥100 / 源码授权 ¥399)
- 掘金更详细的实现文章:uni-app 离线语音转文字插件(sherpa-onnx)
iOS 版本已在开发计划中,uni-app x 支持在评估(它的 UTS 体系没有 plus.*,模型下载与权限模块需重写)。有问题直接回帖或在插件市场评论区留言。