ANLEITUNG

Text-to-Speech in Rust, offline

Rust hat Crates, die die Sprach-Engines des Betriebssystems kapseln, gut für Barrierefreiheit, aber mit roboterhaften Stimmen, die auf jeder Plattform anders klingen, und Cloud-SDKs, die pro Zeichen abrechnen. Für ein Spiel, einen Bot oder ein Kommandozeilenwerkzeug, das überall dieselbe natürliche Stimme braucht, ist beides nicht ideal.

Dieser Leitfaden zeigt, wie Sie die kostenlose SuperClonica-Engine aus Rust über einen lokalen HTTP-Server aufrufen: natürliche Stimmen, WAV-Dateien, die Sie behalten, und ein paar Zeilen mit reqwest.

Wege, aus Rust zu sprechen

Für Ausgaben im Stil eines Screenreaders passen Systemstimmen; für die Stimme eines Produkts oder Spiels nehmen Sie eine Engine.

  • Crates, die Systemstimmen kapseln: offline und leicht, aber roboterhaft und unter Windows, macOS und Linux verschieden.
  • Cloud-SDKs: natürliche Stimmen, aber Konto, Schlüssel, Abrechnung pro Zeichen und Ihr Text auf fremden Servern.
  • SuperClonica: ein lokaler HTTP-Server mit natürlichen, Figuren- und eigenen Stimmen, offline, überall, wo Docker läuft.
  • Er 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 macht es mit dem cuda-Image schneller, ist aber nicht nötig.

  • Starten Sie den Server auf jedem Prozessor: 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, in das Volume; GET /health zeigt, wann er bereit ist.
  • POST /synthesize nimmt JSON mit text, voice, lang, seed und normalize und antwortet mit einem 16-Bit-Mono-WAV.
  • voice ist ein Standardname von M1 bis M5 und F1 bis F5 oder der JSON-Inhalt einer Stimmdatei.

Aus Rust aufrufen

Mit dem Crate reqwest und seinem Feature blocking braucht eine Anfrage in einer Funktion, die ein Result zurückgibt, nur ein paar Zeilen: let voice = std::fs::read_to_string("voice.json")?; let body = format!(r#"{{"text": "Hallo aus Rust!", "lang": "de", "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)?; In asynchronem Code nutzen Sie den asynchronen Client von reqwest genauso. Für eine Standardstimme senden Sie "voice": "F1" statt der Datei. Derselbe Text, dieselbe Stimme und derselbe Seed ergeben immer denselben Ton, cachen Sie also Dateien für wiederkehrende Sätze; serde_json hält größere Anfragen übersichtlich.

Gewohnheiten für den Produktivbetrieb

Verwenden Sie einen einzigen reqwest-Client und setzen Sie ein Timeout. Stellen Sie Port 8000 nicht unverändert ins Internet: Setzen Sie SUPERCLONICA_API_KEY und senden Sie ihn als Bearer-Token, oder lassen Sie den Server in einem privaten Netz. Kommen viele Anfragen gleichzeitig, starten Sie mit SUPERCLONICA_LANES mehr Kopien des Modells, und messen Sie auf Ihrer Hardware: In unseren Tests dauerte ein kurzer Satz 0,12 s auf einer RTX 5070 Ti und 0,43 s auf vier CPU-Threads.