You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android语音识别自定义音频源注入:如何正确使用EXTRA_AUDIO_INJECT_SOURCE

向SpeechRecognizer注入音频源的正确实现方案

核心问题原因

你传入res/raw资源URI无响应的核心原因如下:

  • EXTRA_AUDIO_INJECT_SOURCE是系统级隐藏接口,仅允许持有系统签名的应用调用,普通第三方应用无使用权限
  • 即使有权限调用,传入的URI也不能是应用私有res/raw目录对应的资源路径,必须是系统所有进程都可访问的content://格式公共URI,且需要提前给RecognitionService授予该URI的读取权限

第三方应用可用实现方案

方案1:使用系统识别器提供的实时音频写入接口(适配Android 12+)

Android 12及以上版本的SpeechRecognizer公开了writeAudio()方法,可直接注入PCM格式的音频流,不需要调用EXTRA_AUDIO_INJECT_SOURCE参数:

  • 音频要求:16位单声道PCM格式,采样率固定为16000Hz,不可直接传入MP3、AMR等压缩格式
  • 示例代码:
// 初始化识别器
SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(context);
recognizer.setRecognitionListener(yourCustomListener);

// 配置识别参数
Intent recogIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recogIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
recogIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
// 部分ROM需要加此行触发注入模式
recogIntent.putExtra(RecognizerIntent.EXTRA_AUDIO_INJECT_SOURCE, "");

// 启动识别
recognizer.startListening(recogIntent);

// 读取本地音频转成符合要求的PCM字节流后写入
byte[] pcmBuffer = loadPcmFromLocalFile();
recognizer.writeAudio(pcmBuffer, 0, pcmBuffer.length);

// 音频写入完成后触发识别
recognizer.stopListening();
  • 注意必须提前申请RECORD_AUDIO权限,即使不需要调用麦克风也需要授权,否则识别器会直接报错。

方案2:适配Android 12以下系统

如果需要覆盖更低版本系统,直接接入第三方云语音识别服务,直接上传音频文件即可得到识别结果,不需要适配系统识别器的各类限制。

额外注意

部分国产ROM对系统SpeechRecognizer做了功能裁剪,可能不支持音频注入功能,上线前需要做好兼容性测试。


内容的提问来源于stack exchange,提问作者Vishal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:24:04