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

Discord.js如何监听特定语音频道用户的开始/停止说话事件

实现说话状态的事件驱动监听,告别轮询!

嘿,我完全懂你不想靠轮询盯着频道成员说话状态的心情——这不仅浪费资源,代码写起来也闹心。其实你要的事件驱动方式是存在的,只是没找对地方:这类状态监听不是挂在全局client对象上,而是和语音连接对象绑定的。

核心思路:监听语音连接的speaking事件

不管你用的是Discord.js还是其他同类Discord开发库,几乎都提供了语音连接层面的speaking事件,专门用来触发用户开始/停止说话的状态变化。下面以Discord.js为例,给你具体实现步骤:

  • 先拿到目标语音频道对象,调用join()方法建立语音连接
  • 对返回的VoiceConnection对象监听speaking事件,这个事件会在用户说话状态改变时触发,参数包含用户对象和状态信息

代码示例

// 假设你已经通过业务逻辑拿到了目标语音频道对象 voiceChannel
voiceChannel.join()
  .then(connection => {
    // 监听说话状态变化
    connection.on('speaking', (user, speakingStatus) => {
      // speakingStatus.bitfield 为1代表开始说话,0代表停止
      if (speakingStatus.bitfield === 1) {
        console.log(`${user.tag} 开始说话啦!`);
      } else {
        console.log(`${user.tag} 已经停止说话了~`);
      }
    });
  })
  .catch(error => {
    console.error('建立语音连接失败:', error);
  });

监听全服务器语音频道的说话状态

如果需要覆盖服务器内所有语音频道,可以结合voiceStateUpdate事件:当用户加入语音频道时,自动给对应连接绑定speaking监听;用户离开时移除监听,避免内存泄漏。

补充提醒

  • 不同库的事件参数可能略有差异,但核心逻辑都是通过语音连接对象监听用户说话状态,而非全局client事件
  • 确保你的库是最新版本,旧版本可能存在事件名称或参数逻辑的变动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:12:37