Skip to content

Commit 2abb9d1

Browse files
committed
Refactor VoiceManager code
1 parent 7a72e15 commit 2abb9d1

File tree

4 files changed

+28
-64
lines changed

4 files changed

+28
-64
lines changed

addon/globalPlugins/WorldVoice/speechSettingsDialog.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ def makeSettings(self, sizer):
8484
else:
8585
self._manager.activeEngines = [key for key, value in config.conf["WorldVoice"]["engine"].items() if value]
8686

87-
self._localeToVoices = self._manager.localeToVoicesMapEngineFilter
88-
self.localesToNames = self._manager.localesToNamesMapEngineFilter
89-
self._locales = self._manager.languagesEngineFilter
87+
self._localeToVoices = self._manager.localeToVoicesMap
88+
self.localesToNames = self._manager.localesToNamesMap
89+
self._locales = self._manager.languages
9090

9191
self._dataToPercist = defaultdict(lambda: {})
9292
latinSet = set(languageDetection.ALL_LATIN) & set(l for l in self._locales if len(l) == 2)
@@ -246,9 +246,9 @@ def onKeepEngineConsistentChange(self, event):
246246

247247
self._manager.onKeepEngineConsistent()
248248

249-
self._localeToVoices = self._manager.localeToVoicesMapEngineFilter
250-
self.localesToNames = self._manager.localesToNamesMapEngineFilter
251-
self._locales = self._manager.languagesEngineFilter
249+
self._localeToVoices = self._manager.localeToVoicesMap
250+
self.localesToNames = self._manager.localesToNamesMap
251+
self._locales = self._manager.languages
252252
self._localesChoice.SetItems([self.localesToNames[l] for l in self._locales])
253253
self._updateVoicesSelection()
254254

@@ -407,8 +407,8 @@ def makeSettings(self, sizer):
407407
sizer.Add(infoLabel)
408408
return
409409

410-
self.localesToNames = self._manager.localesToNamesMapEngineFilter
411-
self._locales = self._manager.languagesEngineFilter
410+
self.localesToNames = self._manager.localesToNamesMap
411+
self._locales = self._manager.languages
412412

