Android 离线语音输入实现方案
在移动应用开发中,语音输入已成为提升用户体验的重要交互方式。然而,传统的云端语音识别方案存在明显的痛点:网络依赖、隐私风险、延迟抖动、成本不可控。对于需要高隐私保护、弱网环境可用、或实时性要求高的场景,真正的离线语音识别成为必需。
⚠️ 注意:本文讨论的"离线语音识别"指的是完全端侧运行的方案,模型文件打包在 APK 中或下载到本地,识别过程不依赖任何网络请求。Google SpeechRecognizer 的"离线模式"并非真正的离线方案。
三大主流方案对比
| 方案 | 模型大小 | 准确率 | 实时性 | 推荐指数 |
|---|---|---|---|---|
| Sherpa ONNX | 30MB-200MB | ⭐⭐⭐⭐⭐ | 优秀 | ⭐⭐⭐⭐⭐ 首选 |
| Whisper | 39MB-155MB | ⭐⭐⭐⭐⭐ | 一般 | ⭐⭐⭐⭐ 适合转写 |
| Vosk | 50MB-1GB | ⭐⭐⭐⭐ | 优秀 | ⭐⭐⭐⭐ 备选 |
Sherpa ONNX(强烈推荐)
Sherpa ONNX 是新一代开源语音识别工具包,基于下一代 Kaldi(k2)和 ONNX Runtime,专为嵌入式和移动设备优化。
核心优势:模型小巧、支持流式识别、延迟极低、中文效果优异、活跃社区维护。
快速集成
- 下载模型:从 Releases 下载中文模型(推荐 20M 版本,约 60MB)
- 添加依赖:
implementation 'com.github.k2-fsa:sherpa-onnx-android:1.10.0' - 初始化识别器:加载模型并创建
OfflineRecognizer - 录音识别:使用
AudioRecord采集音频,调用recognizer.decode()
核心代码
// 初始化识别器
val config = OfflineRecognizerConfig().apply {
modelConfig = OfflineModelConfig().apply {
transducer = OfflineTransducerModelConfig().apply {
encoder = "$modelDir/encoder.onnx"
decoder = "$modelDir/decoder.onnx"
joiner = "$modelDir/joiner.onnx"
}
tokens = "$modelDir/tokens.txt"
numThreads = 4
}
}
val recognizer = OfflineRecognizer(config)
// 识别音频
val result = recognizer.decode(audioData, 16000f)
println(result.text)
完整实现参考官方 Android 示例项目。
模型选择
| 场景 | 推荐模型 | 大小 | RTF* |
|---|---|---|---|
| 实时语音输入 | Zipformer 20M | ~60MB | 0.1 |
| 低功耗设备 | Zipformer 14M | ~40MB | 0.05 |
| 高准确率 | Paraformer | ~200MB | 0.3 |
* RTF:处理 1 秒音频所需时间,< 1 表示实时
Whisper(适合转写)
Whisper 是 OpenAI 开源的通用语音识别模型。需要通过 whisper.cpp 移植到 Android。
局限:不支持流式识别,需要完整音频文件,延迟较高(RTF ≈ 1.0),不适合实时语音输入。
Vosk(备选)
Vosk 基于传统 Kaldi,API 设计简洁,适合快速原型开发。但模型相对老旧,Sherpa ONNX 是更好的选择。
// Vosk 简洁 API
val model = Model("/path/to/model")
val recognizer = Recognizer(model, 16000f)
recognizer.acceptWaveform(buffer)
val result = recognizer.result()
性能优化建议
- 减小 APK 体积:首次启动时从服务器下载模型
- 提升准确率:确保 16kHz 采样率,添加降噪和 VAD
- 内存优化:延迟加载模型,识别器实例复用
- 热词优化:使用热词文件提升领域词汇识别率
总结
Android 离线语音识别技术已经相当成熟,Sherpa ONNX 凭借出色的性能、小巧的模型体积和活跃的社区,成为当前最推荐的方案。
| 方案 | 推荐场景 | 注意事项 |
|---|---|---|
| Sherpa ONNX | 实时语音输入、低延迟场景 | 首选方案,中文效果优异 |
| Whisper | 语音转写、多语言支持 | 不支持流式,延迟较高 |
| Vosk | 快速原型、简单集成 | 模型较老,建议迁移到 Sherpa |
官方仓库:
Sherpa ONNX:github.com/k2-fsa/sherpa-onnx
Whisper.cpp:github.com/ggerganov/whisper.cpp
Vosk:github.com/alphacephei/vosk-api
Sherpa ONNX:github.com/k2-fsa/sherpa-onnx
Whisper.cpp:github.com/ggerganov/whisper.cpp
Vosk:github.com/alphacephei/vosk-api