GUIA

Texto em fala em Java offline

O Java nunca ganhou síntese de voz na biblioteca padrão, então os projetos recorrem a motores antigos como FreeTTS ou MaryTTS, que soam robóticos perto das vozes neurais, ou a um SDK na nuvem que cobra por caractere e vê cada texto.

Este guia mostra uma alternativa moderna: o motor gratuito SuperClonica como servidor HTTP local, chamado com o HttpClient embutido no Java 11 ou mais novo. Você tem vozes naturais, arquivos WAV que ficam com você e nenhuma cobrança por requisição, em qualquer plataforma.

Jeitos de falar a partir do Java

O motor não roda dentro da JVM: o seu código Java fala com ele por HTTP, como com qualquer outro serviço.

  • FreeTTS e MaryTTS: Java puro e offline, mas robóticos perto das vozes neurais.
  • SDKs na nuvem: vozes naturais, mas conta, chave, cobrança por caractere e o seu texto nos servidores deles.
  • SuperClonica: um servidor HTTP local com vozes naturais, de personagens e próprias, offline, onde o Docker rodar.
  • Ele fala 31 idiomas; o chinês ainda não é suportado.

Ouça as vozes 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 o servidor de voz

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 JSON de um arquivo de voz.

Chame pelo Java

Com java.net.http, java.net.URI e java.nio.file, uma requisição cabe em poucas linhas no Java 11 ou mais novo: var voice = Files.readString(Path.of("voice.json")); var json = "{\"text\": \"Olá do Java!\", \"lang\": \"pt\", \"seed\": 7, \"voice\": " + voice + "}"; var request = HttpRequest.newBuilder(URI.create("http://localhost:8000/synthesize")).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(json)).build(); HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofFile(Path.of("hello.wav"))); A resposta é gravada direto num arquivo WAV. Para uma voz padrão, envie "voice": "F1" em vez do conteúdo do arquivo. O mesmo texto, voz e seed sempre dão o mesmo áudio, então faça cache dos arquivos de frases que se repetem; em projetos maiores, uma biblioteca JSON como o Jackson deixa a requisição organizada.

Hábitos para produção

Reaproveite um único HttpClient e defina um timeout nas requisições. Não exponha a porta 8000 na internet do jeito que está: defina SUPERCLONICA_API_KEY e envie como token Bearer, ou mantenha o servidor 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.