From 76bfc65978ea6d595fefcd8915e256cc4bba2a02 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Sun, 23 Aug 2026 14:14:46 +0200 Subject: [PATCH] Stabilize German TTS sentence chunking --- compose.yaml | 3 +++ platform/docker/tts-gateway/test_tts_gateway.py | 14 ++++++++++++++ platform/docker/tts-gateway/tts_gateway.py | 5 ++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index e1528b9..ddc38af 100644 --- a/compose.yaml +++ b/compose.yaml @@ -685,6 +685,9 @@ services: TTS_CODE_SWITCH_ENABLED: "false" XTTS_QUEUE_TIMEOUT: "15" XTTS_TIMEOUT: "120" + # Short sentence-sized requests avoid long generated silences and + # truncated weather/status summaries with Annmarie Nele. + XTTS_CHUNK_CHARS: "60" PIPER_TIMEOUT: "120" networks: [frontend] depends_on: diff --git a/platform/docker/tts-gateway/test_tts_gateway.py b/platform/docker/tts-gateway/test_tts_gateway.py index 98f96e0..721cac2 100644 --- a/platform/docker/tts-gateway/test_tts_gateway.py +++ b/platform/docker/tts-gateway/test_tts_gateway.py @@ -110,6 +110,20 @@ class LanguageSegmentationTests(unittest.TestCase): self.assertIn("29 Kilometer pro Stunde", spoken) self.assertNotIn("km", spoken.lower()) + def test_weather_summary_is_split_into_short_complete_chunks(self): + text = ( + "Heute in Rastatt: teils sonnig, trocken, 10 bis 22 Grad. " + "Abends wolkiger, 16 bis 21 Grad. Böen bis 29 km/h. " + "Kein Regen erwartet. Quelle: wetter.com, wetteronline.de" + ) + segments = gateway.prepare_segments(text) + spoken = " ".join(part for _, part in segments) + self.assertEqual(len(segments), 4) + self.assertTrue(all(len(part) <= 60 for _, part in segments)) + self.assertIn("29 Kilometer pro Stunde", spoken) + self.assertIn("Kein Regen erwartet", spoken) + self.assertIn("wetteronline Punkt de", spoken) + class FallbackTests(unittest.TestCase): def setUp(self): diff --git a/platform/docker/tts-gateway/tts_gateway.py b/platform/docker/tts-gateway/tts_gateway.py index 90a01d8..7e53341 100644 --- a/platform/docker/tts-gateway/tts_gateway.py +++ b/platform/docker/tts-gateway/tts_gateway.py @@ -38,7 +38,10 @@ MAX_AUDIO_BYTES = int(os.getenv("TTS_MAX_AUDIO_BYTES", str(64 * 1024 * 1024))) XTTS_TIMEOUT = float(os.getenv("XTTS_TIMEOUT", "120")) PIPER_TIMEOUT = float(os.getenv("PIPER_TIMEOUT", "120")) QUEUE_TIMEOUT = float(os.getenv("XTTS_QUEUE_TIMEOUT", "15")) -CHUNK_CHARS = int(os.getenv("XTTS_CHUNK_CHARS", "220")) +# XTTS can insert multi-second silences or truncate the remainder when a +# moderately long German paragraph is sent as one request. Keeping requests +# close to one sentence proved substantially more stable with Annmarie Nele. +CHUNK_CHARS = int(os.getenv("XTTS_CHUNK_CHARS", "60")) TRIM_THRESHOLD = int(os.getenv("XTTS_TRIM_THRESHOLD", "90")) TRIM_PADDING_MS = int(os.getenv("XTTS_TRIM_PADDING_MS", "18")) CROSSFADE_MS = int(os.getenv("XTTS_CROSSFADE_MS", "8"))