Android语音识别完整实现指南
一、语音识别技术概述
语音识别(Speech Recognition)是将人类语音转换为可读文本的技术,在Android平台主要通过SpeechRecognizer API实现。相比第三方SDK,原生API具有轻量级、无需网络依赖(部分模式)等优势,适合对隐私和性能要求较高的场景。
1.1 技术选型对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 原生API | 无需额外依赖,支持离线识别 | 功能相对基础 |
| Google ML Kit | 识别准确率高,支持多语言 | 需要网络连接(部分功能) |
| 第三方SDK | 功能丰富(如语义理解) | 增加包体积,可能涉及隐私风险 |
二、实现前的准备工作
2.1 添加必要权限
在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 仅当需要网络识别时添加 --><uses-permission android:name="android.permission.INTERNET" />
2.2 检查权限(Android 6.0+)
private fun checkAudioPermission(): Boolean {return ContextCompat.checkSelfPermission(this,Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED}private fun requestAudioPermission() {ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.RECORD_AUDIO),REQUEST_AUDIO_PERMISSION)}
三、核心实现步骤
3.1 创建SpeechRecognizer实例
private lateinit var speechRecognizer: SpeechRecognizerprivate lateinit var recognitionListener: RecognitionListenerprivate fun initSpeechRecognizer() {speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)recognitionListener = MyRecognitionListener()speechRecognizer.setRecognitionListener(recognitionListener)}class MyRecognitionListener : RecognitionListener {override fun onResults(results: Bundle?) {val matches = results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)matches?.let {val resultText = it[0] // 获取最可能的结果runOnUiThread { textView.text = resultText }}}// 其他必要方法实现(空实现即可)override fun onBeginningOfSpeech() {}override fun onEndOfSpeech() {}override fun onError(error: Int) {Log.e("SpeechError", "Error code: $error")}// ... 实现其他7个方法}
3.2 配置识别参数
private fun startListening() {val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, packageName)putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5) // 返回最多5个候选结果// 离线识别配置(需设备支持)putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true)}speechRecognizer.startListening(intent)}
3.3 完整Activity示例
class MainActivity : AppCompatActivity() {private lateinit var speechRecognizer: SpeechRecognizerprivate lateinit var btnSpeak: Buttonprivate lateinit var textView: TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)btnSpeak = findViewById(R.id.btnSpeak)textView = findViewById(R.id.textView)if (!checkAudioPermission()) {requestAudioPermission()} else {initSpeechRecognizer()}btnSpeak.setOnClickListener {if (checkAudioPermission()) {startListening()} else {Toast.makeText(this, "需要录音权限", Toast.LENGTH_SHORT).show()}}}// ... 前文定义的权限检查和识别器初始化方法override fun onDestroy() {super.onDestroy()speechRecognizer.destroy() // 释放资源}}
四、高级功能实现
4.1 持续监听模式
// 在RecognitionListener中处理部分结果override fun onPartialResults(partialResults: Bundle?) {val matches = partialResults?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)matches?.let {val interimText = it[0]runOnUiThread { textView.text = interimText }}}// 修改启动参数private fun startContinuousListening() {val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true) // 启用部分结果// 其他配置...}speechRecognizer.startListening(intent)}
4.2 错误处理增强
override fun onError(error: Int) {val errorMessage = when (error) {SpeechRecognizer.ERROR_AUDIO -> "音频录制错误"SpeechRecognizer.ERROR_CLIENT -> "客户端错误"SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> "权限不足"SpeechRecognizer.ERROR_NETWORK -> "网络错误"SpeechRecognizer.ERROR_NO_MATCH -> "未识别到语音"SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> "识别服务忙"SpeechRecognizer.ERROR_SERVER -> "服务器错误"SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> "无语音输入"else -> "未知错误"}runOnUiThread {Toast.makeText(this, "识别错误: $errorMessage", Toast.LENGTH_SHORT).show()}}
五、性能优化建议
-
资源管理:
- 在
onPause()中调用speechRecognizer.cancel() - 在
onDestroy()中调用speechRecognizer.destroy()
- 在
-
识别参数调优:
// 针对短语音优化intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 1000)intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 1000)
-
多语言支持:
// 设置中文识别intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-CN")// 或支持多种语言intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "zh-CN,en-US")
六、完整项目结构建议
app/├── src/│ ├── main/│ │ ├── java/com/example/speech/│ │ │ ├── MainActivity.kt│ │ │ ├── SpeechHelper.kt // 封装识别逻辑│ │ │ └── SpeechListener.kt // 自定义监听器│ │ └── res/│ │ ├── layout/activity_main.xml│ │ └── values/strings.xml│ └── AndroidManifest.xml└── build.gradle
七、常见问题解决方案
-
无识别结果:
- 检查麦克风权限
- 增加
EXTRA_MAX_RESULTS值 - 测试不同语言模型
-
识别延迟高:
- 启用离线模式(如果设备支持)
- 减少返回结果数量
- 优化音频输入参数
-
服务不可用:
- 检查设备是否支持语音识别:
val isAvailable = SpeechRecognizer.isRecognitionAvailable(this)
- 检查设备是否支持语音识别:
八、扩展功能建议
- 结合NLP处理:将识别结果传递给NLP引擎进行语义分析
- 语音指令系统:定义特定语音命令触发操作
- 实时字幕:在视频播放时显示实时语音转文字
通过以上实现,开发者可以快速在Android应用中集成功能完善的语音识别能力。实际开发中,建议将识别逻辑封装为独立模块,便于复用和维护。