ANLEITUNG

Text-to-Speech in Java, offline

Java hat nie Sprachsynthese in die Standardbibliothek bekommen, deshalb greifen Projekte zu älteren Engines wie FreeTTS oder MaryTTS, die neben neuronalen Stimmen roboterhaft klingen, oder zu einem Cloud-SDK, das pro Zeichen abrechnet und jeden Text sieht.

Dieser Leitfaden zeigt eine moderne Alternative: die kostenlose SuperClonica-Engine als lokalen HTTP-Server, aufgerufen mit dem in Java 11 und neuer eingebauten HttpClient. Sie bekommen natürliche Stimmen, WAV-Dateien, die Sie behalten, und keine Gebühr pro Anfrage, auf jeder Plattform.

Wege, aus Java zu sprechen

Die Engine läuft nicht in der JVM: Ihr Java-Code spricht per HTTP mit ihr, wie mit jedem anderen Dienst.

  • FreeTTS und MaryTTS: reines Java und offline, aber roboterhaft im Vergleich zu neuronalen Stimmen.
  • 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 Java aufrufen

Mit java.net.http, java.net.URI und java.nio.file braucht eine Anfrage in Java 11 oder neuer nur ein paar Zeilen: var voice = Files.readString(Path.of("voice.json")); var json = "{\"text\": \"Hallo aus Java!\", \"lang\": \"de\", \"seed\": 7, \"voice\": " + voice + "}"; var request = HttpRequest.newBuilder(URI.create("http://localhost:8000/synthesize")).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(json)).build(); HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofFile(Path.of("hello.wav"))); Die Antwort wird direkt in eine WAV-Datei geschrieben. Für eine Standardstimme senden Sie "voice": "F1" statt des Dateiinhalts. Derselbe Text, dieselbe Stimme und derselbe Seed ergeben immer denselben Ton, cachen Sie also Dateien für wiederkehrende Sätze; in größeren Projekten hält eine JSON-Bibliothek wie Jackson die Anfrage übersichtlich.

Gewohnheiten für den Produktivbetrieb

Verwenden Sie einen einzigen HttpClient und setzen Sie ein Timeout für Anfragen. 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.