升级Discord.py至2.1.0后Lavalink播放器无声音问题求助
问题排查与修复方案
核心问题根源
discord.py 2.x 完全重构了语音系统,和1.5.0版本的语音连接逻辑不兼容。你当前代码里用的await vc.guild.change_voice_state(channel=vc)是旧版写法,无法让Lavalink正确绑定新的语音连接通道,导致音频无法输出。
具体修复步骤
1. 适配discord.py 2.x的语音连接逻辑
首先在__init__方法中绑定Lavalink需要的语音事件监听器,替换旧的语音连接方式:
def __init__(self, bot): self.bot = bot # 用bot自身的ID替代硬编码值,避免出错 self.bot.music = lavalink.Client(bot.user.id) self.bot.music.add_node('localhost', 7000, 'youshallnotpass', 'eu', 'music-node') # 绑定discord.py 2.x专属的语音更新处理器 self.bot.add_listener(self.bot.music.voice_update_handler, 'on_socket_response')
修改join命令,改用Lavalink适配后的连接方法:
@commands.command(aliases=["j"]) async def join(self, ctx): print('Joined a Channel') member = ctx.author if not member.voice: await ctx.send("你得先加入一个语音频道!") return vc = member.voice.channel player = self.bot.music.player_manager.create(ctx.guild.id) if not player.is_connected: player.store('channel', ctx.channel.id) # 用Lavalink的原生连接方法适配新版本 await player.connect(vc.id)
2. 修复播放命令的潜在问题
移除不必要的延迟,补充空结果判断,确保逻辑严谨:
@commands.command(aliases=["pl", "p"]) async def play(self, ctx, *, query): # 自动检测并加入频道 if not ctx.author.voice: await ctx.send("你得先加入一个语音频道!") return if not ctx.voice_client: await self.join(ctx) player = self.bot.music.player_manager.get(ctx.guild.id) if not player: player = self.bot.music.player_manager.create(ctx.guild.id) # 定义URL匹配规则(如果之前没定义的话) url_rx = re.compile(r'https?://(?:www\.)?.+') if not url_rx.match(query): query = f"ytsearch:{query}" results = await player.node.get_tracks(query) tracks = results["tracks"] print(results) if results["loadType"] == "PLAYLIST_LOADED": for track in tracks: player.add(requester=ctx.author.id, track=track) await ctx.send(f"已添加播放列表,共{len(tracks)}首歌!") else: if not tracks: await ctx.send("没找到匹配的曲目!") return track = tracks[0] await ctx.send(f"💽 已添加 {track['info']['title']}") player.add(requester=ctx.author.id, track=track) if not player.is_playing: await player.play()
3. 额外排查项
- 确认Lavalink服务器版本与lavalink.py版本兼容(推荐Lavalink用3.x版本,lavalink.py安装最新版)
- 检查机器人是否拥有语音频道的
CONNECT和SPEAK权限 - 确认语音频道内未静音机器人,且机器人音量未设为0
内容的提问来源于stack exchange,提问作者SBECK1
相关产品推荐
相关产品推荐

