Discord机器人无法播放本地音频文件求助
问题分析与解决方案
你遇到的问题是Discord机器人能正常加入语音频道,但没有声音输出且终端无报错信息。结合你的代码、配置截图,以下是可能的原因及对应解决方法:
1. 音频文件路径错误
你使用相对路径 join("..", "sounds", 'ratinho.ogg'),但相对路径的基准是当前Node.js进程的工作目录,而非命令文件所在目录,很可能导致机器人找不到音频文件。
修复方法:用 __dirname 构建绝对路径,确保路径精准:
const resource = createAudioResource(join(__dirname, "..", "sounds", 'ratinho.ogg'));
同时确认 sounds 文件夹确实存在于对应层级,且 ratinho.ogg 文件没有拼写错误。
2. 缺失音频处理核心依赖
@discordjs/voice 必须依赖Opus编码库和FFmpeg才能处理音频。从你的 package.json 截图来看,未安装这两个关键依赖,这是无声问题的常见诱因。
修复方法:执行命令安装依赖:
npm install @discordjs/opus ffmpeg-static
@discordjs/opus:提供Discord语音要求的Opus编码支持ffmpeg-static:静态编译的FFmpeg工具,用于解码本地音频文件
3. 音频文件格式不兼容
Discord仅支持Opus编码的OGG文件,如果你的 ratinho.ogg 不是用Opus编码的,机器人无法正常播放。
验证与修复:
- 用FFmpeg检查文件编码:
查看输出中ffmpeg -i ratinho.oggAudio行的编码类型,需显示为opus。 - 若编码不符,重新转换格式:
ffmpeg -i 原音频文件.mp3 -c:a libopus ratinho.ogg
4. 机器人缺少语音发言权限
即使机器人能加入频道,也可能未被授予语音频道发言权限。
检查步骤:
- 进入目标语音频道的权限设置,确认机器人角色/账号开启了「发言」权限
- 或给机器人角色添加服务器级的「在语音频道发言」权限
5. 代码逻辑遗漏与优化
未捕获资源创建错误
createAudioResource 可能因文件不存在、格式错误抛出异常,但你的代码未捕获,导致无声却无报错。
优化代码:
try { const audioFileName = audio.value === "Ratinho" ? "ratinho.ogg" : "gira_aspas.ogg"; const resource = createAudioResource(join(__dirname, "..", "sounds", audioFileName)); player.play(resource); } catch (error) { console.error(`音频加载失败:${error.message}`); await interaction.reply(`播放失败:无法加载指定音频`); return; }
音频选择逻辑失效
你的命令提供了两种音频选项,但代码硬编码了ratinho.ogg,导致选择「Gira aspas」时仍播放同一文件,需动态匹配文件名。
连接稳定后再播放
建议在语音连接就绪后再播放音频,避免因连接未稳定导致的无声:
voiceConnection.on('stateChange', (oldState, newState) => { if (newState.status === 'ready') { player.play(resource); } });
内容的提问来源于stack exchange,提问作者Arthur de Araujo Neves
相关产品推荐
相关产品推荐

