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

discord.py音乐机器人已连语音仍报Not connected to voice错误求助

问题原因及修复方案
  • 核心触发原因:你的代码中存在大量同步阻塞调用,discord.py 为异步框架,同步阻塞逻辑会卡住整个事件循环,导致语音连接的心跳包无法按时发送到Discord服务端,服务端会主动断开机器人的语音连接,等执行到voice.play时连接已经失效,因此抛出未连接异常。
    你日志中显示单是音频下载就耗时1分05秒,全程事件循环处于阻塞状态,足以触发服务端断连,再加上你额外加了time.sleep(5)同步休眠,进一步放大了该问题。
  • 其他代码隐患:
    • await voiceChannel.connect()本身就会直接返回语音客户端对象,不需要再调用discord.utils.get二次获取,二次获取反而可能出现取值异常
    • 歌曲存在性判断逻辑完全错误:song_there是代码刚运行时检测的本地旧文件状态,和本次下载是否成功没有任何关联,现有逻辑是只要初始没有旧文件,不管下载是否成功都会发送“歌曲未找到”提示
    • 遍历目录重命名音频文件的逻辑存在冲突:如果目录中存在多个符合后缀的文件,会被反复覆盖为song.mp3,最终播放的是最后一个被重命名的文件
    • 裸except:会吃掉所有错误,下载过程中出现异常你无法感知,只会静默返回
    • 你使用的youtube-dl已经停止维护多年,对现有音视频平台适配性很差,建议替换为仍在活跃维护的yt-dlp

关键修改步骤

  1. 替换所有同步阻塞调用为异步实现:
    • 将time.sleep(5)替换为await asyncio.sleep(5),使用前需要先导入asyncio库
    • 将os.system、os.popen替换为asyncio.create_subprocess_exec等异步进程调用方式,避免下载过程阻塞事件循环
  2. 修正语音客户端获取逻辑:
    将原有代码
    await voiceChannel.connect()
    print("Connected to voice")
    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
    
    修改为
    voice = await voiceChannel.connect()
    print("Connected to voice")
    
  3. 修正歌曲存在性判断逻辑:下载完成后再检测本地是否生成了有效音频文件,再判断是否需要发送歌曲未找到提示
  4. 给异常捕获添加具体的异常类型,避免无差别吃掉所有错误
  5. 调用voice.play前先通过voice.is_connected()检测连接状态,如果已经断开可以先尝试重连再播放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:03