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

如何使用Discord.js v13实时获取语音频道成员的说话状态

如何用Discord.js v13实时检测语音频道成员的说话状态

如果你想在自己的Discord.js v13应用里复现Discord自带的“绿圈说话状态”效果,实时检测语音频道里每位成员的说话状态,其实可以借助@discordjs/voice库来实现——这也是我后来解决这个问题的关键方向,参考了Recorder BOT的示例代码后,整理出了可行的实现方案,下面直接上代码和关键点说明:

const { Client, Intents, VoiceChannel } = require('discord.js')
const { joinVoiceChannel, getVoiceConnection, entersState, VoiceConnectionStatus } = require('@discordjs/voice');
const client = new Client({ intents: ['GUILD_VOICE_STATES', 'GUILD_MESSAGES', 'GUILDS'] });

client.on("messageCreate", async (message) => {
  if(message.content.toLowerCase() === "test") {
    // 检查是否已有语音连接
    var connection = getVoiceConnection(message.guildId)
    if(!connection){
      // 加入当前用户所在的语音频道
      connection = joinVoiceChannel({
        channelId: message.member.voice.channelId,
        guildId: message.guildId,
        adapterCreator: message.guild.voiceAdapterCreator,
        selfDeaf: false,
        selfMute: true, // 机器人静音避免干扰频道成员
      });
    }
    try {
      // 等待连接进入就绪状态
      await entersState(connection, VoiceConnectionStatus.Ready, 20e3);
      // 监听成员开始说话的事件
      connection.receiver.speaking.on("start", (userId) => {
        console.log( `${userId} 开始说话了` );
      });
      // 监听成员停止说话的事件
      connection.receiver.speaking.on("end", (userId) => {
        console.log( `${userId} 停止说话了` );
      });
      console.log( "已准备好检测说话状态" );
    } catch (error) {
      console.warn("连接语音频道出错:", error);
    }
  }
});

client.login('YOUR-TOKEN')

关键要点说明:

  • 权限与意图:必须启用GUILD_VOICE_STATES、GUILDS和GUILD_MESSAGES这几个Intents,否则机器人无法获取语音状态和消息事件。
  • 语音连接:通过joinVoiceChannel让机器人加入目标语音频道,设置selfMute: true是为了让机器人静音,避免干扰频道内的正常交流。
  • 说话状态监听:核心是connection.receiver.speaking这个事件发射器,它会在成员开始说话(start事件)和停止说话(end事件)时触发,你可以在这两个事件回调里处理自己的业务逻辑,比如更新UI上的“绿圈”状态标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:32:35