Skip to content

Commit 565afb7

Browse files
committed
Preferences dialog startup fixed, speech person selection enabled, set default speech module and language using user's language
1 parent fc42360 commit 565afb7

File tree

3 files changed

+112
-15
lines changed

3 files changed

+112
-15
lines changed

lios/main.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ def __init__ (self,file_list=[]):
180180
#Load Preferences
181181
self.preferences = preferences.lios_preferences()
182182
self.preferences.set_from_file(macros.preferences_file_path)
183+
self.preferences.set_default_speech_module_and_language()
183184
self.preferences.set_avalable_scanner_drivers([ item.name for item in self.available_scanner_driver_list])
184185
self.preferences.set_avalable_ocr_engines([ (item.name, item.get_available_languages(),item.support_multiple_languages())
185186
for item in self.available_ocr_engine_list ])
@@ -1393,6 +1394,7 @@ def load_preferences(self,*data):
13931394

13941395
def restore_preferences(self,*data):
13951396
self.preferences.__init__()
1397+
self.preferences.set_default_speech_module_and_language()
13961398
self.make_preferences_effective()
13971399
self.notify_information(_("Preferences Restored"),0)
13981400

@@ -1503,8 +1505,12 @@ def start_reader(self,*data):
15031505
self.is_reading = True
15041506
speaker = speech.Speech()
15051507
speaker.set_output_module(speaker.list_output_modules()[self.preferences.speech_module])
1506-
if(self.preferences.speech_module != -1 and len(speaker.list_voices()) > 1):
1507-
speaker.set_synthesis_voice(speaker.list_voices()[self.preferences.speech_language])
1508+
language_person_dict = speaker.get_language_person_dict()
1509+
1510+
if(self.preferences.speech_module != -1 and len(language_person_dict.keys()) > 1):
1511+
voice = language_person_dict[list(language_person_dict)[self.preferences.speech_language]][self.preferences.speech_person]
1512+
speaker.set_synthesis_voice(voice)
1513+
15081514
speaker.set_volume(self.preferences.speech_volume)
15091515
speaker.set_pitch(self.preferences.speech_pitch)
15101516
while(not self.textview.is_cursor_at_end()):

lios/preferences.py

Lines changed: 94 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def __init__(self):
3838
self.font="Georgia 14";self.highlight_font="Georgia 14";
3939
self.highlight_color="#000000000000";
4040
self.background_highlight_color="#34346565a4a4";
41-
self.speech_module=0;self.speech_language=10;
41+
self.speech_module=-1;self.speech_language=-1;self.speech_person=-1;
4242
self.speech_rate=0;self.speech_pitch=0;self.speech_volume=100;
4343
self.time_between_repeated_scanning=0;self.scan_resolution=300;
4444
self.scan_driver=1;self.scanner_cache_calibration=0;
@@ -73,6 +73,7 @@ def set_from_file(self,filename):
7373
self.language_3=int(config.get('cfg',"language_3"))
7474
self.speech_module=int(config.get('cfg',"speech_module"))
7575
self.speech_language=int(config.get('cfg',"speech_language"))
76+
self.speech_person=int(config.get('cfg',"speech_person"))
7677
self.speech_rate=int(config.get('cfg',"speech_rate"))
7778
self.speech_volume=int(config.get('cfg',"speech_volume"))
7879
self.speech_pitch=int(config.get('cfg',"speech_pitch"))
@@ -95,6 +96,34 @@ def set_from_file(self,filename):
9596
else:
9697
self.__init__()
9798

99+
# Set speech module, language and person if speech_module is not set
100+
def set_default_speech_module_and_language(self):
101+
if(self.speech_module == -1):
102+
test = speech.Speech()
103+
output_modules_list = test.list_output_modules()
104+
if("espeak-ng" in output_modules_list):
105+
self.speech_module = output_modules_list.index('espeak-ng')
106+
test.set_output_module('espeak-ng')
107+
elif("espeak" in output_modules_list):
108+
self.speech_module = output_modules_list.index('espeak')
109+
test.set_output_module('espeak')
110+
111+
# if espeak or espeak-ng set language
112+
if(self.speech_module != -1):
113+
import locale
114+
language_code, encoding = locale.getdefaultlocale()
115+
localeValues = language_code.split('_')
116+
language = localeValues[0]
117+
language_person_dict = test.get_language_person_dict()
118+
if(language in language_person_dict.keys()):
119+
self.speech_language = list(language_person_dict.keys()).index(language)
120+
self.speech_person=0;
121+
else:
122+
self.speech_module=0;self.speech_language=0;self.speech_person=0;
123+
124+
#Closing
125+
test.close()
126+
98127
def save_to_file(self,filename):
99128
#Removing old configuration file
100129
try:
@@ -115,6 +144,7 @@ def save_to_file(self,filename):
115144
config.set('cfg',"language_3",str(self.language_3))
116145
config.set('cfg',"speech_module",str(self.speech_module))
117146
config.set('cfg',"speech_language",str(self.speech_language))
147+
config.set('cfg',"speech_person",str(self.speech_person))
118148
config.set('cfg',"speech_pitch",str(self.speech_pitch))
119149
config.set('cfg',"speech_volume",str(self.speech_volume))
120150
config.set('cfg',"speech_rate",str(self.speech_rate))
@@ -182,14 +212,62 @@ def change_engine(*data):
182212

183213

184214
def change_speech_module(*data):
185-
index_engine = combobox_speech_module.get_active()
186-
combobox_speech_language.clear()
215+
module_index = combobox_speech_module.get_active()
216+
187217
test = speech.Speech()
188-
list = test.list_output_modules()
189-
test.set_output_module(list[index_engine])
190-
for item in test.list_voices():
191-
combobox_speech_language.add_item(item)
192-
combobox_speech_language.set_active(self.speech_language)
218+
output_modules_list = test.list_output_modules()
219+
test.set_output_module(output_modules_list[module_index])
220+
221+
self.speech_language_person_dict = test.get_language_person_dict()
222+
test.close()
223+
224+
# Disconnecting for preventng function calls while clearing
225+
# combobox_speech_language or adding each language to the same
226+
try:
227+
combobox_speech_language.disconnect_by_func(change_speech_language)
228+
except(TypeError):
229+
pass
230+
231+
combobox_speech_language.clear()
232+
233+
if(len(self.speech_language_person_dict.keys()) == 0):
234+
combobox_speech_language.add_item(_("Default"))
235+
self.speech_language = 0
236+
else:
237+
for item in self.speech_language_person_dict.keys():
238+
combobox_speech_language.add_item(item)
239+
240+
combobox_speech_language.connect_change_callback_function(change_speech_language)
241+
242+
243+
if(self.speech_language < len(self.speech_language_person_dict.keys())):
244+
combobox_speech_language.set_active(self.speech_language)
245+
else:
246+
combobox_speech_language.set_active(0)
247+
self.speech_language = 0
248+
249+
def change_speech_language(*data):
250+
combobox_speech_person.clear()
251+
252+
# For users having preferences from old version
253+
if(self.speech_person == -1):
254+
self.speech_person = 0
255+
256+
if(len(list(self.speech_language_person_dict.keys())) == 0):
257+
combobox_speech_person.add_item(_("Default"))
258+
combobox_speech_person.set_active(0)
259+
self.speech_person = 0
260+
return
261+
262+
index_language = combobox_speech_language.get_active()
263+
language = list(self.speech_language_person_dict.keys())[index_language]
264+
265+
for item in self.speech_language_person_dict[language]:
266+
combobox_speech_person.add_item(item)
267+
268+
if(self.speech_person >= len(self.speech_language_person_dict[language])):
269+
self.speech_person = 0
270+
combobox_speech_person.set_active(self.speech_person)
193271

194272
def change_mode_of_rotation(*data):
195273
if(combobox_mode_of_rotation.get_active() == 2):
@@ -236,10 +314,14 @@ def change_mode_of_rotation(*data):
236314

237315
label_speech_language = widget.Label(_("Speech Language"))
238316
combobox_speech_language = widget.ComboBox()
239-
combobox_speech_module.set_active(self.speech_module)
240-
combobox_speech_language.set_active(self.speech_language)
241317
label_speech_language.set_mnemonic_widget(combobox_speech_language)
242318

319+
label_speech_person = widget.Label(_("Speech Person"))
320+
combobox_speech_person = widget.ComboBox()
321+
label_speech_person.set_mnemonic_widget(combobox_speech_person)
322+
323+
combobox_speech_module.set_active(self.speech_module)
324+
243325
label_speech_rate = widget.Label(_("Speech Rate"))
244326
spin_speech_rate = widget.SpinButton(self.speech_rate,-100,100,1,10,0)
245327
label_speech_rate.set_mnemonic_widget(spin_speech_rate)
@@ -259,6 +341,7 @@ def change_mode_of_rotation(*data):
259341
(label_highlight_background,1,1),(colorbutton_highlight_background,1,1),containers.Grid.NEW_ROW,
260342
(label_speech_module,1,1),(combobox_speech_module,1,1),containers.Grid.NEW_ROW,
261343
(label_speech_language,1,1),(combobox_speech_language,1,1),containers.Grid.NEW_ROW,
344+
(label_speech_person,1,1),(combobox_speech_person,1,1),containers.Grid.NEW_ROW,
262345
(label_speech_rate,1,1),(spin_speech_rate,1,1),containers.Grid.NEW_ROW,
263346
(label_speech_pitch,1,1),(spin_speech_pitch,1,1),containers.Grid.NEW_ROW,
264347
(label_speech_volume,1,1),(spin_speech_volume,1,1)])
@@ -457,6 +540,7 @@ def change_mode_of_rotation(*data):
457540
self.language_3=combobox_language_3.get_active()
458541
self.speech_module=combobox_speech_module.get_active()
459542
self.speech_language=combobox_speech_language.get_active()
543+
self.speech_person=combobox_speech_person.get_active()
460544
self.speech_rate=spin_speech_rate.get_value()
461545
self.speech_pitch=spin_speech_pitch.get_value()
462546
self.speech_volume=spin_speech_volume.get_value()

lios/speech.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@ class Speech(speechd.SSIPClient):
2323
def __init__(self,client_name="lios"):
2424
super(Speech,self).__init__(client_name)
2525
self.status = False
26-
27-
def list_voices(self):
28-
return [ x[0] for x in self.list_synthesis_voices()]
26+
27+
def get_language_person_dict(self):
28+
dictionary = {}
29+
voices = self.list_synthesis_voices()
30+
for item in voices:
31+
if(item[1] not in dictionary):
32+
dictionary[item[1]] = [item[0]]
33+
else:
34+
dictionary[item[1]].append(item[0])
35+
return dictionary
2936

3037
def say(self,text):
3138
self.status = True

0 commit comments

Comments
 (0)