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

Android如何同时使用OpenTok SDK与Speech Recognizer实现通话及语音转写

Android同时使用OpenTok与语音转写的解决方案

答案是肯定的,但直接用系统原生SpeechRecognizer会因为麦克风独占冲突失败,得通过以下几种方案规避:

方案1:复用OpenTok的音频流给离线语音识别

OpenTok SDK支持获取音频捕获的原始PCM数据流,你可以:

  • 实现OpenTok的音频回调接口(比如PublisherKit.AudioListener),在onAudioData方法中拿到实时的PCM音频数据
  • 把这些数据直接传给离线语音识别引擎(比如各厂商的离线ASR SDK),而不是调用系统SpeechRecognizer
  • 这种方式下,OpenTok持续占用麦克风捕获音频,识别引擎只处理数据流,完全不会冲突

示例代码逻辑:

// 设置OpenTok的音频监听
mPublisher.setAudioListener(new PublisherKit.AudioListener() {
    @Override
    public void onAudioData(PublisherKit publisher, byte[] audioData, int bitsPerSample, int sampleRate, int numberOfChannels) {
        // 将PCM数据传给离线识别引擎
        offlineAsrEngine.feedAudioData(audioData, sampleRate, numberOfChannels);
    }
});

// 启动离线识别
offlineAsrEngine.startRecognition();

方案2:Android 10+ 利用音频共享模式

Android 10及以上系统支持音频录制的共享模式,你可以:

  • 配置自定义MediaRecorder,设置音频源为VOICE_COMMUNICATION,并通过AudioAttributes指定音频用途为语音通信
  • 将这个MediaRecorder的音频流同时提供给OpenTok和识别组件(需要OpenTok支持自定义音频输入源)
  • 这种方式下,所有组件共享同一个麦克风捕获流,避免独占冲突

方案3:改用云端实时语音识别

放弃系统原生SpeechRecognizer,改用云端实时ASR服务:

  • 通过OpenTok的音频回调拿到原始PCM数据,直接推送到云端ASR接口(比如WebSocket实时传输)
  • 云端返回转写结果后展示,全程不需要抢占麦克风,完全不影响OpenTok通话

多组件麦克风管理通用思路

针对多个组件需要访问麦克风的场景,核心原则是单源多消费:

  • 只让一个组件(比如OpenTok)负责麦克风捕获,其他组件通过数据流/回调获取音频数据,避免各自抢占
  • 尽量避开系统级的独占式音频组件(比如原生SpeechRecognizer),选择支持自定义输入的识别方案
  • 如果必须用独占组件,可以尝试毫秒级快速切换:比如设置200ms以内的切换周期,关闭OpenTok音频→启动识别取结果→立即恢复通话,用户几乎感知不到中断(这是退而求其次的方案)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:55:05