Hallo an alle.
In dem Artikel Soundspiele: Ein unsichtbarer Markt erwartet Helden , Soundspiele mit coolem Surround-Sound und Bibliotheken für seine Erstellung wurden untersucht.
Nun, ich habe mich entschlossen, klein anzufangen und für den Anfang das Synthesizer-Scoring für Aktionen in rundenbasierten Pygame-Spielen zu organisieren.
Natürlich ist eine solche Technik nicht für alle Spiele geeignet, aber in einigen sehr.
Erstellen Sie ein Sprachmodul.
Wir werden zwei Arbeitsoptionen darin organisieren:
- Stellen Sie über die Controller-DLL eine Verbindung zum NVDA-Erzähler her
- direkt zum Windows-Synthesizer über SAPI5;
Zuerst importieren wir alle notwendigen Module.
Um nvdaControllerClient32.dll zu verbinden, benötigen wir ctypes.
import ctypes
Und da NVDA auf dem Computer nicht vorhanden ist, arbeiten wir über win32api direkt mit dem SAPI-Synthesizer.
import win32com.client
Wir schaffen eine Klasse für unser Gespräch.
class Speech: def __init__(self, config): """Initialize speech class.""" self.config = config
Hier müssen Sie wahrscheinlich die Konfiguration erklären. In der allgemeinen Klasse Game, die für die Initialisierung aller Module des Spiels verantwortlich ist und die Hauptschleife verdreht, werden die Spieleinstellungen geladen.
Einstellungen können dort geladen werden, wo es am bequemsten ist: INI-Dateien, JSON, SQLite oder eine andere bequeme Option.
Aber lassen Sie uns die Initialisierung unserer Rede fortsetzen.
# COM . self.speaker = win32com.client.Dispatch("Sapi.SpVoice") # self.voices = self.speaker.GetVoices() # self.voices_names = [voice.GetDescription() for voice in self.voices]
Konfigurieren Sie den angeschlossenen Synthesizer mit einigen Parametern aus den Einstellungen.
In diesem Beispiel nehme ich nur den Index der installierten Stimme (der Standardindex hat einen Index von 0), aber Sie können Einstellungen mit einer Auswahl aus der Dropdown-Liste nach Namen vornehmen, die wie oben beschrieben erhalten wurde.
Die Sprachgeschwindigkeit liegt im Bereich von -10 bis +10. Ich glaube jedoch nicht, dass jemand eine Stimme mit einer Geschwindigkeit unter 5 hören möchte. Sie können selbst experimentieren, indem Sie den Wert in den Einstellungen ändern.
Und natürlich die Lautstärke der Stimme. Hier ist es Standard von 0 bis 100.
self.set_voice(self.config.voice) self.speaker.Rate = self.config.rate self.speaker.Volume = self.config.volume
Zum Schluss initialisieren Sie nvda.
self.nvda = self.config.nvda self.nvda_error = False self.sLib = ctypes.windll.LoadLibrary('./nvdaControllerClient32.dll')
Überprüfen Sie sofort, ob unser Programm eine Verbindung zu einem laufenden NVDA-Programm herstellen kann.
nvda_error = self.sLib.nvdaController_testIfRunning() errorMessage = str(ctypes.WinError(nvda_error)) if 0 != nvda_error: print('NVDA error: ' + errorMessage) self.nvda_error = True
Nachdem Sie sowohl den SAPI-Synthesizer als auch die nvda-DLL initialisiert haben, können Sie die Funktion zum Auswählen der Audioausgabe von Sprache starten.
self.set_speak_out()
Fügen Sie die Funktion hinzu, um die Stimme aus der nach Index verfügbaren Liste festzulegen.
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')
Und jetzt die Funktion zur Auswahl der Audioausgabesprache. Hier wählen wir tatsächlich aus, was wir für die Arbeit verwenden möchten: nvda oder einen Synthesizer direkt.
Die Auswahl besteht aus zwei Parametern:
- Das Flag befindet sich in den Einstellungen, ob der Benutzer überhaupt möchte, dass das Spiel NVDA verwendet.
- Mögliche Fehler beim Herstellen einer Verbindung mit 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
Und natürlich schreiben wir die Aussprachefunktionen.
Für NVDA:
def speak_nvda(self, phrase): self.sLib.nvdaController_speakText(phrase)
Und dies ist eine Funktion zum direkten Aussprechen an den Synthesizer:
def speak_sapi(self, phrase): self.speaker.Speak(phrase)
Das ist alles. Jetzt senden wir irgendwo in der Spielelogik die erforderlichen Informationen an language.speak ().
Ich hoffe, dieser Artikel ist für jemanden nützlich und es werden weitere verfügbare Spiele angezeigt.