共计 2681 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么语音识别总出问题?
语音识别在移动端开发中常遇到三个典型问题:

- 网络依赖问题 :大多数云 API 需要稳定网络,在地铁等弱网环境体验直线下降
- 环境噪声干扰 :麦克风采集的音频包含背景音乐、人声混杂等干扰因素
- 多语言适配 :中英文混合输入时,普通识别引擎准确率可能下降 40%
技术方案选型:SpeechRecognizer vs ML Kit
Android 原生 SpeechRecognizer
- 优点 :
- 系统级集成,无需额外依赖
- 支持离线识别(需系统语言包支持)
-
免费调用无次数限制
-
缺点 :
- 识别精度依赖厂商 ROM 实现
- 最长录音限制约 60 秒
- 中文混合识别准确率约 78%
Google ML Kit Speech-to-Text
- 优点 :
- 云端模型准确率可达 92%+
- 支持实时流式识别
-
自动处理噪声抑制
-
缺点 :
- 需要绑定 Firebase
- 免费版有调用配额限制
- 离线模型体积较大(约 120MB)
核心代码实现
基础语音识别(Kotlin 版)
class SpeechActivity : AppCompatActivity() {
private val speechRecognizer by lazy {SpeechRecognizer.createSpeechRecognizer(this).apply {
setRecognitionListener(object : RecognitionListener {override fun onResults(results: Bundle) {results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)?.let {
// 处理识别结果
textView.text = it[0]
}
}
// 必须实现所有回调方法
override fun onError(error: Int) {when (error) {SpeechRecognizer.ERROR_NO_MATCH -> showToast("未检测到语音")
ERROR_SPEECH_TIMEOUT -> showToast("录音超时")
}
}
// 其他回调省略...
})
}
}
fun startListening() {Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
// 关键参数配置
putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-CN")
putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true) // 实时返回中间结果
speechRecognizer.startListening(this)
}
}
}
音频预处理技巧
-
降噪处理(需 API 16+)
val audioSource = MediaRecorder.AudioSource.VOICE_RECOGNITION // 专用语音采集源 val sampleRate = 16000 // 16kHz 采样率 val channelConfig = AudioFormat.CHANNEL_IN_MONO val audioFormat = AudioFormat.ENCODING_PCM_16BIT val bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) val audioRecord = AudioRecord( audioSource, sampleRate, channelConfig, audioFormat, bufferSize ) -
离线模式激活
Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "zh-CN") putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true) // 强制离线 }
避坑实战经验
设备兼容性处理
-
检测麦克风可用性:
val pm = context.packageManager val hasMic = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE) -
华为 / 小米特殊适配:
// 部分厂商需要单独申请录音权限 if (Build.MANUFACTURER.equals("HUAWEI", ignoreCase = true)) {requestPermissions(arrayOf("com.huawei.permission.USE_RECORD"), 100) }
长语音处理方案
- 分段识别:每 45 秒自动分段提交
- 内存优化:
// 使用环形缓冲区 val ringBuffer = RingBuffer(1024 * 1024) // 1MB 缓存
中英文混合识别
// ML Kit 专属配置
val sttOptions = FirebaseSpeechRecognizerOptions.Builder()
.setLanguage("zh")
.setModel(FirebaseSpeechRecognizerOptions.LANGUAGE_MODEL_CHAT) // 对话优化
.enableAutomaticPunctuation() // 自动标点
.build()
性能优化数据
| 指标 | SpeechRecognizer | ML Kit |
|---|---|---|
| 平均响应时间 | 1.2s | 0.8s |
| CPU 占用率 | 15% | 22% |
| 中文准确率 | 78% | 91% |
| 英文数字识别准确率 | 65% | 89% |
进阶思考:Compose 实时可视化
@Composable
fun VoiceWave() {val amplitudes = remember { mutableStateListOf<Float>() }
LaunchedEffect(Unit) {while (true) {
// 从 AudioRecord 获取实时振幅
amplitudes.add(getCurrentAmplitude())
delay(50)
}
}
Canvas(modifier = Modifier.fillMaxWidth().height(80.dp)) {
// 绘制声波动画
amplitudes.forEachIndexed { i, amp ->
drawLine(...)
}
}
}
结语
实际开发中建议:
– 简单场景用 SpeechRecognizer 节省成本
– 高要求场景用 ML Kit+ 自定义降噪
– 关键是要做好音频采集阶段的预处理
下次可以试试把识别结果实时投射到 AR 眼镜上,那才是真正的未来交互体验!
正文完
