在 JavaScript 和 Node.js 中实现文字转语音
JavaScript 自带文字转语音:浏览器中的 Web Speech API。它免费、无需配置,但声音取决于访问者的系统,而且无法把结果保存为文件。如果你需要在所有设备上使用同一个自然的声音、角色声音或音频文件,就需要一个语音引擎。请注意:Supertonic 3 暂不支持中文,可朗读英语、日语、韩语等 31 种语言。
本指南诚实比较两种方式,并介绍如何通过本地 HTTP 服务器,从 Node.js 和网页应用调用免费的 SuperClonica 引擎。
从 JavaScript 发声的两种方式
简单的“朗读”按钮用 Web Speech API 就够了;产品的声音请用引擎。
- Web Speech API:在浏览器中一行代码,speechSynthesis.speak(new SpeechSynthesisUtterance("Hello!")),使用操作系统或浏览器的声音。
- 它的声音在 Windows、macOS、Android 和不同浏览器之间各不相同,有些是在线服务,而且音频无法保存为文件。
- SuperClonica:本地服务器,在任何设备上都是同一个自然的声音,支持角色声音和自定义声音,返回可以存储和缓存的 WAV 文件。
- 它支持 31 种语言,暂不支持中文。
免费试听引擎的声音
写代码之前,先打开任意声音页面,输入 30 到 100 个字符的句子,选择语言并点击生成按钮。几秒后就能听到你的应用可以拥有的声音,无需注册。
启动本地语音服务器
有 NVIDIA 显卡时用 cuda 镜像会更快,但不是必需的。
- 在任何 CPU 上启动服务器:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。
- 首次启动会把约 385 MB 的 Supertonic 3 模型下载到卷中;GET /health 可以告诉你何时就绪。
- POST /synthesize 接收包含 text、voice、lang、seed 和 normalize 的 JSON,返回 16 位单声道 WAV。
- voice 可以是 M1–M5、F1–F5 等标准名称,也可以是解析后的声音文件内容。
从 Node.js 和浏览器调用
在 Node.js 18 或更新版本中 fetch 已内置,导入 fs 后几行代码就能发出请求:const voice = JSON.parse(fs.readFileSync("voice.json", "utf8")); const res = await fetch("http://localhost:8000/synthesize", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: "Hello from Node!", voice, lang: "en", seed: 7 }) }); fs.writeFileSync("hello.wav", Buffer.from(await res.arrayBuffer())); 在网页应用中,请让语音服务器保持私有,从你自己的后端调用;页面以 blob 形式收到音频,用 new Audio(URL.createObjectURL(blob)).play() 播放。同样的文字、声音和 seed 总是得到同样的文件,所以请缓存重复短语的音频。
上线前的好习惯
不要把 8000 端口原样暴露到互联网:设置 SUPERCLONICA_API_KEY 并以 Bearer 令牌发送,把服务器放在带 HTTPS 的反向代理之后,或放在私有网络中。如果同时到达的请求很多,用 SUPERCLONICA_LANES 运行更多模型副本,并在你的硬件上实测:在我们的测试中,短句在 RTX 5070 Ti 上耗时 0.12 秒,在四个 CPU 线程上耗时 0.43 秒。