From 4057ad35664ceb51e1143c67145c0253d6f0f685 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 20 Oct 2024 14:04:15 +0530 Subject: [PATCH] Linux: Piper TTS: Fix audio not playing on some Linux systems Apparently setting a large buffer size causes some linux audio devices to refuse to flush audio data. Sigh. --- src/calibre/gui2/tts/piper.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/tts/piper.py b/src/calibre/gui2/tts/piper.py index d3cb9f46a8..4bc0491547 100644 --- a/src/calibre/gui2/tts/piper.py +++ b/src/calibre/gui2/tts/piper.py @@ -32,7 +32,7 @@ from qt.core import ( sip, ) -from calibre.constants import cache_dir, is_debugging, iswindows, piper_cmdline +from calibre.constants import cache_dir, is_debugging, ismacos, iswindows, piper_cmdline from calibre.gui2 import error_dialog from calibre.gui2.tts.types import TTS_EMBEDED_CONFIG, EngineSpecificSettings, Quality, TTSBackend, Voice, widget_parent from calibre.spell.break_iterator import PARAGRAPH_SEPARATOR, split_into_sentences_for_tts @@ -421,7 +421,10 @@ class Piper(TTSBackend): self._audio_sink.setVolume(s.volume) # On Windows, the buffer is zero causing data to be discarded. # Ensure we have a nice large buffer on all platforms. - self._audio_sink.setBufferSize(2 * 1024 * 1024) + # However, on Linux changing the buffer size causes audio to not + # play on some systems. See https://www.mobileread.com/forums/showthread.php?t=363881 + if not iswindows and not ismacos: + self._audio_sink.setBufferSize(2 * 1024 * 1024) self._audio_sink.stateChanged.connect(self._utterances_being_spoken.audio_state_changed) self._process.start() self._audio_sink.start(self._utterances_being_spoken)