Stabilize XTTS sentence endings

This commit is contained in:
Mikei386
2026-09-04 09:30:04 +02:00
parent 8dac735680
commit 744a207e5a
2 changed files with 24 additions and 1 deletions
@@ -155,6 +155,16 @@ class LanguageSegmentationTests(unittest.TestCase):
self.assertEqual(len(segments), 1) self.assertEqual(len(segments), 1)
self.assertIn("dir zu helfen. Klingt das gut.", segments[0][1]) self.assertIn("dir zu helfen. Klingt das gut.", segments[0][1])
def test_xtts_receives_a_stable_terminal_stop_cue(self):
self.assertEqual(
gateway._stabilize_xtts_ending("Heute bleibt es trocken."),
"Heute bleibt es trocken;",
)
self.assertEqual(
gateway._stabilize_xtts_ending("Klingt das gut."),
"Klingt das gut;",
)
def test_normal_sentence_is_not_broken_into_word_sized_requests(self): def test_normal_sentence_is_not_broken_into_word_sized_requests(self):
text = ( text = (
"Die automatische Komprimierung ist in OpenClaw standardmäßig " "Die automatische Komprimierung ist in OpenClaw standardmäßig "
+14 -1
View File
@@ -419,10 +419,23 @@ def _speaker_conditioning() -> dict:
return SPEAKER_CONDITIONING return SPEAKER_CONDITIONING
def _stabilize_xtts_ending(text: str) -> str:
"""Give XTTS a reliable stop cue without changing the visible answer.
XTTS v2 can continue with invented syllables after a terminal full stop,
especially in German. A terminal semicolon is tokenized as a stronger,
more reliable boundary while retaining neutral sentence intonation.
"""
spoken = text.rstrip()
if spoken.endswith((".", "!", "?", ";", ":")):
spoken = spoken[:-1].rstrip()
return f"{spoken};"
def _xtts_pcm(text: str, language: str, conditioning: dict) -> bytes: def _xtts_pcm(text: str, language: str, conditioning: dict) -> bytes:
payload = { payload = {
**conditioning, **conditioning,
"text": text, "text": _stabilize_xtts_ending(text),
"language": language, "language": language,
"add_wav_header": True, "add_wav_header": True,
"stream_chunk_size": "20", "stream_chunk_size": "20",