From 0b2fe9d56920550b6ef1f6088fa129c8f0704ed5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Nov 2024 08:04:52 +0530 Subject: [PATCH] Read aloud: Fix only first 32000 characters per chapter being read. Fixes #2086571 [Viewer TTS Skips Ahead](https://bugs.launchpad.net/calibre/+bug/2086571) --- 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 c5ddf7b6f7..21b3f39fa3 100644 --- a/src/calibre/gui2/tts/manager.py +++ b/src/calibre/gui2/tts/manager.py @@ -15,6 +15,9 @@ if TYPE_CHECKING: from calibre.gui2.tts.types import TTSBackend +MAX_UTTERANCE_LENGTH = 32 * 1024 + + class Utterance(NamedTuple): text: str index_in_positions: int @@ -37,7 +40,7 @@ class Tracker: self.last_pos = 0 self.queue: deque[Utterance] = deque() - def parse_marked_text(self, marked_text, limit = 32 * 1024): + def parse_marked_text(self, marked_text, limit = MAX_UTTERANCE_LENGTH): self.clear() text = [] text_len = chunk_len = index_in_positions = offset_in_text = 0 @@ -63,9 +66,11 @@ class Tracker: self.marked_text = marked_text return self.current_text() - def pop_first(self): + def pop_first(self) -> bool: if self.queue: self.queue.popleft() + return True + return False def current_text(self): if self.queue: @@ -244,7 +249,10 @@ class TTSManager(QObject): 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') + if self.tracker.pop_first() and (text := self.tracker.current_text()): + self.tts.say(text) + else: + self.emit_state_event('end') elif state is QTextToSpeech.State.Error: self.emit_state_event('cancel')