通过WebRTC的 OpenAI实时API在用户静音时接收到随机的语音输入——可能是说话者的回声或背景噪声

人工智能 2026-07-12

问题

我在用Flutter构建一款实时语音聊天应用,使用 OpenAI Realtime API over WebRTC(通过flutter_webrtc)实现。系统经常在无人发言时仍接收并转写 用户语音,例如:

  • 其他语言的随机文本(例如 "مايكرو ببت پتا")
  • 与真实对话无关的短片段
  • 它可能把AI自己的声音(扬声器输出)当作麦克风输入
  • 或把背景噪声识别为语音

这在移动端(iOS与 Android)发生,且播放时使用扬声器。

设置

  • 技术栈: Flutter、flutter_webrtc、OpenAI Realtime API
  • 流程: 麦克风 → WebRTC对等连接 → OpenAI API → 机器人音频通过扬声器输出
  • 音频: 机器人音频通过扬声器输出,同时麦克风捕捉用户讲话

已尝试的方法

  1. getUserMedia音频约束: echoCancellation: true、noiseSuppression: true、autoGainControl: false
  2. 服务器端VAD: 使用session.update,阈值:0.8,静默时长:1500 ms
  3. 机器人讲话时静音麦克风
  4. 机器人停讲后的冷却期: 机器人停止说话后大约0.8秒内忽略用户输入

这些方法有所缓解但有时仍会出现。

代码

  1. getUserMedia与音频约束
_localStream = await navigator.mediaDevices.getUserMedia({
  'audio': {
    'echoCancellation': true,
    'noiseSuppression': true,
    'autoGainControl': false,
  },
});
  1. WebRTC设置 – 对等连接与数据通道
final Map<String, dynamic> config = {
  'sdpSemantics': 'unified-plan',
  'iceServers': [],
};
_peerConnection = await createPeerConnection(config);

for (final track in _localStream!.getAudioTracks()) {
  await _peerConnection!.addTrack(track, _localStream!);
}

_dataChannel = await _peerConnection!.createDataChannel(
  'oai-events',
  RTCDataChannelInit(),
);
_dataChannel!.onMessage = (RTCDataChannelMessage data) {
  try {
    final Map<String, dynamic> event =
        jsonDecode(data.text) as Map<String, dynamic>;
    onEvent(event);
  } catch (_) { /* ignore malformed events */ }
};

final RTCSessionDescription offer = await _peerConnection!.createOffer({});
await _peerConnection!.setLocalDescription(offer);
// ... SDP exchange with OpenAI ...
await _peerConnection!.setRemoteDescription(
  RTCSessionDescription(answerSdp, 'answer'),
);
  1. 通过session.update配置VAD
final Map<String, dynamic> sessionUpdate = {
  'type': 'session.update',
  'session': {
    'turn_detection': {
      'type': 'server_vad',
      'threshold': 0.8,
      'prefix_padding_ms': 300,
      'silence_duration_ms': 1500,
      'create_response': true,
      'interrupt_response': true,
    },
  },
};
_dataChannel!.send(RTCDataChannelMessage(jsonEncode(sessionUpdate)));
  1. 平台音频路由
// Android
await Helper.setAndroidAudioConfiguration(
  AndroidAudioConfiguration(
    androidAudioMode: AndroidAudioMode.inCommunication,
    androidAudioStreamType: AndroidAudioStreamType.music,
    // ...
  ),
);

// iOS
await Helper.setAppleAudioIOMode(
  AppleAudioIOMode.localAndRemote,
  preferSpeakerOutput: true,
);

问题

在这个设置中,避免出现无关的“用户语音”的正确做法是什么,特别是:

  1. 防止AI自身的音频被拾取(扬声器 → 麦克风)?
  2. 提高对背景噪声的鲁棒性?
  3. 是否有在移动端与Realtime API搭配良好的getUserMedia / WebRTC / 平台相关设置?

解决方案

通过使用 声学回声消除(AEC),应用可以实时从麦克风输入中“减去”AI已知的频率模式。这确保OpenAI服务器只“听到”用户的独特振动,有效地让AI自身的回声沉默。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章