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

Discord.py中Bot可加入语音频道但无声音输出问题求助

问题描述

为Discord服务器开发音乐机器人,因youtube-dl被屏蔽选择Wavelink实现。执行!play命令后,机器人能识别请求并加入语音频道,但无声音输出,也未显示绿色状态圈;改用FFmpeg编写测试代码,机器人仅加入频道后退出,仍无声音。控制台无报错信息。

问题代码
import discord
import wavelink
from discord.ext import commands


class Bot(commands.Bot):

    def __init__(self) -> None:
        intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True)
        intents.message_content = True

        super().__init__(intents=intents, command_prefix='!')

    async def on_ready(self) -> None:
        print(f'Logged in {self.user} | {self.user.id}')

    async def setup_hook(self) -> None:
        # Wavelink 2.0 has made connecting Nodes easier... Simply create each Node
        # and pass it to NodePool.connect with the client/bot.
        node: wavelink.Node = wavelink.Node(uri='https://lava1.horizxon.tech:443', password='horizxon.tech', secure=True)
        await wavelink.NodePool.connect(client=self, nodes=[node])


bot = Bot()
levels = {}

@bot.command()
async def play(ctx: commands.Context, *, search: str) -> None:
    """Простая команда воспроизведения."""

    if not ctx.voice_client:
        vc: wavelink.Player = await ctx.author.voice.channel.connect(cls=wavelink.Player)
    else:
        vc: wavelink.Player = ctx.voice_client

    tracks = await wavelink.YouTubeTrack.search(search)
    if not tracks:
        await ctx.send(f'Сори броу, я не нашёл этого трека: `{search}`')
        return

    track = tracks[0]
    await vc.play(track)
    await ctx.send(f"Сейчас играет: ***{track}***")

@bot.command()
async def stop(ctx: commands.Context) -> None:
    """Simple disconnect command.

    This command assumes there is a currently connected Player.
    """
    vc: wavelink.Player = ctx.voice_client
    await vc.disconnect()
    await ctx.send(f"стоп")
解决方案

1. 验证Lavalink节点连接状态

控制台无报错不代表Lavalink节点已成功连接,添加节点监听事件确认连接状态:

# 在Bot类中添加以下方法
async def on_wavelink_node_ready(self, node: wavelink.Node) -> None:
    print(f"Lavalink节点 {node.id} 已成功连接")

运行机器人后,如果控制台未打印该信息,说明节点连接失败,需检查节点地址、密码是否正确,或者更换可用的Lavalink节点。

2. 修正语音连接参数

机器人加入语音频道时需开启自身 deaf 状态,否则可能无法正常播放音频,修改play命令中的连接逻辑:

if not ctx.voice_client:
    # 添加self_deaf=True参数
    vc: wavelink.Player = await ctx.author.voice.channel.connect(cls=wavelink.Player, self_deaf=True)
else:
    vc: wavelink.Player = ctx.voice_client

3. 检查机器人权限

确保机器人在目标服务器的角色拥有以下权限:

  • 连接语音频道
  • 在语音频道发言
  • 读取消息内容(已通过intents设置,但需确认服务器权限未限制)

4. 处理Player播放状态异常

添加Player的错误监听事件,捕获播放时的潜在错误:

# 在Bot类中添加以下方法
async def on_wavelink_track_exception(self, payload: wavelink.TrackExceptionPayload) -> None:
    print(f"播放出错: {payload.exception}")
    await payload.player.channel.send(f"播放失败: {payload.exception}")

5. FFmpeg测试问题排查

若使用FFmpeg,需确保:

  • 系统已安装FFmpeg,并将其路径加入环境变量
  • 在代码中指定FFmpeg可执行文件路径(若环境变量未配置):
    # 示例FFmpeg播放代码
    source = discord.FFmpegPCMAudio(executable="/path/to/ffmpeg", source="audio_file.mp3")
    vc.play(source)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:40