Доступность игр на pygame
- четверг, 27 сентября 2018 г. в 00:18:43
Всем привет.
В статье Звуковые игры: невидимый рынок ждёт героев были рассмотрены звуковые игры с крутым объемным звуком, и библиотеки для его создания.
Ну а я решил начать с малого, и для начала организовать озвучивание синтезатором действий в пошаговых играх на pygame.
Конечно не для всех игр подходит такой прием, но в некоторых очень даже.
Создадим модуль speech.
В нем организуем два варианта работы:
Сначала импортируем все необходимые модули.
Для подключения nvdaControllerClient32.dll нам нужен ctypes.
import ctypes
import win32com.client
Создаем класс для нашей говорилки.
class Speech:
def __init__(self, config):
"""Initialize speech class."""
self.config = config
Но продолжим инициализацию нашего Speech.
# подключаем синтезатор как COM объект.
self.speaker = win32com.client.Dispatch("Sapi.SpVoice")
# Получаем все доступные синтезаторы в системе и сохраняем в списке
self.voices = self.speaker.GetVoices()
# Создаем список имен полученных голосов
self.voices_names = [voice.GetDescription() for voice in self.voices]
self.set_voice(self.config.voice)
self.speaker.Rate = self.config.rate
self.speaker.Volume = self.config.volume
self.nvda = self.config.nvda
self.nvda_error = False
self.sLib = ctypes.windll.LoadLibrary('./nvdaControllerClient32.dll')
nvda_error = self.sLib.nvdaController_testIfRunning()
errorMessage = str(ctypes.WinError(nvda_error))
if 0 != nvda_error:
print('NVDA error: ' + errorMessage)
self.nvda_error = True
self.set_speak_out()
Добавим функцию установки голоса из списка доступных по индексу.
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')
А теперь функция по выбору аудио вывода речи. Тут мы собственно и выбираем, что будем использовать для работы: 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
Ну и конечно пропишем функции произношения.
Для NVDA:
def speak_nvda(self, phrase):
self.sLib.nvdaController_speakText(phrase)
def speak_sapi(self, phrase):
self.speaker.Speak(phrase)
Вот и все. Теперь в любом месте игровой логики отправляем нужную информацию на speech.speak().
Надеюсь данная статья кому-то окажется полезной и будет появляться больше доступных игр.