Synthèse vocale en Swift pour iOS avec des voix naturelles
Sur iOS, la synthèse vocale commence avec AVSpeechSynthesizer : quelques lignes de Swift et le téléphone lit n’importe quel texte avec ses voix intégrées, hors ligne et gratuitement. Mais ces voix dépendent de ce que l’utilisateur a installé, et ce sont les mêmes que dans toutes les autres apps.
Le moteur gratuit SuperClonica donne à une app iOS ou macOS sa propre voix naturelle, de deux façons : des fichiers audio préparés et intégrés à l’app, ou un serveur de synthèse que l’app appelle. Ce guide montre les deux avec du code Swift prêt à l’emploi et dit quand AVSpeechSynthesizer reste le bon outil.
Trois façons de faire parler une app iOS
Beaucoup d’apps les combinent : répliques intégrées pour l’interface, serveur pour le texte des utilisateurs, voix du système en secours.
- AVSpeechSynthesizer : les voix du système, hors ligne et gratuites, selon ce que l’utilisateur a installé.
- Audio intégré : 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 iPhone.
Intégrer des répliques préparées
Les fichiers intégrés fonctionnent hors ligne et sans délai ; une modification demande une nouvelle version de l’app.
- Vocalisez chaque réplique sur votre Mac avec le moteur : python -m pip install superclonica-cpu, puis superclonica --text "Bon retour parmi nous !" --voice F1 --lang fr --output welcome.mp3.
- Ajoutez les fichiers au projet Xcode pour qu’ils soient copiés dans le bundle de l’app.
- Jouez une réplique avec AVFoundation : player = try AVAudioPlayer(contentsOf: Bundle.main.url(forResource: "welcome", withExtension: "mp3")!); player.play()
- Gardez player dans une propriété de votre classe : un AVAudioPlayer local se tait dès qu’il est libéré.
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. iOS attend HTTPS par défaut, placez-le donc derrière un certificat, et définissez SUPERCLONICA_API_KEY pour que seule votre app puisse l’utiliser. Une réplique tient alors en une requête : var request = URLRequest(url: URL(string: "https://tts.example.com/synthesize")!); request.httpMethod = "POST"; request.setValue("application/json", forHTTPHeaderField: "Content-Type"); request.httpBody = try JSONEncoder().encode(["text": "Votre commande est en route.", "voice": "F1", "lang": "fr"]); let (data, _) = try await URLSession.shared.data(for: request); player = try AVAudioPlayer(data: data); player.play() Ajoutez un en-tête Authorization avec la clé et mettez en cache les données des répliques qui reviennent.
Quand AVSpeechSynthesizer suffit
AVSpeechSynthesizer 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 pour chaque utilisateur.