Olá pessoal.
No artigo Jogos de som: um mercado invisível aguarda heróis , foram examinados jogos de som com som surround legal e bibliotecas para sua criação.
Bem, decidi começar pequeno e, para começar, organizar a pontuação das ações do sintetizador em jogos baseados em turnos no pygame.
Obviamente, essa técnica não é adequada para todos os jogos, mas em alguns casos.
Crie um módulo de fala.
Vamos organizar duas opções de trabalho:
- Conecte-se ao NVDA Narrator através de sua dll Controller
- diretamente para o sintetizador de janelas através do SAPI5;
Primeiro importamos todos os módulos necessários.
Para conectar o nvdaControllerClient32.dll, precisamos de ctypes.
import ctypes
E, na ausência do NVDA no computador, trabalhamos diretamente com o sintetizador SAPI através do win32api.
import win32com.client
Criamos uma aula para nossa palestra.
class Speech: def __init__(self, config): """Initialize speech class.""" self.config = config
Aqui você provavelmente precisará explicar sobre a configuração. Na classe geral Game, responsável por inicializar todos os módulos do jogo e torcer o loop principal, as configurações do jogo estão sendo carregadas.
As configurações podem ser carregadas de onde é mais conveniente: arquivos ini, json, sqlite ou qualquer outra opção conveniente.
Mas vamos continuar a inicialização do nosso discurso.
# COM . self.speaker = win32com.client.Dispatch("Sapi.SpVoice") # self.voices = self.speaker.GetVoices() # self.voices_names = [voice.GetDescription() for voice in self.voices]
Configure o sintetizador conectado com alguns parâmetros das configurações.
Neste exemplo, eu apenas pego o índice da voz instalada (a padrão possui um índice de 0), mas você pode fazer configurações com uma opção na lista suspensa por nome, obtida conforme descrito acima.
A velocidade da voz é definida no intervalo de -10 a +10. Mas não acho que alguém queira ouvir uma voz com velocidade abaixo de 5. Você pode experimentar alterando o valor nas configurações.
E, claro, o volume da voz. Aqui é padrão de 0 a 100.
self.set_voice(self.config.voice) self.speaker.Rate = self.config.rate self.speaker.Volume = self.config.volume
Por fim, inicialize o nvda.
self.nvda = self.config.nvda self.nvda_error = False self.sLib = ctypes.windll.LoadLibrary('./nvdaControllerClient32.dll')
Verifique imediatamente se nosso programa pode se conectar a um programa NVDA em execução.
nvda_error = self.sLib.nvdaController_testIfRunning() errorMessage = str(ctypes.WinError(nvda_error)) if 0 != nvda_error: print('NVDA error: ' + errorMessage) self.nvda_error = True
Depois de inicializar o sintetizador SAPI e a nvda dll, você poderá iniciar a função para selecionar a saída de áudio da fala.
self.set_speak_out()
Adicione a função para definir a voz na lista disponível pelo índice.
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')
E agora a função para selecionar o discurso de saída de áudio. Aqui, na verdade, escolhemos o que usaremos para o trabalho: nvda ou um sintetizador diretamente.
A escolha consiste em dois parâmetros:
- A bandeira está nas configurações se o usuário deseja que o jogo use o NVDA;
- Possíveis erros ao conectar ao 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
E, claro, escreveremos as funções de pronúncia.
Para NVDA:
def speak_nvda(self, phrase): self.sLib.nvdaController_speakText(phrase)
E esta é uma função para pronunciar diretamente no sintetizador:
def speak_sapi(self, phrase): self.speaker.Speak(phrase)
Isso é tudo. Agora, em qualquer parte da lógica do jogo, enviamos as informações necessárias para speech.speak ().
Espero que este artigo seja útil para alguém e mais jogos disponíveis apareçam.