Discord Bot使用discord-tts的TTS命令无法运行,遗漏了什么内容?
问题排查与修正方案
现有代码核心问题
- 变量未定义:代码中使用的
bot没有声明,你导出的类继承自Command,传入的客户端实例是client,应该通过this.client调用客户端相关方法 - 定义的
tts函数从未执行:你在run方法内声明了tts函数,但没有触发调用的逻辑,自然不会有任何执行效果 - 缺少必要的前置校验:没有判断触发命令的用户是否已经加入语音频道,直接获取
channelID会直接抛出空值错误 - 参数类型错误:
discordTTS.getVoiceStream需要传入字符串类型的文本内容,你传入的args是命令参数数组,需要拼接为字符串 - 版本兼容问题:如果你使用discord.js v13及以上版本,
createBroadcast方法已经被废弃,同时需要额外开启语音相关的网关意图,单独安装@discordjs/voice依赖才能正常使用语音功能
修正后的可运行代码(适配discord.js v12版本,更高版本可自行调整语音API)
const discordTTS = require("discord-tts"); const Command = require('../Command.js'); module.exports = class SpeakCommand extends Command { constructor(client) { super(client, { name: 'speak', usage: 'speak <message>', description: 'Speaks TTS message.', type: client.types.FUN }); } async run(message, args) { // 前置校验:用户是否在语音频道 if (!message.member.voice.channel) return message.reply("你需要先加入一个语音频道才能使用该命令"); // 前置校验:是否有输入文本 if (!args.length) return message.reply("请输入要朗读的文本内容"); const voiceChannel = message.member.voice.channel; const text = args.join(' '); const broadcast = this.client.voice.createBroadcast(); voiceChannel.join().then(connection => { broadcast.play(discordTTS.getVoiceStream(text)); const dispatcher = connection.play(broadcast); // 可选:播放结束自动退出频道 dispatcher.on('finish', () => { voiceChannel.leave(); }); }).catch(err => { console.error("加入语音频道失败:", err); message.reply("无法加入你所在的语音频道,请检查我的权限"); }); } }
额外需要确认的配置
- 你需要在Discord开发者后台给Bot开启
CONNECT、SPEAK两个语音权限 - 如果使用discord.js v13及以上版本,初始化客户端时需要开启
GUILD_VOICE_STATES意图,同时替换语音逻辑为@discordjs/voice的相关API
内容的提问来源于stack exchange,提问作者Serried
相关产品推荐
相关产品推荐

