mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
TTS speed buttons now work on windows
This commit is contained in:
parent
e86b505350
commit
21eb7a9dcd
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user