睿诚科技协会

android 声音识别技术

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

核心框架:android.speech - 语音识别与合成

这是 Android 系统自带的、用于处理语音输入和输出的核心 API,它主要包含两个部分:

android 声音识别技术-图1
(图片来源网络,侵删)

a) RecognizerIntent - 语音识别

这是实现“语音转文字”(Speech-to-Text, STT)最直接的方式,它会调用系统自带的语音识别服务(如 Google 语音助手),并返回识别结果。

主要特点:

  • 系统级集成:用户体验好,界面熟悉。
  • 需要网络:通常需要连接互联网才能获得高准确率的结果。
  • 功能丰富:可以识别语音搜索、自由form文本、命令等。

核心组件:

  • SpeechRecognizer:管理识别过程的类。
  • RecognizerIntent:一个 Intent,用于启动语音识别活动。

基本使用流程:

android 声音识别技术-图2
(图片来源网络,侵删)
  1. 检查权限

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
  2. 创建 SpeechRecognizer 实例

    SpeechRecognizer speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
  3. 设置 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);
        }
        // ... 其他回调方法
    });
  4. 构建并启动 Intent

    android 声音识别技术-图3
    (图片来源网络,侵删)
    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。

基本使用流程:

  1. 初始化 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);
                }
            }
        }
    });
  2. 释放资源

    @Override
    protected void onDestroy() {
        if (tts != null) {
            tts.stop();
            tts.shutdown();
        }
        super.onDestroy();
    }

高级框架:MediaPipe - 实时音频处理

MediaPipe 是 Google 开发的一个跨平台机器学习解决方案,它提供了强大的音频处理能力,可以在设备上对音频流进行实时分析。

主要特点:

  • 实时性:专为流式数据设计,延迟低。
  • 设备端:模型在设备上运行,保护隐私,无需网络。
  • 模块化:提供了预构建的音频解决方案,也支持自定义模型。

核心音频解决方案:

  1. Audio Classifier:音频分类器。

    • 功能:实时识别音频流中的声音类别,识别是“狗叫”、“猫叫”、“婴儿哭声”还是“敲门声”。
    • 预训练模型:Google 提供了多种预训练模型,如“动物声音分类”、“乐器分类”等。
    • 适用场景:智能家居(检测烟雾报警器)、安全监控(检测玻璃破碎声)、可穿戴设备(检测摔倒声)。
  2. Speech-to-Text:设备端语音识别。

    • 功能:在设备上直接进行语音识别,无需网络,支持多种语言。
    • 适用场景:对隐私要求高、无网络环境或需要低延迟的应用。

如何使用 MediaPipe Audio Classifier (示例):

  1. 添加依赖

    implementation 'com.google.mediapipe:tasks-audio:latest_version' // 请替换为最新版本号
  2. 准备模型文件:将 .tflite 模型文件(如 yamnet.tflite)放入 assets 目录。

  3. 初始化 AudioClassifier

    AudioClassifierOptions options = AudioClassifierOptions.builder()
            .setBaseOptions(BaseOptions.builder().setModelAssetPath("yamnet.tflite").build())
            .setMaxResults(1)
            .build();
    AudioClassifier classifier = AudioClassifier.createFromFile(this, options);
  4. 创建音频输入

    // 从麦克风获取音频输入
    AudioRecord record = classifier.createAudioRecord();
    record.startRecording();
  5. 运行分类

    // 在后台线程中持续运行
    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 (示例):

  1. 添加依赖

    implementation 'com.google.mlkit:sound-label-detection:16.1.0'
  2. 初始化 SoundLabelDetector

    SoundLabelDetectorOptions options = new SoundLabelDetectorOptions.Builder()
            .setConfidenceThreshold(0.75f) // 设置置信度阈值
            .build();
    SoundLabelDetector detector = SoundLabelDetector.getClient(options);
  3. 处理音频: 你需要提供一个 AudioRecordAudioBuffer 作为输入,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

主要特点:

  • 全局监听:可以监听系统级的所有事件,包括按键、触摸和语音事件。
  • 需要特殊权限:用户必须在系统设置中手动授权。
  • 用于交互:通常用于辅助功能或实现独特的交互方式。

工作流程:

  1. 创建 AccessibilityService
  2. AndroidManifest.xml 中声明服务并设置权限
  3. 创建配置文件 accessibility_service_config.xml,指定监听的事件类型(如 typeNotificationStateChanged,用于检测语音助手的唤醒)。
  4. 在代码中重写 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),并明确告知用户数据不会被上传。
分享:
扫描分享到社交APP
上一篇
下一篇