fix(voice): instrucțiune de limbă inline + fallback Supertonic pe română

Markerul opac [tts-lang:en] depindea de regula din VOICE_MODE.md, aflată
la ~30k caractere distanță în system prompt — modelul o rata pe ~1 din 5
turnuri. Răspunsul în română era apoi respins integral de pocket-tts
(English-only) și turnul rămânea fără audio.

- src/router.py: markerul poartă instrucțiunea inline (un singur token,
  acoperit în continuare de strip-ul anti-jailbreak); 5/5 EN la repro
- src/voice/tts_stream.py: dacă modelul tot scapă română pe o voce
  pockettts, blocul cade pe Supertonic (M2, ro) în loc de tăcere;
  coada TTS transportă (clause, voice, lang) per clauză
- tools/tts.py: looks_romanian public (folosit de tts_stream)
- personality/VOICE_MODE.md: regula gated pe prefixul [tts-lang:en
- tests: 4 teste noi fallback + expectații marker actualizate

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 19:20:28 +00:00
parent 61d667ec65
commit 80eb8034b3
6 changed files with 113 additions and 15 deletions

View File

@@ -449,7 +449,13 @@ class TestVoiceLangMarker:
from src.router import _voice_turn_lang_marker
mock_config_cls.return_value.get.return_value = "Marius 2"
assert _voice_turn_lang_marker() == "[tts-lang:en] "
marker = _voice_turn_lang_marker()
# Marker-ul poartă instrucțiunea inline, dar trebuie să rămână un
# singur token [tts-lang:...] (fără ] interior) ca să fie gated de
# VOICE_MODE.md și strip-uit de regex-ul anti-jailbreak.
assert marker.startswith("[tts-lang:en")
assert marker.endswith("] ")
assert "]" not in marker[1:-2]
mock_engine.assert_called_once_with("Marius 2")
@patch("tools.tts.engine_for_voice", return_value="supertonic")