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

Discord.js语音连接subscribe方法无法检测end事件如何解决

问题原因

以下是导致speaking.end事件无法触发的常见原因,按出现概率排序:

  • 缺少必要的Intent配置
    使用Discord.js v13及以上版本开发语音功能时,必须在机器人初始化时开启GuildVoiceStates意图,同时如果使用的是@discordjs/voice包,还需要确保你的机器人已经申请到语音接收特权权限——2022年之后Discord对语音接收功能做了限制,未申请权限的机器人无法获取用户语音状态变更通知,也无法接收音频流数据。
  • 事件监听逻辑错误
    connection.receiver.speaking的end事件触发时会携带停止说话的用户ID作为参数,该事件是全局触发的,不会仅针对你订阅的用户推送,需要在回调中匹配目标用户ID才能正常执行对应逻辑,修正后的示例代码如下:
    let targetUserId = message.member.user.id
    let audioStream = connection.receiver.subscribe(targetUserId)
    audioStream.on('data' , (chunk) => {
      console.log(chunk)
    })
    connection.receiver.speaking.on('end', (userId) => {
      if (userId === targetUserId) {
        console.log("指定用户说话结束")
      }
    })
    
  • 音频流订阅提前终止
    如果audioStream因为报错、超时或者主动调用了destroy()方法终止,语音接收模块会停止监听对应用户的语音状态,也会导致end事件无法触发,你可以添加额外的事件监听排查流状态:
    audioStream.on('error', (err) => {
      console.log('音频流错误', err)
    })
    audioStream.on('close', () => {
      console.log('音频流已关闭')
    })
    
  • 语音连接状态异常
    确认connection的状态为ready,如果连接处于正在连接、断开重连的状态,接收器不会触发任何语音相关事件,可以添加状态监听确认连接是否正常:
    connection.on('stateChange', (oldState, newState) => {
      console.log('语音连接状态变更为', newState.status)
    })
    

内容的提问来源于stack exchange,提问作者Joel Wilkås

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:15:04