如何静音WebRTC中OpenAI实时API的远程音频输出
如何静音OpenAI Realtime API的WebRTC远程音频输出?
我开发了一个用WebRTC连接OpenAI Realtime API的应用,目前麦克风静音功能正常,但想实现静音Realtime API的输出音频。
相关代码如下:
internal class WebRTCClient ( onIncomingEvent: (OpenAiEvent) -> Unit, context: Context, ) { private val peerConnectionFactory: PeerConnectionFactory private val peerConnection: PeerConnection private val negotiateJob = AtomicReference<Job?>(null) private val audioSource: AudioSource private val localAudioTrack: AudioTrack private val dataChannel: DataChannel init { peerConnectionFactory = createPeerConnectionFactory(context) peerConnection = createPeerConnection() createAudioSourceAndTrack().let { audioSource = it.first localAudioTrack = it.second } val sender = peerConnection.addTrack(localAudioTrack) } private fun createAudioSourceAndTrack(): Pair<AudioSource, AudioTrack> { Napier.d(tag = TAG) { "Audio track: creating and adding" } val audioSource: AudioSource = peerConnectionFactory.createAudioSource(MediaConstraints()) val localAudioTrack = peerConnectionFactory.createAudioTrack("mic", audioSource) localAudioTrack.setEnabled(true) return Pair(audioSource, localAudioTrack) } }
我尝试了以下代码,但没有任何效果,AI的输出音频仍在播放:
fun setAudioTrackEnabled(enabled: Boolean) { localAudioTrack.setEnabled(enabled) }
解决方案
你当前的setAudioTrackEnabled方法操作的是本地音频轨道(麦克风输入),只会影响你传给AI的声音,无法控制远程(AI输出)的音频。要静音远程音频,需要操作收到的远程音频轨道,步骤如下:
监听PeerConnection的
onTrack回调,保存远程音频轨道
修改createPeerConnection方法,设置PeerConnection.Observer并重写onTrack方法,获取并保存远程音频轨道引用:private var remoteAudioTrack: AudioTrack? = null private fun createPeerConnection(): PeerConnection { val observer = object : PeerConnection.Observer { // 按需实现其他必要的回调方法(如onIceCandidate、onConnectionChange等) override fun onTrack(transceiver: RtpTransceiver?) { transceiver?.receiver?.track?.let { track -> // 判断是否为音频轨道 if (track.kind() == MediaStreamTrack.AUDIO_TRACK) { remoteAudioTrack = track as AudioTrack } } } // 示例:实现其他必填回调(空实现即可,按需补充逻辑) override fun onIceCandidate(candidate: IceCandidate?) {} override fun onConnectionChange(newState: PeerConnection.PeerConnectionState?) {} override fun onSignalingChange(newState: PeerConnection.SignalingState?) {} // 其他未实现的Observer方法按需补充 } // 传入你的PeerConnection配置和observer创建实例 return peerConnectionFactory.createPeerConnection(/*你的RTCConfiguration*/, observer) }实现静音远程音频的方法
在WebRTCClient类中添加控制远程音频的方法:fun muteRemoteAudio(mute: Boolean) { // enabled设为false时静音,true时恢复 remoteAudioTrack?.setEnabled(!mute) }
调用muteRemoteAudio(true)即可静音AI的输出音频,调用muteRemoteAudio(false)恢复播放。
内容的提问来源于stack exchange,提问作者Sorry
相关产品推荐
相关产品推荐

