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
解决办法
- 启用音频接收功能
JDA默认可能会因为未配置音频接收而停止监听说话状态变化,需要在连接语音频道时设置有效的AudioReceiveHandler:
// 连接语音频道时配置接收处理 guild.getAudioManager().setReceiveHandler(new AudioReceiveHandler() { @Override public boolean canReceiveCombined() { return true; // 允许接收合并音频流 } @Override public void handleCombinedAudio(CombinedAudio combinedAudio) { // 无需处理音频数据,但必须实现此方法以维持接收状态 } }); guild.getAudioManager().openAudioChannel(voiceChannel);
- 移除冗余的方法重写
你同时重写了两个onUserSpeaking方法,保留带三个参数的版本即可,避免潜在的方法调用冲突:
// 移除这个空实现的方法 // @Override // public void onUserSpeaking(User user, boolean speaking) { }
升级JDA版本
部分旧版本JDA存在语音状态同步的bug,建议升级到最新稳定版(如5.x系列),修复已知的语音监听问题。测试语音节点状态
偶尔Discord语音节点会出现状态同步延迟,可尝试重启机器人或切换服务器语音区域后重新测试。
内容的提问来源于stack exchange,提问作者Loso
相关产品推荐
相关产品推荐