413413
settingsSizerHelper = guiHelper.BoxSizerHelper(self, sizer=sizer)
414414
latinSet = set(languageDetection.ALL_LATIN) & set(l for l in self._locales if len(l) == 2)
@@ -499,6 +499,10 @@ class SpeechEngineSettingsPanel(BaseSettingsPanel):
499499
# Translators: Title of a setting dialog.
500500
title = _("Speech Engine")
501501
settings = OrderedDict({
502+
"VE": {
503+
# Translators: The label of an option in the Engine settings dialog
504+
"label": _("Activate VE")
505+
},
502506
"OneCore": {
503507
# Translators: The label of an option in the Engine settings dialog
504508
"label": _("Activate OneCore")
@@ -549,6 +553,8 @@ def onSave(self):
549553
)
550554
return False
551555

556+
print(activeEngine)
557+
print(self.previousActiveEngine)
552558
if activeEngine != self.previousActiveEngine:
553559
if gui.messageBox(
554560
# Translators: The message displayed

addon/synthDrivers/WorldVoice/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class SynthDriver(SynthDriver):
9393

9494
@classmethod
9595
def check(cls):
96-
return VoiceManager.ready()
96+
return True
9797

9898
@property
9999
def supportedSettings(self):

addon/synthDrivers/WorldVoice/voiceManager.py

Lines changed: 11 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,23 @@ class VoiceManager(object):
5757

5858
@classmethod
5959
def ready(cls):
60-
result = False
61-
for item in cls.voice_class.values():
62-
result |= item.ready()
63-
return result
60+
return True
6461

6562
def __init__(self):
6663
self.lock = threading.Lock()
6764

65+
self.activeEngines = [key for key, value in config.conf["WorldVoice"]["engine"].items() if value]
6866
self.installEngine = []
69-
for item in self.voice_class.values():
67+
for key in self.activeEngines:
68+
try:
69+
item = self.voice_class[key]
70+
except BaseException as e:
71+
continue
7072
if item.ready():
7173
try:
7274
item.engineOn(self.lock)
7375
self.installEngine.append(item)
7476
except BaseException as e:
75-
print(e)
7677
pass
7778

7879
self._setVoiceDatas()
@@ -90,8 +91,6 @@ def __init__(self):
9091
config.conf["WorldVoice"]["engine"]["SAPI5"] = True
9192
item = self.table[0]
9293

93-
self.activeEngines = [key for key, value in config.conf["WorldVoice"]["engine"].items() if value]
94-
9594
defaultVoiceName = item["name"]
9695
self._defaultVoiceInstance = self.getVoiceInstance(defaultVoiceName)
9796
self._defaultVoiceInstance.loadParameter()
@@ -179,7 +178,7 @@ def onKeepEngineConsistent(self):
179178

180179
for localelo, data in config.conf["WorldVoice"]['speechRole'].items():
181180
if isinstance(data, config.AggregatedSection):
182-
if (localelo not in self.localeToVoicesMapEngineFilter) or ('voice' in data and data['voice'] not in self.localeToVoicesMapEngineFilter[localelo]):
181+
if (localelo not in self.localeToVoicesMap) or ('voice' in data and data['voice'] not in self.localeToVoicesMap[localelo]):
183182
try:
184183
del temp[localelo]
185184
except BaseException:
@@ -225,7 +224,7 @@ def _setVoiceDatas(self):
225224
for item in self.installEngine:
226225
self.table.extend(item.voices())
227226
self.table = sorted(self.table, key=lambda item: (item['engine'], item['language'], item['name']))
228-
self.table = list(filter(lambda item: item['engine'] in [key for key, value in config.conf["WorldVoice"]["engine"].items() if value], self.table))
227+
self.table = list(filter(lambda item: item['engine'] in self.activeEngines, self.table))
229228

230229
self._localesToVoices = {
231230
**groupByField(self.table, 'locale', lambda i: i, lambda i: i['name']),
@@ -244,44 +243,15 @@ def _setVoiceDatas(self):
244243
# Kepp a list with existing voices in VoiceInfo objects.
245244
self._voiceInfos = OrderedDict([(v.id, v) for v in voiceInfos])
246245

247-
def _setVoiceDatasEngineFilter(self):
248-
self.tableEngineFilter = []
249-
for item in self.voice_class.values():
250-
self.tableEngineFilter.extend(item.voices())
251-
self.tableEngineFilter = sorted(self.tableEngineFilter, key=lambda item: (item['engine'], item['language'], item['name']))
252-
self.tableEngineFilter = list(filter(lambda item: item['engine'] in self.engines, self.tableEngineFilter))
253-
254-
self._localesToVoicesEngineFilter = {
255-
**groupByField(self.tableEngineFilter, 'locale', lambda i: i, lambda i: i['name']),
256-
# For locales with no country (i.g. "en") use all voices from all sub-locales
257-
**groupByField(self.tableEngineFilter, 'locale', lambda i: i.split('_')[0], lambda i: i['name']),
258-
}
259-
260-
self._voicesToEnginesEngineFilter = {}
261-
for item in self.tableEngineFilter:
262-
self._voicesToEnginesEngineFilter[item["name"]] = item["engine"]
263-
264-
voiceInfos = []
265-
for item in self.tableEngineFilter:
266-
voiceInfos.append(VoiceInfo(item["name"], item["description"], item["language"]))
267-
268-
# Kepp a list with existing voices in VoiceInfo objects.
269-
self._voiceInfosEngineFilter = OrderedDict([(v.id, v) for v in voiceInfos])
270-
271246
@property
272247
def activeEngines(self):
273248
return self._activeEngines
274249

275250
@activeEngines.setter
276251
def activeEngines(self, value):
277-
if not set(value).issubset(set(self.voice_class.keys())):
278-
raise ValueError("engine setted is not valid")
252+
# if not set(value).issubset(set(self.voice_class.keys())):
253+
# raise ValueError("engine setted is not valid")
279254
self._activeEngines = value
280-
self._setVoiceDatasEngineFilter()
281-
282-
@property
283-
def engines(self):
284-
return self.activeEngines
285255

286256
@property
287257
def voiceInfos(self):
@@ -299,18 +269,6 @@ def localeToVoicesMap(self):
299269
def localesToNamesMap(self):
300270
return {item: self._getLocaleReadableName(item) for item in self._localesToVoices}
301271

302-
@property
303-
def languagesEngineFilter(self):
304-
return sorted([l for l in self._localesToVoicesEngineFilter if len(self._localesToVoicesEngineFilter[l]) > 0])
305-
306-
@property
307-
def localeToVoicesMapEngineFilter(self):
308-
return self._localesToVoicesEngineFilter.copy()
309-
310-
@property
311-
def localesToNamesMapEngineFilter(self):
312-
return {locale: self._getLocaleReadableName(locale) for locale in self._localesToVoicesEngineFilter}
313-
314272
def getVoiceNameForLanguage(self, language):
315273
configured = self._getConfiguredVoiceNameForLanguage(language)
316274
if configured is not None and configured in self.voiceInfos:

buildVars.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def _(arg):
2525
# Translators: Long description to be shown for this add-on on add-on information from add-ons manager
2626
"addon_description" : _("Multilingual synthesizers add-on: Automatically switch speech role according to text language; Integrated Espeak, OneCore, RHVoice, SAPI5, Piper speech engine"),
2727
# version
28-
"addon_version" : "2024.7.25",
28+
"addon_version" : "4.1",
2929
# Author(s)
3030
"addon_author" : "Tseng Woody <tsengwoody.tw@gmail.com>",
3131
# URL for the add-on documentation support
@@ -37,7 +37,7 @@ def _(arg):
3737
# Minimum NVDA version supported (e.g. "2018.3.0", minor version is optional)
3838
"addon_minimumNVDAVersion" : "2024.1",
3939
# Last NVDA version supported/tested (e.g. "2018.4.0", ideally more recent than minimum version)
40-
"addon_lastTestedNVDAVersion" : "2024.1",
40+
"addon_lastTestedNVDAVersion" : "2024.4",
4141
# Add-on update channel (default is None, denoting stable releases,
4242
# and for development releases, use "dev".)
4343
# Do not change unless you know what you are doing!

0 commit comments

Comments
 (0)