GUIA

Texto em fala em Ruby para scripts e apps Rails

O Ruby não tem síntese de voz própria. Scripts costumam chamar o say no Mac ou o espeak no Linux, que soam robóticos, e apps Rails costumam mandar cada texto para uma API na nuvem que cobra por caractere.

O motor gratuito SuperClonica roda como um servidor HTTP ao lado do seu app, com vozes naturais em 31 idiomas, e a biblioteca padrão do Ruby basta para chamá-lo. Este guia mostra um script simples, uma configuração Rails com Active Job e Active Storage, e os hábitos que mantêm tudo seguro em produção.

Como o Ruby pode falar

Gere o áudio uma vez por versão do texto e sirva o arquivo; não sintetize a cada requisição.

  • Vozes do sistema: say ou espeak via system(); sem configuração, mas robóticas e diferentes em cada máquina.
  • APIs na nuvem: vozes naturais, mas uma chave, uma conta por caractere e o seu texto em servidores alheios.
  • SuperClonica: um servidor local com vozes naturais, de personagens e próprias; o Ruby envia JSON e recebe um WAV.
  • 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 pode ter, sem conta.

Inicie o servidor de voz

Uma placa de vídeo NVIDIA com a imagem cuda acelera, mas um processador comum basta.

  • Inicie o servidor na mesma máquina ou numa privada: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
  • A primeira inicialização baixa o modelo Supertonic 3, cerca de 385 MB; 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.
  • Por padrão uma requisição aceita até 5.000 caracteres (SUPERCLONICA_MAX_TEXT); divida textos longos por parágrafo.

Chame pelo Ruby

Nenhuma gem é necessária: require "net/http"; require "json"; uri = URI("http://localhost:8000/synthesize"); res = Net::HTTP.post(uri, { text: "Olá do Ruby!", voice: "F1", lang: "pt" }.to_json, "Content-Type" => "application/json"); File.binwrite("hello.wav", res.body) if res.is_a?(Net::HTTPSuccess). Para uma voz do catálogo, envie o arquivo decodificado em vez de um nome padrão: voice: JSON.parse(File.read("voice.json")). Faraday ou HTTParty funcionam do mesmo jeito se o app já os usa.

Rails: jobs em segundo plano e Active Storage

No Rails, gere a voz num Active Job, nunca dentro da requisição web, e anexe o resultado ao registro: post.audio.attach(io: StringIO.new(res.body), filename: "post-#{post.id}.wav", content_type: "audio/wav"). Gere de novo só quando o texto mudar. Não exponha a porta 8000 à internet: defina SUPERCLONICA_API_KEY no servidor e envie-a num cabeçalho Authorization: Bearer, ou mantenha o servidor numa rede privada. Avise os ouvintes de que o áudio é gerado.