共计 4489 个字符,预计需要花费 12 分钟才能阅读完成。
Android 15 语音识别技术演进
Android 15 在语音识别领域主要带来三方面改进:

- 硬件抽象层优化 :新的 Audio HAL 5.0 支持更低延迟的音频通路,实测端到端延迟比 Android 14 降低 23%( 官方测试报告)
- 隐私控制增强:新增 MANAGE_AUDIO_RECORDING 运行时权限,需要动态申请麦克风访问权限
- 多模型支持:允许同时加载多个语音识别模型(如中英文混合识别场景)
基础实现步骤
权限声明与配置
在 AndroidManifest.xml 中声明基础权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MANAGE_AUDIO_RECORDING" /> <!-- Android 15 新增 -->
运行时权限申请逻辑:
val permissions = arrayOf(
Manifest.permission.RECORD_AUDIO,
"android.permission.MANAGE_AUDIO_RECORDING" // 注意字符串形式
)
ActivityResultContracts.RequestMultiplePermissions().run {registerForActivityResult(this) { results ->
if (results.all { it.value}) {initSpeechRecognizer()
}
}.launch(permissions)
}
SpeechRecognizer 核心实现
初始化语音识别器并处理回调:
private lateinit var speechRecognizer: SpeechRecognizer
fun initSpeechRecognizer() {
// 检查设备支持情况
if (!SpeechRecognizer.isRecognitionAvailable(context)) {Toast.makeText(context, "设备不支持语音识别", Toast.LENGTH_SHORT).show()
return
}
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context).apply {
setRecognitionListener(object : RecognitionListener {override fun onReadyForSpeech(params: Bundle?) {Log.d(TAG, "准备就绪")
}
override fun onResults(results: Bundle?) {results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)?.let {textView.text = it[0] // 显示识别结果
}
}
// 其他回调方法省略...
})
}
}
中文语音特殊配置
在启动识别前设置音频参数:
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-CN")
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
// 关键音频参数
putExtra(RecognizerIntent.EXTRA_AUDIO_SOURCE, MediaRecorder.AudioSource.VOICE_RECOGNITION)
putExtra(RecognizerIntent.EXTRA_AUDIO_SAMPLING_RATE, 16000) // 16kHz 更适合中文
putExtra(RecognizerIntent.EXTRA_AUDIO_ENCODING, AudioFormat.ENCODING_PCM_16BIT)
}
speechRecognizer.startListening(intent)
性能优化实践
麦克风参数调优
通过 AudioManager 调整麦克风特性:
val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
audioManager.setParameters("noise_suppression=on;agc=on;echo_cancellation=on")
推荐测试组合参数:
- 会议场景:
noise_suppression=aggressive - 车载环境:
noise_suppression=auto;agc=car_mode
识别模式选择策略
// 检测网络状态决定使用模式
val cm = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val isOfflineMode = cm.activeNetwork?.let {cm.getNetworkCapabilities(it)?.hasCapability(NET_CAPABILITY_NOT_METERED) != true
} ?: true
intent.putExtra(
RecognizerIntent.EXTRA_PREFER_OFFLINE,
isOfflineMode
)
延迟监控实现
使用 PerformanceMonitor API(Android 15 新增):
val perfMonitor = PerformanceMonitor.create(context)
perfMonitor.addMetric("speech_latency") { snapshot ->
val latency = SystemClock.uptimeMillis() - speechStartTime
snapshot.putLong("end_to_end_latency", latency)
}
// 在识别结果的回调中触发记录
override fun onResults(results: Bundle?) {perfMonitor.takeSnapshot("recognition_complete")
}
常见问题解决方案
国产 ROM 适配
处理华为 / 小米等设备的特殊问题:
// 华为 EMUI 需要额外设置
if (Build.MANUFACTURER.equals("HUAWEI", ignoreCase = true)) {intent.putExtra("com.huawei.extra.asr_engine", "com.huawei.asr")
}
// 小米设备需要检查语音服务是否存活
if (Build.MANUFACTURER.equals("Xiaomi", ignoreCase = true)) {
val isServiceRunning = runCatching {
context.packageManager.getServiceInfo(
ComponentName("com.android.settings",
"com.xiaomi.asr.MiSpeechService"), 0
) != null
}.getOrDefault(false)
if (!isServiceRunning) {// 启动备用方案}
}
内存泄漏预防
在 Activity 销毁时正确释放资源:
override fun onDestroy() {
speechRecognizer.apply {stopListening()
destroy()}
super.onDestroy()}
隐私合规要点
- 在隐私政策中明确说明语音数据用途
- 实现自动删除原始音频的机制(保留不超过 7 天)
- 提供显式的用户控制开关:
<Preference
android:key="voice_data_collection"
android:title="语音数据收集"
android:summaryOn="已启用"
android:summaryOff="已禁用"
android:defaultValue="false" />
进阶方向
自定义唤醒词集成
使用 SoundTriggerManager 实现:
val soundTriggerManager = getSystemService(SOUND_TRIGGER_SERVICE) as SoundTriggerManager
val modelParams = SoundTriggerManager.ModelParams(
"wakeword_model",
RecognitionConfig.Builder()
.setCaptureRequested(true)
.build())
soundTriggerManager.loadModel(modelParams)
TensorFlow Lite 应用示例
加载端侧语音模型:
val options = Interpreter.Options().apply {setNumThreads(4)
setUseNNAPI(true)
}
val interpreter = Interpreter(loadModelFile("asr_model.tflite"), options)
fun processAudioBuffer(buffer: ShortArray): String {val input = arrayOf(buffer)
val output = Array(1) {ByteArray(MAX_TEXT_LENGTH) }
interpreter.run(input, output)
return output[0].decodeToString()}
动手挑战
实现带标点预测的语音转写功能:
- 继承 RecognitionListener 重写 onPartialResults 方法
- 使用 Android 15 新增的 PUNCTUATION_ENABLED 参数
- 通过正则表达式处理原始文本
参考实现:
intent.putExtra("android.speech.extra.PUNCTUATION_ENABLED", true)
override fun onPartialResults(partialResults: Bundle?) {partialResults?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)?.let {val processedText = it[0]
.replace(",", ",")
.replace("。", "。")
textView.text = processedText
}
}
参考资料
正文完
