fix(voice): răspuns în engleză pe voice turns când vocea activă e pocket-tts

Instrucțiunea „engleză pentru audio" nu ajungea la model: VOICE_MODE.md nu
avea nicio regulă de limbă, iar condiția din TOOLS.md („când generez pentru
o voce pockettts") era neevaluabilă — modelul nu știa ce voce e activă.
Rezultat: mirroring pe română → filtrul de diacritice bloca sinteza → tăcere.

- tools/tts.py: helper public engine_for_voice() (catalog → tts.default_engine)
- src/router.py: injectează [tts-lang:en] în prefixul voice când vocea activă
  e pockettts (config citit fresh — vede swap-ul live /voice setvoice);
  anti-jailbreak strip extins la [tts-lang:...]
- personality/VOICE_MODE.md: regulă de limbă gated pe marker
- tests/test_router.py: 5 teste noi pentru marker + strip

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 18:07:14 +00:00
parent 321bd49ce6
commit 00e0d1ad8c
5 changed files with 114 additions and 7 deletions

View File

@@ -94,6 +94,16 @@ def _catalog_entry(voice: str) -> dict | None:
return catalog.get(voice) or catalog.get(voice.upper())
def engine_for_voice(voice: str) -> str:
"""Engine-ul rezolvat pentru o voce: catalog → fallback `tts.default_engine`.
Aceeași regulă de rutare ca `synthesize()` — folosită de router ca să știe
dinainte dacă răspunsul va fi sintetizat de un engine English-only.
"""
entry = _catalog_entry(voice) or {}
return entry.get("engine") or _config_get("tts.default_engine", DEFAULT_ENGINE)
def list_voice_names(engine: str | None = None) -> list[str]:
"""Nume de voci din tts_voices.json, opțional filtrate pe `engine`.