TTS speed buttons now work on windows

This commit is contained in:
Kovid Goyal 2020-12-10 11:19:33 +05:30
parent e86b505350
commit 21eb7a9dcd
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 39 additions and 20 deletions

View File

@ -14,6 +14,8 @@ class Client:
mark_template = '<bookmark mark="{}"/>' mark_template = '<bookmark mark="{}"/>'
name = 'sapi' name = 'sapi'
min_rate = -10
max_rate = 10
@classmethod @classmethod
def escape_marked_text(cls, text): def escape_marked_text(cls, text):
@ -30,7 +32,8 @@ class Client:
self.dispatch_on_main_thread = dispatch_on_main_thread self.dispatch_on_main_thread = dispatch_on_main_thread
self.current_marked_text = self.last_mark = None self.current_marked_text = self.last_mark = None
self.status = {'synthesizing': False, 'paused': False} self.status = {'synthesizing': False, 'paused': False}
self.apply_settings(settings) self.settings = settings or {}
self.apply_settings()
def create_voice(self): def create_voice(self):
from calibre.utils.windows.winsapi import ISpVoice from calibre.utils.windows.winsapi import ISpVoice
@ -50,10 +53,11 @@ class Client:
self.sp_voice.resume() self.sp_voice.resume()
self.ignore_next_stop_event = True self.ignore_next_stop_event = True
self.status = {'synthesizing': False, 'paused': False} self.status = {'synthesizing': False, 'paused': False}
settings = new_settings or {} if new_settings is not None:
self.sp_voice.set_current_rate(settings.get('rate', self.default_system_rate)) self.settings = new_settings
self.sp_voice.set_current_voice(settings.get('voice') or self.default_system_voice) self.sp_voice.set_current_rate(self.settings.get('rate', self.default_system_rate))
self.sp_voice.set_current_sound_output(settings.get('sound_output') or self.default_system_sound_output) self.sp_voice.set_current_voice(self.settings.get('voice') or self.default_system_voice)
self.sp_voice.set_current_sound_output(self.settings.get('sound_output') or self.default_system_sound_output)
def wait_for_events(self): def wait_for_events(self):
while True: while True:
@ -138,21 +142,21 @@ class Client:
def resume_after_configure(self): def resume_after_configure(self):
if self.status['paused']: if self.status['paused']:
self.resume() self.resume()
return
if self.last_mark is None:
idx = -1
else: else:
if self.last_mark is None: mark = self.mark_template.format(self.last_mark)
idx = -1 idx = self.current_marked_text.find(mark)
else: if idx == -1:
mark = self.mark_template.format(self.last_mark) text = self.current_marked_text
idx = self.current_marked_text.find(mark) else:
if idx == -1: text = self.current_marked_text[idx:]
text = self.current_marked_text self.ignore_next_start_event = True
else: if self.current_callback is not None:
text = self.current_marked_text[idx:] self.current_callback(Event(EventType.resume))
self.ignore_next_start_event = True self.speak_xml(text)
if self.current_callback is not None: self.status = {'synthesizing': True, 'paused': False}
self.current_callback(Event(EventType.resume))
self.speak_xml(text)
self.status = {'synthesizing': True, 'paused': False}
def get_voice_data(self): def get_voice_data(self):
ans = getattr(self, 'voice_data', None) ans = getattr(self, 'voice_data', None)
@ -169,3 +173,18 @@ class Client:
def config_widget(self, backend_settings, parent): def config_widget(self, backend_settings, parent):
from calibre.gui2.tts.windows_config import Widget from calibre.gui2.tts.windows_config import Widget
return Widget(self, backend_settings, parent) return Widget(self, backend_settings, parent)
def change_rate(self, steps=1):
rate = current_rate = self.settings.get('rate', self.default_system_rate)
step_size = (self.max_rate - self.min_rate) // 10
rate += steps * step_size
rate = max(self.min_rate, min(rate, self.max_rate))
if rate != current_rate:
self.settings['rate'] = rate
prev_state = self.status.copy()
self.pause()
self.apply_settings()
if prev_state['synthesizing']:
self.status = {'synthesizing': True, 'paused': False}
self.resume_after_configure()
return self.settings

View File

@ -80,7 +80,7 @@ class Widget(QWidget):
self.speed = s = QSlider(Qt.Orientation.Horizontal, self) self.speed = s = QSlider(Qt.Orientation.Horizontal, self)
s.setMinimumWidth(200) s.setMinimumWidth(200)
l.addRow(_('&Speed of speech (words per minute):'), s) l.addRow(_('&Speed of speech (words per minute):'), s)
s.setRange(-10, 10) s.setRange(self.tts_client.min_rate, self.tts_client.max_rate)
s.setSingleStep(1) s.setSingleStep(1)
s.setPageStep(2) s.setPageStep(2)