Synthèse vocale en Kotlin pour Android avec des voix naturelles
Android intègre la synthèse vocale : la classe TextToSpeech lit n’importe quel texte avec le moteur installé sur le téléphone, hors ligne et gratuitement. La voix entendue dépend de l’appareil, du moteur et des voix téléchargées, si bien que la même app sonne différemment sur chaque téléphone.
Le moteur gratuit SuperClonica donne à une app Android une seule voix naturelle partout, de deux façons : des fichiers audio préparés et livrés comme ressources, ou un serveur de synthèse que l’app appelle. Ce guide montre les deux avec du code Kotlin prêt à l’emploi et dit quand le moteur du système reste le bon outil.
Trois façons de faire parler une app Android
Beaucoup d’apps les combinent : ressources pour l’interface, serveur pour le texte des utilisateurs, moteur du système en secours.
- TextToSpeech : le moteur installé sur le téléphone, hors ligne et gratuit, avec des voix qui varient selon l’appareil.
- Ressources raw : chaque réplique fixe vocalisée une fois avec SuperClonica et livrée dans l’app.
- Un serveur de synthèse : l’app envoie le texte à votre serveur SuperClonica et joue le WAV renvoyé.
- SuperClonica parle 31 langues ; le chinois n’est pas encore pris en charge.
Choisir une voix gratuitement en ligne
Sur la page de n’importe quelle voix, saisissez une réplique de votre app, 30 à 100 caractères, choisissez la langue et cliquez sur le bouton de synthèse. En quelques secondes, vous entendez si elle convient, sans compte, directement sur votre téléphone.
Livrer des répliques préparées en ressources
Les ressources fonctionnent hors ligne et sans délai ; une modification demande une nouvelle version de l’app.
- Vocalisez chaque réplique sur votre ordinateur avec le moteur : python -m pip install superclonica-cpu, puis superclonica --text "Bon retour parmi nous !" --voice F1 --lang fr --output welcome.mp3.
- Placez les fichiers dans res/raw ; les noms de ressources n’acceptent que des minuscules, des chiffres et des tirets bas.
- Jouez une réplique : MediaPlayer.create(context, R.raw.welcome).start()
- Libérez le lecteur à la fin, par exemple dans setOnCompletionListener.
Appeler votre propre serveur de synthèse
Faites tourner le serveur sur une machine que vous contrôlez : docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu. Android bloque le HTTP non chiffré par défaut, placez-le donc derrière HTTPS, et définissez SUPERCLONICA_API_KEY pour que seule votre app puisse l’utiliser. Avec OkHttp, une réplique tient en une requête, faite hors du thread principal, par exemple dans une coroutine sur Dispatchers.IO : val body = """{"text": "Votre commande est en route.", "voice": "F1", "lang": "fr"}""".toRequestBody("application/json".toMediaType()); val bytes = client.newCall(Request.Builder().url("https://tts.example.com/synthesize").post(body).build()).execute().body!!.bytes(); val file = File(cacheDir, "line.wav").apply { writeBytes(bytes) }; MediaPlayer().apply { setDataSource(file.path); prepare(); start() } Ajoutez un en-tête Authorization avec la clé et mettez en cache les fichiers des répliques qui reviennent.
Quand le TextToSpeech du système suffit
Le moteur du système suffit quand la voix doit seulement être comprise : lire une notification, une aide à l’accessibilité, un prototype, ou une app qui doit parler sans aucun réseau. Choisissez SuperClonica quand la voix fait partie du produit : un professeur de langue, un personnage de jeu, une méditation guidée, une marque qui doit sonner pareil sur chaque téléphone.