如何用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
相关产品推荐
相关产品推荐

