GUÍA

Texto a voz en JavaScript y Node.js

JavaScript trae texto a voz integrado: la Web Speech API del navegador. Es gratis y no requiere configuración, pero las voces dependen del sistema del visitante y no puedes guardar el resultado como archivo. Cuando necesitas la misma voz natural en todas partes, voces de personajes o archivos de audio, necesitas un motor de voz.

Esta guía compara ambos caminos con honestidad y muestra cómo llamar al motor gratuito SuperClonica desde Node.js y desde una app web a través de un servidor HTTP local.

Dos formas de hablar desde JavaScript

Para un botón rápido de lectura en voz alta basta la Web Speech API; para la voz de un producto, usa un motor.

  • Web Speech API: una línea en el navegador, speechSynthesis.speak(new SpeechSynthesisUtterance("Hello!")), con las voces del sistema operativo o del navegador.
  • Sus voces cambian entre Windows, macOS, Android y navegadores, algunas son servicios en línea y el audio no se puede guardar como archivo.
  • SuperClonica: un servidor local con la misma voz natural en cualquier dispositivo, voces de personajes y propias, y archivos WAV que puedes guardar y cachear.
  • Habla 31 idiomas; el chino aún no está disponible.

Escucha las voces del motor gratis

Antes de escribir código, abre la página de cualquier voz, escribe una frase de 30 a 100 caracteres, elige el idioma y pulsa el botón para generarla. En unos segundos oyes la voz que podría tener tu app, sin cuenta.

Arranca un servidor de voz local

Una tarjeta gráfica NVIDIA lo acelera con la imagen cuda, pero no es obligatoria.

  • Arranca el servidor en cualquier CPU: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
  • El primer arranque descarga el modelo Supertonic 3, unos 385 MB, en el volumen; GET /health indica cuándo está listo.
  • POST /synthesize recibe JSON con text, voice, lang, seed y normalize, y responde con un WAV mono de 16 bits.
  • voice es un nombre de serie de M1 a M5 y de F1 a F5, o el contenido ya parseado de un archivo de voz.

Llámalo desde Node.js y el navegador

En Node.js 18 o posterior, fetch viene integrado, así que con fs importado una petición ocupa unas líneas: 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: "¡Hola desde Node!", voice, lang: "es", seed: 7 }) }); fs.writeFileSync("hello.wav", Buffer.from(await res.arrayBuffer())); En una app web, mantén privado el servidor de voz y llámalo desde tu propio backend; la página recibe el audio como blob y lo reproduce con new Audio(URL.createObjectURL(blob)).play(). El mismo texto, voz y seed dan siempre el mismo archivo, así que cachea el audio de las frases que se repiten.

Hábitos para producción

No expongas el puerto 8000 a internet tal cual: define SUPERCLONICA_API_KEY y envíala como token Bearer, pon el servidor detrás de un proxy inverso con HTTPS o mantenlo en una red privada. Si llegan muchas peticiones a la vez, ejecuta más copias del modelo con SUPERCLONICA_LANES, y mide en tu hardware: en nuestras pruebas una frase corta tardó 0,12 s en una RTX 5070 Ti y 0,43 s con cuatro hilos de CPU.