рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред
рд▓реЗрдЦ рдореЗрдВ рдзреНрд╡рдирд┐ рдЦреЗрд▓: рдПрдХ рдЕрджреГрд╢реНрдп рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдирд╛рдпрдХреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ , рд╢рд╛рдВрдд рдЪрд╛рд░реЛрдВ рдУрд░ рдзреНрд╡рдирд┐ рд╡рд╛рд▓реЗ рдзреНрд╡рдирд┐ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИред
рдЦреИрд░, рдореИрдВрдиреЗ рдЫреЛрдЯреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, pygame рдкрд░ рдЯрд░реНрди-рдЖрдзрд╛рд░рд┐рдд рдЦреЗрд▓реЛрдВ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ред
рдмреЗрд╢рдХ, рдРрд╕реА рддрдХрдиреАрдХ рд╕рднреА рдЦреЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдореЗрдВ рдмрд╣реБрддред
рд╕реНрдкреАрдЪ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВред
рд╣рдо рдЗрд╕рдореЗрдВ рджреЛ рдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдЖрдпреЛрдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ:
- рдЕрдкрдиреЗ рдХрдВрдЯреНрд░реЛрд▓рд░ dll рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ NVDA рдиреИрд░реЗрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
- SAPI5 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░;
рдкрд╣рд▓реЗ рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
NvdaControllerClient32.dll рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ ctypes рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
import ctypes
рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ NVDA рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо win32api рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ SAPI рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
import win32com.client
рд╣рдо рдЕрдкрдиреА рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВред
class Speech: def __init__(self, config): """Initialize speech class.""" self.config = config
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдХреЙрдиреНрдлрд┐рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ рдХреЗ рдЦреЗрд▓ рдореЗрдВ, рдЬреЛ рдЦреЗрд▓ рдХреЗ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдореБрдЦреНрдп рд▓реВрдк рдХреЛ рдШреБрдорд╛рддрд╛ рд╣реИ, рдЦреЗрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓реЛрдб рд╣реЛ рд░рд╣реА рд╣реИрдВред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдЖрдИрдПрдирдЖрдИ рдлрд╛рдЗрд▓реЗрдВ, рдЬрд╕рди, рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ, рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдХрд▓реНрдкред
рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдиреЗ рднрд╛рд╖рдг рдХрд╛ рдЖрд░рдВрдн рдЬрд╛рд░реА рд░рдЦреЗрдВред
# COM . self.speaker = win32com.client.Dispatch("Sapi.SpVoice") # self.voices = self.speaker.GetVoices() # self.voices_names = [voice.GetDescription() for voice in self.voices]
рдХрдиреЗрдХреНрдЯреЗрдб рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдЕрднреА рд╕реНрдерд╛рдкрд┐рдд рдЖрд╡рд╛рдЬ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд▓реЗрддрд╛ рд╣реВрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рд▓реЗ рдХрд╛ 0 рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ), рд▓реЗрдХрд┐рди рдЖрдк рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдЖрд╡рд╛рдЬ рдХреА рдЧрддрд┐ -10 рд╕реЗ +10 рддрдХ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдиреАрдЪреЗ рдХреА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡рд╛рдЬрд╝ рд╕реБрдирдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдЖрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдореВрд▓реНрдп рдмрджрд▓рдХрд░ рдЦреБрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╛рдЬ рдХреА рдорд╛рддреНрд░рд╛ред рдпрд╣рд╛рдВ рдпрд╣ 0 рд╕реЗ 100 рддрдХ рдорд╛рдирдХ рд╣реИред
self.set_voice(self.config.voice) self.speaker.Rate = self.config.rate self.speaker.Volume = self.config.volume
рдЕрдВрдд рдореЗрдВ, nvda рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред
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
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ SAPI рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдФрд░ рдПрдирд╡реАрдбреАрдП dll рджреЛрдиреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рднрд╛рд╖рдг рдХреЗ рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
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
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдЙрдЪреНрдЪрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдПрдирд╡реАрдбреАрдП рдХреЗ рд▓рд┐рдП:
def speak_nvda(self, phrase): self.sLib.nvdaController_speakText(phrase)
рдФрд░ рдпрд╣ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХреЛ рд╕реАрдзреЗ рдЙрдЪреНрдЪрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
def speak_sapi(self, phrase): self.speaker.Speak(phrase)
рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм, рдЦреЗрд▓ рддрд░реНрдХ рдореЗрдВ рдХрд╣реАрдВ рднреА, рд╣рдо рд╕реНрдкреАрдЪ.рд╕реНрдкреЗрдХ () рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрд▓рдмреНрдз рдЧреЗрдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред