通过WebRTC的 OpenAI实时API在用户静音时接收到随机的语音输入——可能是说话者的回声或背景噪声
问题
我在用Flutter构建一款实时语音聊天应用,使用 OpenAI Realtime API over WebRTC(通过flutter_webrtc)实现。系统经常在无人发言时仍接收并转写 用户语音,例如:
- 其他语言的随机文本(例如 "مايكرو ببت پتا")
- 与真实对话无关的短片段
- 它可能把AI自己的声音(扬声器输出)当作麦克风输入
- 或把背景噪声识别为语音
这在移动端(iOS与 Android)发生,且播放时使用扬声器。
设置
- 技术栈: Flutter、flutter_webrtc、OpenAI Realtime API
- 流程: 麦克风 → WebRTC对等连接 → OpenAI API → 机器人音频通过扬声器输出
- 音频: 机器人音频通过扬声器输出,同时麦克风捕捉用户讲话
已尝试的方法
- getUserMedia音频约束: echoCancellation: true、noiseSuppression: true、autoGainControl: false
- 服务器端VAD: 使用session.update,阈值:0.8,静默时长:1500 ms
- 机器人讲话时静音麦克风
- 机器人停讲后的冷却期: 机器人停止说话后大约0.8秒内忽略用户输入
这些方法有所缓解但有时仍会出现。
代码
- getUserMedia与音频约束
_localStream = await navigator.mediaDevices.getUserMedia({
'audio': {
'echoCancellation': true,
'noiseSuppression': true,
'autoGainControl': false,
},
});
- 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'),
);
- 通过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)));
- 平台音频路由
// Android
await Helper.setAndroidAudioConfiguration(
AndroidAudioConfiguration(
androidAudioMode: AndroidAudioMode.inCommunication,
androidAudioStreamType: AndroidAudioStreamType.music,
// ...
),
);
// iOS
await Helper.setAppleAudioIOMode(
AppleAudioIOMode.localAndRemote,
preferSpeakerOutput: true,
);
问题
在这个设置中,避免出现无关的“用户语音”的正确做法是什么,特别是:
- 防止AI自身的音频被拾取(扬声器 → 麦克风)?
- 提高对背景噪声的鲁棒性?
- 是否有在移动端与Realtime API搭配良好的getUserMedia / WebRTC / 平台相关设置?
解决方案
通过使用 声学回声消除(AEC),应用可以实时从麦克风输入中“减去”AI已知的频率模式。这确保OpenAI服务器只“听到”用户的独特振动,有效地让AI自身的回声沉默。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。