Bonjour à tous.
Dans l'article Jeux sonores: un marché invisible attend les héros , des jeux sonores avec un son surround cool et des bibliothèques pour sa création ont été examinés.
Eh bien, j'ai décidé de commencer petit, et pour commencer, d'organiser la notation des actions du synthétiseur dans des jeux au tour par tour sur pygame.
Bien sûr, une telle technique ne convient pas à tous les jeux, mais dans certains très.
Créez un module vocal.
Nous y organiserons deux options de travail:
- Connectez-vous à NVDA Narrator via sa dll de contrôleur
- directement au synthétiseur Windows via SAPI5;
Nous importons d'abord tous les modules nécessaires.
Pour connecter nvdaControllerClient32.dll, nous avons besoin de ctypes.
import ctypes
Et en l'absence de NVDA sur l'ordinateur, nous travaillons directement avec le synthétiseur SAPI via win32api.
import win32com.client
Nous créons une classe pour notre conversation.
class Speech: def __init__(self, config): """Initialize speech class.""" self.config = config
Ici, vous devez probablement expliquer la configuration. Dans la classe générale Game, qui est chargée d'initialiser tous les modules du jeu et de tordre la boucle principale, les paramètres du jeu se chargent.
Les paramètres peuvent être chargés là où cela est plus pratique: fichiers ini, json, sqlite ou toute autre option pratique.
Mais continuons l'initialisation de notre discours.
# COM . self.speaker = win32com.client.Dispatch("Sapi.SpVoice") # self.voices = self.speaker.GetVoices() # self.voices_names = [voice.GetDescription() for voice in self.voices]
Configurez le synthétiseur connecté avec certains paramètres des paramètres.
Dans cet exemple, je prends juste l'index de la voix installée (celle par défaut a un index de 0), mais vous pouvez faire des réglages avec un choix dans la liste déroulante par nom, obtenu comme décrit ci-dessus.
La vitesse de la voix est définie dans la plage de -10 à +10. Mais je ne pense pas que quelqu'un veuille écouter une voix avec une vitesse inférieure à 5. Vous pouvez vous expérimenter en modifiant la valeur dans les paramètres.
Et bien sûr le volume de la voix. Ici, il est standard de 0 à 100.
self.set_voice(self.config.voice) self.speaker.Rate = self.config.rate self.speaker.Volume = self.config.volume
Enfin, initialisez nvda.
self.nvda = self.config.nvda self.nvda_error = False self.sLib = ctypes.windll.LoadLibrary('./nvdaControllerClient32.dll')
Vérifiez immédiatement si notre programme peut se connecter à un programme NVDA en cours d'exécution.
nvda_error = self.sLib.nvdaController_testIfRunning() errorMessage = str(ctypes.WinError(nvda_error)) if 0 != nvda_error: print('NVDA error: ' + errorMessage) self.nvda_error = True
Après avoir initialisé à la fois le synthétiseur SAPI et la DLL nvda, vous pouvez démarrer la fonction de sélection de la sortie audio de la parole.
self.set_speak_out()
Ajoutez la fonction pour définir la voix dans la liste disponible par index.
def set_voice(self, index): """Set voice for speak.""" try: self.speaker.Voice = self.voices[index] self.speak_sapi(self.voices_names[index]) except: print('error: do not set voice')
Et maintenant, la fonction de sélection de la parole de sortie audio. Ici, nous choisissons réellement ce que nous utiliserons pour le travail: nvda ou un synthétiseur directement.
Le choix se compose de deux paramètres:
- Le drapeau est dans les paramètres si l'utilisateur souhaite même que le jeu utilise NVDA;
- Erreurs possibles lors de la connexion à NVDA;
def set_speak_out(self): """Set speak out: nvda or sapi.""" if self.nvda and not self.nvda_error: self.speak = self.speak_nvda else: self.speak = self.speak_sapi
Et bien sûr, nous allons écrire les fonctions de prononciation.
Pour NVDA:
def speak_nvda(self, phrase): self.sLib.nvdaController_speakText(phrase)
Et c'est une fonction pour prononcer directement sur le synthétiseur:
def speak_sapi(self, phrase): self.speaker.Speak(phrase)
C’est tout. Maintenant, n'importe où dans la logique du jeu, nous envoyons les informations nécessaires à speech.speak ().
J'espère que cet article sera utile à quelqu'un et que d'autres jeux disponibles apparaîtront.