ANLEITUNG

Ruby Text-to-Speech für Skripte und Rails-Apps

Ruby hat keine eigene Sprachsynthese. Skripte rufen oft say auf dem Mac oder espeak unter Linux auf, die roboterhaft klingen, und Rails-Apps schicken meist jeden Text an eine Cloud-API, die pro Zeichen abrechnet.

Die kostenlose SuperClonica-Engine läuft als HTTP-Server neben Ihrer App, mit natürlichen Stimmen in 31 Sprachen, und Rubys Standardbibliothek genügt, um sie aufzurufen. Dieser Leitfaden zeigt ein einfaches Skript, ein Rails-Setup mit Active Job und Active Storage und die Gewohnheiten, die es in Produktion sicher machen.

Wie Ruby sprechen kann

Erzeugen Sie Audio einmal pro Textversion und liefern Sie die Datei aus; synthetisieren Sie nicht bei jeder Anfrage.

  • Systemstimmen: say oder espeak per system(); keine Einrichtung, aber roboterhaft und auf jedem Rechner anders.
  • Cloud-APIs: natürliche Stimmen, aber ein Schlüssel, eine Rechnung pro Zeichen und Ihr Text auf fremden Servern.
  • SuperClonica: ein lokaler Server mit natürlichen, Figuren- und eigenen Stimmen; Ruby schickt JSON und bekommt ein WAV zurück.
  • Es spricht 31 Sprachen; Chinesisch wird noch nicht unterstützt.

Die Stimmen gratis anhören

Bevor Sie Code schreiben, öffnen Sie die Seite einer beliebigen Stimme, geben einen Satz mit 30 bis 100 Zeichen ein, wählen die Sprache und klicken auf die Schaltfläche zum Vertonen. In wenigen Sekunden hören Sie die Stimme, die Ihre App haben könnte, ohne Konto.

Den Sprachserver starten

Eine NVIDIA-Grafikkarte mit dem cuda-Image beschleunigt, ein normaler Prozessor genügt aber.

  • Starten Sie den Server auf demselben oder einem privaten Rechner: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
  • Der erste Start lädt das Modell Supertonic 3, etwa 385 MB; GET /health meldet, wann er bereit ist.
  • POST /synthesize nimmt JSON mit text, voice, lang, seed und normalize und antwortet mit einem 16-Bit-Mono-WAV.
  • Standardmäßig nimmt eine Anfrage bis zu 5.000 Zeichen (SUPERCLONICA_MAX_TEXT); teilen Sie lange Texte nach Absätzen.

Aufruf aus Ruby

Kein Gem nötig: require "net/http"; require "json"; uri = URI("http://localhost:8000/synthesize"); res = Net::HTTP.post(uri, { text: "Hallo aus Ruby!", voice: "F1", lang: "de" }.to_json, "Content-Type" => "application/json"); File.binwrite("hello.wav", res.body) if res.is_a?(Net::HTTPSuccess). Für eine Katalogstimme senden Sie statt eines Standardnamens die geparste Datei: voice: JSON.parse(File.read("voice.json")). Faraday oder HTTParty funktionieren genauso, wenn Ihre App sie schon nutzt.

Rails: Hintergrundjobs und Active Storage

In Rails vertonen Sie Text in einem Active Job, nie innerhalb der Web-Anfrage, und hängen das Ergebnis an den Datensatz: post.audio.attach(io: StringIO.new(res.body), filename: "post-#{post.id}.wav", content_type: "audio/wav"). Erzeugen Sie neu, nur wenn sich der Text ändert. Öffnen Sie Port 8000 nicht ins Internet: Setzen Sie SUPERCLONICA_API_KEY auf dem Server und senden Sie ihn im Header Authorization: Bearer, oder halten Sie den Server in einem privaten Netz. Sagen Sie den Hörern, dass das Audio generiert ist.