- 核心框架:
android.speech- 这是最基础、最常用的语音识别 API。 - 高级框架:
MediaPipe- Google 提供的强大工具,用于实时音频流处理和机器学习。 - 专业领域:
ML Kit- 用于离线、设备端的特定声音识别任务。 - 系统级功能:
AccessibilityService- 实现全局语音控制。 - 硬件与系统底层 - 支持声音识别的硬件基础和系统服务。
- 开发实践与最佳实践 - 如何在实际项目中应用这些技术。
核心框架:android.speech - 语音识别与合成
这是 Android 系统自带的、用于处理语音输入和输出的核心 API,它主要包含两个部分:

a) RecognizerIntent - 语音识别
这是实现“语音转文字”(Speech-to-Text, STT)最直接的方式,它会调用系统自带的语音识别服务(如 Google 语音助手),并返回识别结果。
主要特点:
- 系统级集成:用户体验好,界面熟悉。
- 需要网络:通常需要连接互联网才能获得高准确率的结果。
- 功能丰富:可以识别语音搜索、自由form文本、命令等。
核心组件:
SpeechRecognizer:管理识别过程的类。RecognizerIntent:一个Intent,用于启动语音识别活动。
基本使用流程:

-
检查权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
-
创建
SpeechRecognizer实例:SpeechRecognizer speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
-
设置
RecognitionListener:用于接收识别过程中的各种回调(开始、结束、结果、错误等)。speechRecognizer.setRecognitionListener(new RecognitionListener() { @Override public void onResults(Bundle results) { // 获取识别结果 ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); if (matches != null && !matches.isEmpty()) { String result = matches.get(0); // 通常第一个是最佳匹配 Log.d("Speech", "识别结果: " + result); } } @Override public void onError(int error) { Log.e("Speech", "识别错误: " + error); } // ... 其他回调方法 }); -
构建并启动
Intent:
(图片来源网络,侵删)Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); // 是否返回部分结果 // 启动识别 speechRecognizer.startListening(intent);
适用场景:语音搜索、语音输入框、简单的语音命令等。
b) TextToSpeech - 语音合成
这是将文字转换为语音(Text-to-Speech, TTS)的 API。
基本使用流程:
-
初始化
TextToSpeech:TextToSpeech tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { int result = tts.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS", "语言不支持"); } else { // 可以开始朗读 tts.speak("Hello, World!", TextToSpeech.QUEUE_ADD, null, null); } } } }); -
释放资源:
@Override protected void onDestroy() { if (tts != null) { tts.stop(); tts.shutdown(); } super.onDestroy(); }
高级框架:MediaPipe - 实时音频处理
MediaPipe 是 Google 开发的一个跨平台机器学习解决方案,它提供了强大的音频处理能力,可以在设备上对音频流进行实时分析。
主要特点:
- 实时性:专为流式数据设计,延迟低。
- 设备端:模型在设备上运行,保护隐私,无需网络。
- 模块化:提供了预构建的音频解决方案,也支持自定义模型。
核心音频解决方案:
-
Audio Classifier:音频分类器。
- 功能:实时识别音频流中的声音类别,识别是“狗叫”、“猫叫”、“婴儿哭声”还是“敲门声”。
- 预训练模型:Google 提供了多种预训练模型,如“动物声音分类”、“乐器分类”等。
- 适用场景:智能家居(检测烟雾报警器)、安全监控(检测玻璃破碎声)、可穿戴设备(检测摔倒声)。
-
Speech-to-Text:设备端语音识别。
- 功能:在设备上直接进行语音识别,无需网络,支持多种语言。
- 适用场景:对隐私要求高、无网络环境或需要低延迟的应用。
如何使用 MediaPipe Audio Classifier (示例):
-
添加依赖:
implementation 'com.google.mediapipe:tasks-audio:latest_version' // 请替换为最新版本号
-
准备模型文件:将
.tflite模型文件(如yamnet.tflite)放入assets目录。 -
初始化
AudioClassifier:AudioClassifierOptions options = AudioClassifierOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath("yamnet.tflite").build()) .setMaxResults(1) .build(); AudioClassifier classifier = AudioClassifier.createFromFile(this, options); -
创建音频输入:
// 从麦克风获取音频输入 AudioRecord record = classifier.createAudioRecord(); record.startRecording();
-
运行分类:
// 在后台线程中持续运行 new Thread(() -> { while (isRunning) { List<Classifications> classifications = classifier.classify(record); // 处理分类结果,获取置信度最高的类别 if (!classifications.isEmpty()) { Classifications result = classifications.get(0); // ... 更新UI或执行逻辑 } Thread.sleep(100); // 控制频率 } }).start();
专业领域:ML Kit - 特定声音识别
ML Kit 提供了专门用于声音识别的 API,目前最突出的是声音标签检测。
主要特点:
- 设备端:完全在设备上运行,保护隐私。
- 简单易用:API 非常简洁。
- 特定任务:专注于识别环境中的特定声音事件。
核心功能:Sound Classification (声音分类)
- 功能:可以检测预先定义的几类声音,如“婴儿哭声”、“咳嗽声”、“打喷嚏声”、“玻璃破碎声”等。
- 工作方式:它分析短时间内的音频(几秒钟),判断是否包含目标声音,并返回一个布尔值和置信度。
如何使用 ML Kit Sound Classification (示例):
-
添加依赖:
implementation 'com.google.mlkit:sound-label-detection:16.1.0'
-
初始化
SoundLabelDetector:SoundLabelDetectorOptions options = new SoundLabelDetectorOptions.Builder() .setConfidenceThreshold(0.75f) // 设置置信度阈值 .build(); SoundLabelDetector detector = SoundLabelDetector.getClient(options); -
处理音频: 你需要提供一个
AudioRecord或AudioBuffer作为输入,ML Kit 会持续分析这个音频流。// 创建 AudioRecord ... detector.detectFromAudioRecord(record, new SoundLabelDetector.DetectorListener() { @Override public void onDetect(List<SoundLabel> labels) { // 处理检测结果 for (SoundLabel label : labels) { Log.d("ML Kit", "声音: " + label.getLabel() + ", 置信度: " + label.getConfidence()); } } @Override public void onError(@NonNull DetectorException e) { Log.e("ML Kit", "检测错误", e); } });
系统级功能:AccessibilityService - 全局语音控制
如果你的应用需要实现类似“嘿,Google”的全局语音唤醒和命令功能,你需要使用 AccessibilityService。
主要特点:
- 全局监听:可以监听系统级的所有事件,包括按键、触摸和语音事件。
- 需要特殊权限:用户必须在系统设置中手动授权。
- 用于交互:通常用于辅助功能或实现独特的交互方式。
工作流程:
- 创建
AccessibilityService。 - 在
AndroidManifest.xml中声明服务并设置权限。 - 创建配置文件
accessibility_service_config.xml,指定监听的事件类型(如typeNotificationStateChanged,用于检测语音助手的唤醒)。 - 在代码中重写
onAccessibilityEvent方法,当检测到特定事件(如用户说出“Hey MyApp”)时,执行相应操作。
适用场景:自定义语音助手、通过语音控制整个应用或设备功能。
硬件与系统底层
声音识别的体验离不开硬件和系统的支持。
- DSP (Digital Signal Processor):现代 SoC 中通常集成了 DSP,专门用于处理音频信号,如降噪、回声消除、声源定位等,这为上层的声音识别算法提供了高质量的“干净”音频输入。
- Wake Word Engine:系统级的唤醒词引擎(如 Google 的 Ok Google)运行在后台,功耗极低,它负责持续监听麦克风,只有在检测到唤醒词时,才会激活更耗电、更复杂的语音识别模块。
- 系统服务:Android 系统服务(如
SpeechRecognizer的实现)负责协调应用、硬件和云端(如果需要)之间的通信。
开发实践与最佳实践
| 技术方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
android.speech |
系统原生集成,用户体验好,开发简单 | 依赖网络,无法自定义模型,延迟较高 | 语音搜索、通用语音输入、简单的语音命令 |
MediaPipe |
实时性强,设备端运行,功能强大(分类、STT),可自定义 | 学习曲线稍陡,需要处理音频流 | 实时环境音识别(如哭声、警报)、可穿戴设备、低延迟交互 |
ML Kit |
API 简洁,设备端,专注特定声音 | 功能相对固定,不如 MediaPipe 灵活 | 检测特定声音事件(咳嗽、玻璃破碎),作为 App 的一个功能模块 |
AccessibilityService |
全局监听,可以实现强大的交互 | 权限要求高,主要用于辅助功能 | 全局语音唤醒、自定义语音助手 |
选择建议:
- 只是想在 App 里加个语音输入框? -> 用
android.speech。 - 想实时识别环境中的特定声音(比如狗叫)? -> 用
MediaPipe Audio Classifier。 - 想检测几种特定的声音事件(比如咳嗽、玻璃破碎)? -> 用
ML Kit Sound Classification。 - 想做一个类似“嘿,Siri”的全局唤醒功能? -> 用
AccessibilityService。
其他注意事项:
- 权限:始终请求
RECORD_AUDIO权限,并清晰告知用户用途。 - 性能:实时音频处理非常消耗 CPU 和电量,务必在后台线程处理,并在不需要时及时释放资源(如关闭
AudioRecord)。 - 用户体验:提供清晰的视觉或听觉反馈,让用户知道系统正在监听或处理中。
- 隐私:处理用户音频是敏感操作,如果可能,优先选择设备端方案(MediaPipe, ML Kit),并明确告知用户数据不会被上传。
