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

JDA中ConnectionListener的onUserSpeaking仅触发一次问题求助

问题:JDA ConnectionListener的onUserSpeaking仅触发一次说话开始事件

我尝试通过ConnectionListener检测语音频道内用户的说话状态,根据JDA文档,onUserSpeaking方法应该在用户**开始说话(speaking=true)和停止说话(speaking=false)**时各触发一次,但实际测试中,该方法仅在用户首次说话时触发一次speaking=true,之后停止说话不会触发speaking=false。只有将机器人移动到其他频道后,用户再次说话才会重新触发该方法。

代码实现

package functionality;

import net.dv8tion.jda.api.audio.hooks.ConnectionListener;
import net.dv8tion.jda.api.audio.hooks.ConnectionStatus;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

public class SpeechRecognition extends ListenerAdapter implements ConnectionListener {

    @Override
    public void onPing(long ping) {
        System.out.println("PING: " + ping);
    }

    @Override
    public void onStatusChange(ConnectionStatus status) {
        System.out.println("STATUS: " + status);
    }

    @Override
    public void onUserSpeaking(User user, boolean speaking) {

    }

    @Override
    public void onUserSpeaking(User user, boolean speaking, boolean soundshare) {
        System.out.println("SPEAKING: " + speaking + " | " + user.getName() + " | " + soundshare);
    }
}

控制台输出

The bot is now connected to the voice channel.
STATUS: CONNECTING_AWAITING_WEBSOCKET_CONNECT
STATUS: CONNECTING_AWAITING_AUTHENTICATION
STATUS: CONNECTING_ATTEMPTING_UDP_DISCOVERY
STATUS: CONNECTING_AWAITING_READY
PING: 203
STATUS: CONNECTED
SPEAKING: true | Losokos | false   //When i started speaking
PING: 103
PING: 138
PING: 132
PING: 108
PING: 121

解决办法

  1. 启用音频接收功能
    JDA默认可能会因为未配置音频接收而停止监听说话状态变化,需要在连接语音频道时设置有效的AudioReceiveHandler:
// 连接语音频道时配置接收处理
guild.getAudioManager().setReceiveHandler(new AudioReceiveHandler() {
    @Override
    public boolean canReceiveCombined() {
        return true; // 允许接收合并音频流
    }

    @Override
    public void handleCombinedAudio(CombinedAudio combinedAudio) {
        // 无需处理音频数据,但必须实现此方法以维持接收状态
    }
});
guild.getAudioManager().openAudioChannel(voiceChannel);
  1. 移除冗余的方法重写
    你同时重写了两个onUserSpeaking方法,保留带三个参数的版本即可,避免潜在的方法调用冲突:
// 移除这个空实现的方法
// @Override
// public void onUserSpeaking(User user, boolean speaking) { }
  1. 升级JDA版本
    部分旧版本JDA存在语音状态同步的bug,建议升级到最新稳定版(如5.x系列),修复已知的语音监听问题。

  2. 测试语音节点状态
    偶尔Discord语音节点会出现状态同步延迟,可尝试重启机器人或切换服务器语音区域后重新测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:15:29