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

求助:Expo对接OpenAI实时API时iPhone音频仅从顶部扬声器输出

解决iPhone上WebRTC音频从顶部扬声器输出的问题

核心原因

iOS在启用录音(allowsRecordingIOS: true)时,默认会将音频输出切换到顶部听筒,防止麦克风与扬声器产生反馈回路。要强制使用底部外放扬声器,需要显式配置音频会话参数。

解决方案步骤

1. 完善音频模式配置

修改startSession函数中的Audio.setAudioModeAsync调用,添加强制扬声器的关键参数:

import { Audio } from 'expo-av'; // 确保已导入Expo AV模块

async function startSession() {
  // 配置音频模式,强制输出到扬声器
  await Audio.setAudioModeAsync({
    allowsRecordingIOS: true,
    playsInSilentModeIOS: true,
    audioMode: Audio.AudioMode.PlayAndRecord, // 明确设置为播放+录制模式
    usesInternalSpeaker: false, // 禁用内部听筒,使用底部扬声器
    shouldDuckAndroid: false, // Android端可选:不压低其他应用音频
  });

  // 激活音频会话,确保配置生效
  await Audio.setAudioSessionActiveAsync(true);

  // 后续原有代码...
}

2. 确保权限配置

在app.json的iOS配置中添加麦克风权限描述,避免权限异常导致音频路由失效:

{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSMicrophoneUsageDescription": "需要访问麦克风进行实时语音交互"
      }
    }
  }
}

3. 可选:远程轨道加载后确认音频路由

如果上述配置仍不生效,可在远程音频轨道加载后,再次激活音频会话确保路由正确:

pc.addEventListener('track', async (event) => {
  if (event.track) {
    remoteMediaStream.current.addTrack(event.track);
    // 远程轨道加载后,重新激活音频会话
    await Audio.setAudioSessionActiveAsync(true);
  }
});

关键说明

  • usesInternalSpeaker: false是iOS端强制使用扬声器的核心参数,当allowsRecordingIOS为true时必须设置。
  • audioMode: Audio.AudioMode.PlayAndRecord明确告知系统当前需要同时处理播放和录制,避免自动切换到听筒。
  • 音频会话激活操作(setAudioSessionActiveAsync(true))需要在配置后调用,确保参数生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:32:07