mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
E-book viewer: Fix a regression in the previous release that broke Read aloud for selected text. Fixes #2080655 [The new text-to-speech feature in calibre malfunctions when reading a selected portion of text. Instead of reading the highlighted text, the book jumps to the next chapter, and no audio output is produced.](https://bugs.launchpad.net/calibre/+bug/2080655)
This commit is contained in:
parent
dd7f55b0d0
commit
917f82385a
@ -118,6 +118,7 @@ class TTSManager(QObject):
|
||||
super().__init__(parent)
|
||||
self._tts: 'TTSBackend' | None = None
|
||||
self.state = QTextToSpeech.State.Ready
|
||||
self.speaking_simple_text = False
|
||||
self.tracker = Tracker()
|
||||
self._resuming_after_configure = False
|
||||
|
||||
@ -149,6 +150,7 @@ class TTSManager(QObject):
|
||||
self._stop()
|
||||
|
||||
def _stop(self) -> None:
|
||||
self.speaking_simple_text = False
|
||||
self.tracker.clear()
|
||||
self.tts.stop()
|
||||
|
||||
@ -159,10 +161,13 @@ class TTSManager(QObject):
|
||||
self.tts.resume()
|
||||
|
||||
def speak_simple_text(self, text: str) -> None:
|
||||
self.speak_marked_text([0, text])
|
||||
self._stop()
|
||||
self.speaking_simple_text = True
|
||||
self.tts.say(text)
|
||||
|
||||
def speak_marked_text(self, marked_text):
|
||||
self._stop()
|
||||
self.speaking_simple_text = False
|
||||
self.tts.say(self.tracker.parse_marked_text(marked_text))
|
||||
|
||||
@contextmanager
|
||||
@ -229,7 +234,7 @@ class TTSManager(QObject):
|
||||
if state is QTextToSpeech.State.Error:
|
||||
from calibre.gui2.tts.types import widget_parent
|
||||
error_dialog(widget_parent(self), _('Read aloud failed'), self.tts.error_message(), show=True)
|
||||
if state is QTextToSpeech.State.Paused:
|
||||
elif state is QTextToSpeech.State.Paused:
|
||||
self.emit_state_event('pause')
|
||||
elif state is QTextToSpeech.State.Speaking:
|
||||
if prev_state is QTextToSpeech.State.Paused:
|
||||
@ -238,11 +243,14 @@ class TTSManager(QObject):
|
||||
self.emit_state_event('begin')
|
||||
elif state is QTextToSpeech.State.Ready:
|
||||
if prev_state in (QTextToSpeech.State.Paused, QTextToSpeech.State.Speaking):
|
||||
if not self.speaking_simple_text:
|
||||
self.emit_state_event('end')
|
||||
elif state is QTextToSpeech.State.Error:
|
||||
self.emit_state_event('cancel')
|
||||
|
||||
def _saying(self, offset: int, length: int) -> None:
|
||||
if self.speaking_simple_text:
|
||||
return
|
||||
self.tracker.boundary_reached(offset)
|
||||
x = self.tracker.mark_word_or_sentence(offset, length)
|
||||
if x is not None:
|
||||
|
Loading…
x
Reference in New Issue
Block a user