GUIDE

Synthèse vocale en Ruby pour scripts et applications Rails

Ruby n’a pas de synthèse vocale à lui. Les scripts appellent souvent say sur Mac ou espeak sous Linux, qui sonnent robotiques, et les applications Rails envoient d’ordinaire chaque texte à une API cloud facturée au caractère.

Le moteur gratuit SuperClonica tourne comme un serveur HTTP à côté de votre application, avec des voix naturelles dans 31 langues, et la bibliothèque standard de Ruby suffit pour l’appeler. Ce guide montre un script simple, une mise en place Rails avec Active Job et Active Storage, et les bonnes habitudes pour la production.

Comment Ruby peut parler

Générez l’audio une fois par version du texte et servez le fichier ; ne synthétisez pas à chaque requête.

  • Voix du système : say ou espeak via system() ; rien à configurer, mais robotiques et différentes sur chaque machine.
  • API cloud : des voix naturelles, mais une clé, une facture au caractère et votre texte sur les serveurs d’un autre.
  • SuperClonica : un serveur local avec des voix naturelles, de personnages et personnalisées ; Ruby envoie du JSON et reçoit un WAV.
  • Il parle 31 langues ; le chinois n’est pas encore pris en charge.

Écouter les voix gratuitement

Avant d’écrire du code, ouvrez la page de n’importe quelle voix, saisissez une phrase de 30 à 100 caractères, choisissez la langue et cliquez sur le bouton de synthèse. En quelques secondes, vous entendez la voix que pourrait avoir votre application, sans compte.

Lancer le serveur de synthèse

Une carte graphique NVIDIA avec l’image cuda accélère, mais un processeur ordinaire suffit.

  • Lancez le serveur sur la même machine ou une machine privée : docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
  • Le premier démarrage télécharge le modèle Supertonic 3, environ 385 Mo ; GET /health indique quand il est prêt.
  • POST /synthesize reçoit du JSON avec text, voice, lang, seed et normalize, et répond par un WAV mono 16 bits.
  • Par défaut, une requête accepte jusqu’à 5 000 caractères (SUPERCLONICA_MAX_TEXT) ; découpez les longs textes par paragraphe.

L’appeler depuis Ruby

Aucune gem n’est nécessaire : require "net/http"; require "json"; uri = URI("http://localhost:8000/synthesize"); res = Net::HTTP.post(uri, { text: "Bonjour depuis Ruby !", voice: "F1", lang: "fr" }.to_json, "Content-Type" => "application/json"); File.binwrite("hello.wav", res.body) if res.is_a?(Net::HTTPSuccess). Pour une voix du catalogue, envoyez le fichier décodé au lieu d’un nom de base : voice: JSON.parse(File.read("voice.json")). Faraday ou HTTParty fonctionnent de la même façon si votre application les utilise déjà.

Rails : tâches de fond et Active Storage

Dans Rails, vocalisez le texte dans un Active Job, jamais pendant la requête web, et joignez le résultat à l’enregistrement : post.audio.attach(io: StringIO.new(res.body), filename: "post-#{post.id}.wav", content_type: "audio/wav"). Ne régénérez que lorsque le texte change. N’exposez pas le port 8000 à internet : définissez SUPERCLONICA_API_KEY sur le serveur et envoyez-la dans un en-tête Authorization: Bearer, ou gardez le serveur sur un réseau privé. Signalez aux auditeurs que l’audio est généré.