GUIA

Texto em fala em Rust offline

O Rust tem crates que envolvem os motores de voz do sistema operacional, bons para acessibilidade, mas com vozes robóticas e diferentes em cada plataforma, e SDKs na nuvem que cobram por caractere. Para um jogo, um bot ou uma ferramenta de linha de comando que precisa de uma voz natural em todo lugar, nenhum dos dois é ideal.

Este guia mostra como chamar o motor gratuito SuperClonica a partir do Rust por meio de um servidor HTTP local: vozes naturais, arquivos WAV que ficam com você e poucas linhas com reqwest.

Jeitos de falar a partir do Rust

Para saída no estilo leitor de tela, as vozes do sistema servem; para a voz de um produto ou jogo, use um motor.

  • Crates que envolvem as vozes do sistema: offline e leves, mas robóticas e diferentes no Windows, macOS e Linux.
  • 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 Rust

Com o crate reqwest e a feature blocking, dentro de uma função que retorna um Result, uma requisição cabe em poucas linhas: let voice = std::fs::read_to_string("voice.json")?; let body = format!(r#"{{"text": "Olá do Rust!", "lang": "pt", "seed": 7, "voice": {voice}}}"#); let wav = reqwest::blocking::Client::new().post("http://localhost:8000/synthesize").header("Content-Type", "application/json").body(body).send()?.bytes()?; std::fs::write("hello.wav", wav)?; Em código assíncrono, use o cliente assíncrono do reqwest do mesmo jeito. Para uma voz padrão, envie "voice": "F1" em vez 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; o serde_json deixa requisições maiores organizadas.

Hábitos para produção

Reaproveite um único cliente reqwest e defina um timeout. 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.