GUIA

Texto em fala em C# e .NET offline

O jeito clássico de falar a partir do C# é o System.Speech: poucas linhas, as vozes do Windows, sem internet. Ainda funciona, mas só no Windows, as vozes soam datadas e mudam de uma máquina para outra. Serviços na nuvem soam melhor, mas mandam cada texto para fora e cobram por caractere.

Este guia mostra um terceiro caminho: o motor gratuito SuperClonica como servidor HTTP local que qualquer app .NET pode chamar no Windows, Linux ou macOS, com vozes naturais e arquivos WAV que ficam com você.

Três jeitos de falar a partir do .NET

Para um protótipo rápido no Windows, o System.Speech basta; para a voz de um produto que soe igual em todo lugar, use um motor.

  • System.Speech: embutido no Windows, offline, vozes robóticas, só Windows.
  • APIs de voz na nuvem: vozes naturais, mas conta, chave, cobrança por caractere e o seu texto nos servidores deles.
  • SuperClonica: um servidor local com vozes naturais, de personagens e próprias, offline, em qualquer sistema que rode Docker.
  • 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 C#

Com System.Net.Http, System.Text e System.Text.Json.Nodes, uma requisição cabe em poucas linhas no .NET 6 ou mais novo: using var http = new HttpClient(); var voice = JsonNode.Parse(File.ReadAllText("voice.json")); var body = new JsonObject { ["text"] = "Olá do C#!", ["voice"] = voice, ["lang"] = "pt", ["seed"] = 7 }; var res = await http.PostAsync("http://localhost:8000/synthesize", new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json")); File.WriteAllBytes("hello.wav", await res.Content.ReadAsByteArrayAsync()); Para uma voz padrão, use ["voice"] = "F1" em vez de carregar um 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 e toque com a biblioteca de áudio que o seu app já usa.

Hábitos para produção

Mantenha um único HttpClient durante toda a vida do app. 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.