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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:30:41