如何解决Discord TTS机器人朗读时连带播报语言代码的问题
问题根因
你的代码存在两处逻辑错误,直接导致语言代码被混入朗读内容:
- 变量声明顺序混乱:在未声明
text变量前就做了非空判断,会触发JS语法层面的引用错误,导致校验逻辑完全失效 - 文本截取逻辑错误:你将
args[0]单独作为语言代码提取后,拼接朗读文本时用了全量args数组做join操作,第一个位置的语言代码自然会被拼入待朗读文本
修复后完整代码
const { getAudioUrl } = require('google-tts-api') // 提取数组第一个元素作为语言代码 const language = args[0] // 截取数组从索引1开始的所有元素(即排除第一个语言参数),拼接为朗读文本 const text = args.slice(1).join(" ") if(!language) return message.reply("请指定语言代码") if(!text) return message.reply("请输入需要朗读的文本内容") if(text.length > 200) return message.reply('输入的文本长度不能超过200字符') const voiceChannel = message.member.voice.channel if(!voiceChannel) return message.reply("请先加入语音频道") const audioURL = await getAudioUrl(text, { lang: language, slow: false, host: 'https://translate.google.com', timeout: '150000' }) try { voiceChannel.join().then(connection => { const dispatcher = connection.play(audioURL) dispatcher.on('finish', () => { voiceChannel.leave() }) }) } catch (err) { console.error('TTS播放异常:', err) message.reply('语音播放出错,请稍后重试') }
核心改动点
- 调整变量声明顺序:先完成
text变量的定义,再执行非空校验,避免语法报错和逻辑异常 - 修正文本拼接规则:使用
args.slice(1)跳过数组首位的语言参数,仅拼接后续正文内容,从根源避免语言代码被朗读 - 补全try块对应的catch错误捕获逻辑,避免运行时异常直接导致进程崩溃
内容的提问来源于stack exchange,提问作者Taf not a coder
相关产品推荐
相关产品推荐

