Preserve sentence prosody in local TTS

This commit is contained in:
Mikei386
2026-09-04 08:11:05 +02:00
parent 5afdf46a7c
commit be8a654f1e
3 changed files with 67 additions and 29 deletions
@@ -130,7 +130,7 @@ class LanguageSegmentationTests(unittest.TestCase):
self.assertTrue(segments)
self.assertTrue(all(any(char.isalnum() for char in part) for _, part in segments))
def test_weather_summary_is_split_into_short_complete_chunks(self):
def test_weather_summary_is_split_into_complete_sentences(self):
text = (
"Heute in Rastatt: teils sonnig, trocken, 10 bis 22 Grad. "
"Abends wolkiger, 16 bis 21 Grad. Böen bis 29 km/h. "
@@ -138,12 +138,29 @@ class LanguageSegmentationTests(unittest.TestCase):
)
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.assertEqual(len(segments), 5)
self.assertTrue(all(len(part) <= gateway.CHUNK_CHARS
for _, part in segments))
self.assertIn("29 Kilometer pro Stunde", spoken)
self.assertIn("Kein Regen erwartet", spoken)
self.assertIn("wetteronline Punkt de", spoken)
def test_normal_sentence_is_not_broken_into_word_sized_requests(self):
text = (
"Die automatische Komprimierung ist in OpenClaw standardmäßig "
"aktiviert und lässt sich über die Konfigurationsdatei steuern."
)
self.assertEqual(gateway.prepare_segments(text), [("de", text)])
def test_overlong_sentence_prefers_clause_boundaries(self):
clause = "dieser natürlich gesprochene Teilsatz bleibt zusammen,"
text = " ".join([clause] * 12) + " und endet hier."
segments = gateway.prepare_segments(text)
self.assertGreater(len(segments), 1)
self.assertTrue(all(len(part) <= gateway.CHUNK_CHARS
for _, part in segments))
self.assertTrue(all(len(part.split()) > 4 for _, part in segments))
class FallbackTests(unittest.TestCase):
def setUp(self):