You need to enable JavaScript to run this app. 如何用Discord.js与NodeJS开发支持TTS语音选择的Discord机器人?
优惠活动
大模型
产品
解决方案
定价
更多

如何用Discord.js与NodeJS开发支持TTS语音选择的Discord机器人?

报错根因定位
  • ReferenceError: window is not defined:你尝试引入的p5.Speech、Spoken类库是纯浏览器端运行的工具,原生依赖浏览器提供的window全局对象、Web Speech API能力,而Discord.js运行在Node.js服务端环境,不存在浏览器专属的全局对象,直接导入必然触发报错。
  • SyntaxError: Unexpected token 'export':这类浏览器端库默认输出ES Module格式的代码,如果你当前的Node.js项目使用CommonJS模块规范,未经过语法转译直接导入ES Module代码,就会触发语法解析错误,本质是模块加载机制不匹配。
网页端JS适配Discord.js运行环境的实现路径
  • 不要直接引入绑定浏览器DOM、浏览器全局API的前端类库到Discord.js项目,这类库的能力完全依托浏览器渲染进程,无法在无窗口的服务端环境正常运行。
  • 如果一定要复用某类浏览器端TTS库的能力,需要做两层适配:一是通过Node.js垫片(shim)手动模拟缺失的window、document等全局对象;二是通过esbuild、webpack这类打包工具,把库内的ES Module语法转译为Node.js可识别的CommonJS语法,再引入项目。
  • 本地自托管的Discord机器人优先选择原生适配Node.js的系统级TTS能力,没必要硬迁浏览器端实现:

本地Windows环境使用Say.js的实操踩坑参考:最初尝试传入Zira、Microsoft Zira作为语音选择参数无法生效,必须传入系统注册的完整语音名称,比如Microsoft Zira Desktop、Microsoft David Desktop,才能正常切换语音角色。示例代码:

// 调用Zira语音生成内容,最后一个参数为语速配置
say.speak("Hello! My name is Zira!", 'Microsoft Zira Desktop', 1)
// 调用David语音生成内容
say.speak("Hello! My name is David!", 'Microsoft David Desktop', 1)
兼容Discord.js开发的免费TTS可选方案
  • 本地系统级TTS:基于Say.js实现,完全免费无调用额度限制,适合机器人部署在个人本地设备的场景,支持直接切换系统已安装的所有语音角色,无额外网络请求开销;缺点是云服务器部署时需要手动安装对应系统的语音包。
  • Edge免费TTS方案:全程无费用、无强制调用额度限制,支持几十种语言和多类可选语音角色,音频质量高,不需要本地安装语音包,适合部署在云服务器的Discord机器人使用。
  • Windows PowerShell原生TTS:本地自托管场景下甚至不需要安装第三方npm依赖,直接调用PowerShell内置的系统语音能力生成TTS音频,零额外依赖,支持切换所有系统已安装的语音角色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 14:36:03