fix(voice): normalizare TTS lang-aware + cap 400 chars mutat per-request Supertonic
Două cauze pentru audio mut pe pocket-tts după fix-ul [tts-lang:en]:
1. normalize_for_tts expanda numerele/orele în cuvinte românești chiar și
în text englezesc ("It's 9:46 PM" → "nouă și patruzeci și șase de
minute") → diacritice → pocket-tts respingea clauzele. push_text rezolvă
acum lang din engine-ul vocii curente (engine_for_voice) și sare
expansiunile RO când lang != 'ro'. [scris de Echo în sesiunea Discord]
2. sanitize_for_supertonic (cap 400 chars — limită ONNX per request) rula
pe textul întreg în normalize, înainte de segmentarea în clauze —
răspunsurile lungi erau retezate mid-word și trunchierea la 200 cuvinte
cu sufixul "Restul l-am scris în chat" nu se mai aplica. Separat
map_tts_punctuation (fără cap, folosit de normalize) de
sanitize_for_supertonic (cap, aplicat în _synthesize_supertonic).
Include vocea clonată "Marius 4" (tts_voices.json + default în config).
Fixează test_truncate_exactly_200_words_unchanged și
test_truncate_over_200_words_appends_suffix.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
17
tools/tts.py
17
tools/tts.py
@@ -62,8 +62,14 @@ def _looks_romanian(text: str) -> bool:
|
||||
return any(ch in _RO_DIACRITICS for ch in text)
|
||||
|
||||
|
||||
def sanitize_for_supertonic(text: str) -> str:
|
||||
"""Replace Unicode punctuation and strip chars that crash Supertonic's ONNX model."""
|
||||
def map_tts_punctuation(text: str) -> str:
|
||||
"""Replace Unicode punctuation with ASCII and strip emoji — NO length cap.
|
||||
|
||||
Folosit și de pipeline-ul de normalizare voice (src/voice/normalize.py),
|
||||
care rulează pe textul întreg ÎNAINTE de segmentarea în clauze — un cap de
|
||||
lungime aici ar reteza răspunsurile lungi în mijlocul cuvântului și ar
|
||||
face moartă trunchierea la 200 de cuvinte din normalize_for_tts.
|
||||
"""
|
||||
for src, dst in _TTS_PUNCT_MAP.items():
|
||||
text = text.replace(src, dst)
|
||||
# Strip emoji and high-codepoint chars (keep ASCII printable + Latin/Romanian diacritice)
|
||||
@@ -74,7 +80,12 @@ def sanitize_for_supertonic(text: str) -> str:
|
||||
cleaned.append(ch)
|
||||
else:
|
||||
cleaned.append(' ')
|
||||
text = ' '.join(''.join(cleaned).split())
|
||||
return ' '.join(''.join(cleaned).split())
|
||||
|
||||
|
||||
def sanitize_for_supertonic(text: str) -> str:
|
||||
"""map_tts_punctuation + hard cap la limita ONNX Supertonic (per request)."""
|
||||
text = map_tts_punctuation(text)
|
||||
if len(text) > _MAX_TTS_CHARS:
|
||||
text = text[:_MAX_TTS_CHARS]
|
||||
return text
|
||||
|
||||
Reference in New Issue
Block a user