Synthèse vocale en Java hors ligne
Java n’a jamais eu de synthèse vocale dans sa bibliothèque standard, alors les projets se tournent vers d’anciens moteurs comme FreeTTS ou MaryTTS, qui sonnent robotiques à côté des voix neuronales, ou vers un SDK cloud facturé au caractère qui voit chaque texte.
Ce guide montre une alternative moderne : le moteur gratuit SuperClonica comme serveur HTTP local, appelé avec le HttpClient intégré à Java 11 et plus. Vous obtenez des voix naturelles, des fichiers WAV que vous gardez et aucun frais par requête, sur toutes les plateformes.
Les façons de parler depuis Java
Le moteur ne tourne pas dans la JVM : votre code Java lui parle en HTTP, comme à n’importe quel autre service.
- FreeTTS et MaryTTS : pur Java et hors ligne, mais robotiques face aux voix neuronales.
- SDK cloud : voix naturelles, mais compte, clé, facturation au caractère et votre texte sur leurs serveurs.
- SuperClonica : un serveur HTTP local avec des voix naturelles, de personnages et personnalisées, hors ligne, partout où tourne Docker.
- 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 appli, sans compte.
Lancer le serveur vocal
Une carte graphique NVIDIA accélère le tout avec l’image cuda, mais elle n’est pas obligatoire.
- Lancez le serveur sur n’importe quel processeur : 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, dans le volume ; 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.
- voice est un nom de base de M1 à M5 et de F1 à F5, ou le contenu JSON d’un fichier de voix.
L’appeler depuis Java
Avec java.net.http, java.net.URI et java.nio.file, une requête tient en quelques lignes en Java 11 ou plus : var voice = Files.readString(Path.of("voice.json")); var json = "{\"text\": \"Bonjour depuis Java !\", \"lang\": \"fr\", \"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"))); La réponse est écrite directement dans un fichier WAV. Pour une voix de base, envoyez "voice": "F1" au lieu du contenu du fichier. Le même texte, la même voix et le même seed donnent toujours le même son : mettez en cache les fichiers des phrases qui reviennent ; dans un grand projet, une bibliothèque JSON comme Jackson garde la requête propre.
Bonnes pratiques en production
Réutilisez un seul HttpClient et fixez un délai d’expiration aux requêtes. N’exposez pas le port 8000 sur internet tel quel : définissez SUPERCLONICA_API_KEY et envoyez-la comme jeton Bearer, ou gardez le serveur sur un réseau privé. Si beaucoup de requêtes arrivent en même temps, lancez plus de copies du modèle avec SUPERCLONICA_LANES, et mesurez sur votre matériel : dans nos tests, une phrase courte a pris 0,12 s sur une RTX 5070 Ti et 0,43 s sur quatre threads de processeur.