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

DiscordJSv14语音监听机器人无法接收音频数据包问题求助

问题排查与解决方案

核心问题

你当前代码里用connection.receiver.subscribe(ID)订阅的是机器人自身的ID,但Discord的语音机制不会把机器人自己发送的音频回传给它的语音接收器,所以永远触发不了data事件,自然看不到chunk输出。

针对性解决方案

场景1:监听频道内其他用户的音频

如果需求是捕获语音频道里其他用户的音频,得订阅频道内其他成员的ID,而非机器人自身ID,示例代码如下:

if (isListener) {
    console.log("Listener Is Joining Voice And Listening...");

    const encoder = new OpusEncoder(48000, 2);
    const voiceChannel = guild.channels.cache.get(C.id);
    
    // 遍历语音频道内所有成员
    voiceChannel.members.forEach(member => {
        // 跳过机器人自己
        if (member.id === this.client.user.id) return;
        
        // 订阅该用户的音频流
        const subscription = connection.receiver.subscribe(member.id, {
            end: {
                behavior: EndBehaviorType.AfterSilence,
                duration: 1000
            }
        });

        subscription.on("data", (chunk) => {
            console.log(encoder.decode(chunk));
            // 此处可将解码后的音频发送至目标机器人
        });

        // 监听订阅错误,方便排查问题
        subscription.on("error", (err) => {
            console.error("音频订阅出错:", err);
        });
    });
}

场景2:捕获机器人自身发送的音频

如果需求是转发机器人自己输出的音频,不能用receiver实现,得在音频发送环节监听数据流:

// 假设使用createAudioPlayer播放音频
const player = createAudioPlayer();
const resource = createAudioResource('./audio.mp3');

// 在resource的数据流上监听输出的音频数据
resource.stream.on('data', (chunk) => {
    console.log("自身输出音频chunk:", chunk);
    // 此处可将音频数据发送至目标机器人
});

player.play(resource);
connection.subscribe(player);

额外注意事项

  • 确保@discordjs/opus已正确安装,版本与DiscordJS v14兼容(建议用最新稳定版)。
  • selfDeaf: false配置正确,这是机器人能接收频道音频的前提。
  • 可添加connection.on('error')监听语音连接错误,排查潜在连接问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:01:47