From 917f82385ad53d86ff718fb5f3ab976cd17131b8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 13 Sep 2024 20:41:07 +0530 Subject: [PATCH] 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) --- src/calibre/gui2/tts/manager.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/tts/manager.py b/src/calibre/gui2/tts/manager.py index 20e39b01ea..c5ddf7b6f7 100644 --- a/src/calibre/gui2/tts/manager.py +++ b/src/calibre/gui2/tts/manager.py @@ -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: