Remove speech language
Doesn't work on systems where language support packages are trimmed.
James Cameron
4 years ago
34 | 34 | self._speech = SpeechManager() |
35 | 35 | self._is_paused = False |
36 | 36 | |
37 | self.load_speech_parameters() | |
38 | ||
39 | self._voices = self._speech.get_all_voices() # a dictionary | |
40 | ||
41 | locale = os.environ.get('LANG', '') | |
42 | language_location = locale.split('.', 1)[0].lower() | |
43 | language = language_location.split('_')[0] | |
44 | # if the language is es but not es_es default to es_la (latin voice) | |
45 | if language == 'es' and language_location != 'es_es': | |
46 | language_location = 'es_la' | |
47 | ||
48 | self._voice = 'en_us' | |
49 | if language_location in self._voices: | |
50 | self._voice = language_location | |
51 | elif language in self._voices: | |
52 | self._voice = language | |
53 | ||
54 | voice_names = [] | |
55 | for language, name in self._voices.iteritems(): | |
56 | voice_names.append((language, name)) | |
57 | voice_names.sort(self._compare_voice) | |
58 | ||
59 | 37 | # Play button |
60 | 38 | self._play_button = ToggleToolButton('media-playback-start') |
61 | 39 | self._play_button.show() |
71 | 49 | self.insert(self._stop_button, -1) |
72 | 50 | self._stop_button.set_tooltip(_('Stop')) |
73 | 51 | |
74 | # Language list | |
75 | combo = ComboBox() | |
76 | which = 0 | |
77 | for pair in voice_names: | |
78 | language, name = pair | |
79 | combo.append_item(language, name) | |
80 | if language == self._voice: | |
81 | combo.set_active(which) | |
82 | which += 1 | |
83 | ||
84 | combo.connect('changed', self._voice_changed_cb) | |
85 | combotool = ToolComboBox(combo) | |
86 | self.insert(combotool, -1) | |
87 | combotool.show() | |
88 | ||
89 | 52 | self._speech.connect('stop', self._reset_buttons_cb) |
90 | ||
91 | def _compare_voice(self, a, b): | |
92 | if a[1].lower() == b[1].lower(): | |
93 | return 0 | |
94 | if a[1].lower() < b[1].lower(): | |
95 | return -1 | |
96 | if a[1].lower() > b[1].lower(): | |
97 | return 1 | |
98 | ||
99 | def _voice_changed_cb(self, combo): | |
100 | self._voice = combo.props.value | |
101 | self._speech.say_text(self._voices[self._voice]) | |
102 | self.save_speech_parameters() | |
103 | ||
104 | def load_speech_parameters(self): | |
105 | speech_parameters = {} | |
106 | data_path = os.path.join(self._activity.get_activity_root(), 'data') | |
107 | data_file_name = os.path.join(data_path, 'speech_params.json') | |
108 | if os.path.exists(data_file_name): | |
109 | f = open(data_file_name, 'r') | |
110 | try: | |
111 | speech_parameters = json.load(f) | |
112 | self._voice = speech_parameters['voice'] | |
113 | finally: | |
114 | f.close() | |
115 | ||
116 | def save_speech_parameters(self): | |
117 | speech_parameters = {} | |
118 | speech_parameters['voice'] = self._voice | |
119 | data_path = os.path.join(self._activity.get_activity_root(), 'data') | |
120 | data_file_name = os.path.join(data_path, 'speech_params.json') | |
121 | f = open(data_file_name, 'w') | |
122 | try: | |
123 | json.dump(speech_parameters, f) | |
124 | finally: | |
125 | f.close() | |
126 | 53 | |
127 | 54 | def _reset_buttons_cb(self, widget=None): |
128 | 55 | self._play_button.set_icon_name('media-playback-start') |
135 | 62 | self._play_button.set_icon_name('media-playback-pause') |
136 | 63 | if not self._is_paused: |
137 | 64 | self._speech.say_text( |
138 | self._activity._view.get_marked_words(), | |
139 | lang_code=self._voice) | |
65 | self._activity._view.get_marked_words()) | |
140 | 66 | else: |
141 | 67 | self._speech.restart() |
142 | 68 | else: |