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:
Kovid Goyal 2024-09-13 20:41:07 +05:30
parent dd7f55b0d0
commit 917f82385a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -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):
self.emit_state_event('end')
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: