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

求助:Discord机器人播放本地音频文件报错,如何解决?

解决Discord机器人播放本地音频的AttributeError问题

我来帮你搞定这个问题!你遇到的AttributeError是因为对discord.py的语音播放API理解有点偏差,咱们一步步拆解解决:

核心错误原因

voice_player.play(source)这个方法本身就会立即开始播放音频,而且它的返回值是None,所以你后面调用player.start()自然会报错——你没法对一个None对象调用方法。

修正后的完整代码

先给你调整好的代码,后面再讲细节:

@client.command()
async def play(ctx, *args):
    if len(args) == 0:
        await ctx.send("Specify something then")
        return
    
    # 检查用户是否在语音频道里
    if not ctx.message.author.voice:
        await ctx.send("你得先加入一个语音频道才行哦!")
        return
    
    # 复用已有的语音连接,避免重复连接报错
    voice_client = ctx.voice_client
    if not voice_client:
        voice_client = await ctx.message.author.voice.channel.connect()
    elif voice_client.is_playing():
        # 可选:如果正在播放,先停止当前音频
        voice_client.stop()
    
    if args[0] == "chulp":
        print("Playing chulp")
        # 注意:如果FFmpeg没加入系统环境变量,需要指定完整路径,比如:
        # source = discord.FFmpegPCMAudio(r"C:\YourBotPath\Core files\Sounds\chulpy.mp3", executable=r"C:\ffmpeg\bin\ffmpeg.exe")
        source = discord.FFmpegPCMAudio(r"Core files\Sounds\chulpy.mp3")
        voice_client.play(source)

关键细节说明

  • 去掉多余的.start():discord.py的VoiceClient.play()方法会直接启动播放,不需要额外调用start方法。
  • 复用语音连接:每次调用命令都重新connect会导致报错,用ctx.voice_client检查是否已有连接,有就直接用。
  • FFmpeg路径问题:如果你的系统没有把FFmpeg添加到环境变量里,一定要在FFmpegPCMAudio里通过executable参数指定FFmpeg的完整路径,否则机器人找不到FFmpeg会报错。
  • 用户状态检查:添加用户是否在语音频道的判断,避免因为用户没在频道里导致的AttributeError。

额外提示

测试前记得确认:

  • 本地音频文件的路径是正确的(用原始字符串r"路径"避免转义问题)
  • FFmpeg已经正确安装,并且机器人有权限访问音频文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:34:38