Synthèse vocale dans Pygame avec des voix naturelles
Pygame est là où beaucoup écrivent leur premier jeu, et tôt ou tard un personnage doit parler. pyttsx3 parle avec les voix robotiques du système, et les API cloud demandent une clé et une connexion, que l’ordinateur de l’école ou le portable d’une game jam n’ont pas forcément.
Le moteur SuperClonica est un paquet Python : un projet Pygame peut donc vocaliser du texte lui-même, hors ligne, avec des voix naturelles dans 31 langues, et jouer le résultat via pygame.mixer sans toucher à un fichier. Ce guide montre le code, comment garder le jeu fluide pendant la synthèse et quand livrer des fichiers à la place.
Deux façons de faire parler un jeu Pygame
Gardez la synthèse en jeu pour les prototypes, les outils et les jeux lancés depuis le code ; pour un jeu fini, livrez des fichiers.
- En jeu : le jeu vocalise n’importe quel texte, comme le nom du joueur, et le joue aussitôt.
- Fichiers préparés : des répliques faites pendant le développement, chargées avec pygame.mixer.Sound comme tout effet sonore.
- Les deux utilisent le même moteur, les mêmes voix et langues ; le chinois n’est pas encore pris en charge.
- Tout tourne sur un processeur ordinaire, sans carte graphique.
Choisir des voix gratuitement en ligne
Sur la page de n’importe quelle voix, saisissez une réplique de votre personnage, 30 à 100 caractères, choisissez la langue et cliquez sur le bouton de synthèse. En quelques secondes, vous entendez si la voix convient, sans compte.
Vocaliser une réplique en jeu
Charger le moteur prend quelques secondes, créez-le donc une fois au démarrage, pas pour chaque réplique.
- Installez les deux paquets : python -m pip install superclonica-cpu pygame.
- Réglez le mixeur au format du moteur avant pygame.init() : pygame.mixer.init(frequency=44100, size=-16, channels=1).
- Créez le moteur une fois, tts = Superclonica(), puis vocalisez et jouez une réplique : audio, rate = tts.synthesize("Bienvenue, héros ! Le village a besoin de toi.", "M2", "fr"); sound = pygame.mixer.Sound(array=(audio * 32767).astype(np.int16)); sound.play().
- Le moteur renvoie des échantillons flottants à 44,1 kHz ; les convertir en entiers 16 bits est tout ce dont pygame a besoin.
Garder le jeu fluide
Une réplique courte prend environ une demi-seconde sur un processeur de bureau, et une image figée se remarque. Vocalisez dans un thread d’arrière-plan et déposez le Sound prêt dans une file que la boucle principale joue, ou vocalisez les répliques d’un niveau pendant son écran de chargement. Gardez un dictionnaire texte vers Sound, pour qu’une réplique répétée ne soit vocalisée qu’une fois.
Si vous publiez le jeu
La synthèse en jeu demande le moteur, environ 385 Mo de modèle et Python sur l’ordinateur du joueur : c’est acceptable pour un jeu de game jam lancé depuis le code, mais lourd pour un téléchargement. Pour un jeu publié, vocalisez toutes les répliques à l’avance avec tts.save('line.ogg', audio) et livrez les fichiers OGG. Utilisez les dix voix de base du modèle, de M1 à M5 et de F1 à F5, ou votre propre voix entraînée sur un locuteur qui a donné son accord ; les voix de personnages faites par des fans sont pour les jeux de fans et la parodie.