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

如何静音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输出)的音频。要静音远程音频,需要操作收到的远程音频轨道,步骤如下:

  1. 监听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)
    }
    
  2. 实现静音远程音频的方法
    在WebRTCClient类中添加控制远程音频的方法:

    fun muteRemoteAudio(mute: Boolean) {
        // enabled设为false时静音,true时恢复
        remoteAudioTrack?.setEnabled(!mute)
    }
    

调用muteRemoteAudio(true)即可静音AI的输出音频,调用muteRemoteAudio(false)恢复播放。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:27:10