Texto em fala em JavaScript e Node.js
O JavaScript tem texto em fala embutido: a Web Speech API do navegador. É grátis e não exige configuração, mas as vozes dependem do sistema do visitante, e não dá para salvar o resultado como arquivo. Quando você precisa da mesma voz natural em todo lugar, de vozes de personagens ou de arquivos de áudio, precisa de um motor de voz.
Este guia compara os dois caminhos com honestidade e mostra como chamar o motor gratuito SuperClonica no Node.js e num app web por meio de um servidor HTTP local.
Duas formas de falar a partir do JavaScript
Para um botão rápido de leitura em voz alta, a Web Speech API basta; para a voz de um produto, use um motor.
- Web Speech API: uma linha no navegador, speechSynthesis.speak(new SpeechSynthesisUtterance("Hello!")), com as vozes do sistema operacional ou do navegador.
- As vozes mudam entre Windows, macOS, Android e navegadores, algumas são serviços online, e o áudio não pode ser salvo como arquivo.
- SuperClonica: um servidor local com a mesma voz natural em qualquer aparelho, vozes de personagens e próprias, e arquivos WAV que você pode guardar e cachear.
- Ele fala 31 idiomas; o chinês ainda não é suportado.
Ouça as vozes do motor grátis
Antes de escrever código, abra a página de qualquer voz, escreva uma frase de 30 a 100 caracteres, escolha o idioma e clique no botão para gerar. Em poucos segundos você ouve a voz que o seu app poderia ter, sem conta.
Suba um servidor de voz local
Uma placa de vídeo NVIDIA acelera com a imagem cuda, mas não é obrigatória.
- Suba o servidor em qualquer CPU: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
- A primeira execução baixa o modelo Supertonic 3, cerca de 385 MB, no volume; GET /health avisa quando está pronto.
- POST /synthesize recebe JSON com text, voice, lang, seed e normalize e responde com um WAV mono de 16 bits.
- voice é um nome padrão de M1 a M5 e de F1 a F5, ou o conteúdo já interpretado de um arquivo de voz.
Chame pelo Node.js e pelo navegador
No Node.js 18 ou mais novo, o fetch já vem embutido, então com o fs importado uma requisição cabe em poucas linhas: 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: "Olá do Node!", voice, lang: "pt", seed: 7 }) }); fs.writeFileSync("hello.wav", Buffer.from(await res.arrayBuffer())); Num app web, mantenha o servidor de voz privado e chame-o pelo seu próprio backend; a página recebe o áudio como blob e toca com new Audio(URL.createObjectURL(blob)).play(). O mesmo texto, voz e seed sempre dão o mesmo arquivo, então faça cache do áudio de frases que se repetem.
Hábitos para produção
Não exponha a porta 8000 na internet do jeito que está: defina SUPERCLONICA_API_KEY e envie como token Bearer, coloque o servidor atrás de um proxy reverso com HTTPS ou mantenha-o numa rede privada. Se chegarem muitas requisições ao mesmo tempo, rode mais cópias do modelo com SUPERCLONICA_LANES, e meça no seu hardware: nos nossos testes uma frase curta levou 0,12 s numa RTX 5070 Ti e 0,43 s com quatro threads de CPU.