Voix : Qwen gardé, nombres en lettres reconnus, Gemini plus court

Vu en production avec Qwen sur GPU : la plupart des phrases basculaient sur
Gemini puis Edge (voix différente d'un sous-titre à l'autre).
- Vérification de lecture : les nombres en lettres (« trente », « vingt-cinq
  pour cent ») et leur signe (« plus », « moins ») sont comparés comme les
  chiffres écrits par Whisper, au lieu de passer pour des mots sautés.
- Prises emballées (14 s pour 34 caractères) écartées d'office ; côté
  qwen-tts, max_new_tokens borne la durée à « caractères / 6 + 3 » s.
- Le moteur choisi est gardé tant qu'il lit au moins 70 % du texte
  (avec avertissement), au lieu de 85 % ; 3 tentatives Qwen.
- Gemini : délai d'attente 45 s au lieu de 120 s, erreurs journalisées en repr.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Upu97wMmsRkBoj6iVM4rH6
This commit is contained in:
Claude committed 2026-09-29 12:01:42 +00:00
1 parent 90a9b6be4d
commit 338546662f
7 files changed
+93 -17

No files matched your search

+15
View File
@@ -103,3 +103,18 @@ def test_cut_prefers_the_sentence_pause_over_a_comma():
# Borne estimée entre la virgule (1,3 s) et la fin de phrase (2,22 s)
cut = sentence_cut(env, previous_end=1.7, next_start=1.75)
assert 2.22 <= cut <= 2.67
def test_numbers_written_in_letters_are_not_missing_words():
expected = "Plus trente secondes chrono, le compteur s'affole : moins vingt-cinq pour cent !"
heard = _heard("+30 secondes chrono, le compteur s'affole : -25% !")
check = check_reading(expected, heard)
assert check.acceptable, check
assert check.missing == []
def test_skipped_word_next_to_a_number_in_letters_is_still_detected():
expected = "Trente secondes chrono, le compteur s'affole vraiment !"
heard = _heard("30 secondes, le compteur s'affole vraiment !")
check = check_reading(expected, heard)
assert "chrono" in check.missing
+9
View File
@@ -48,3 +48,12 @@ def test_qwen_target_prefers_app_settings(monkeypatch):
assert Target.resolve(None, None) == Target("http://qwen-tts:8001", "env-key")
monkeypatch.setattr(config, "QWEN_TTS_URL", "")
assert Target.resolve("", None) is None
def test_runaway_take_is_detected():
from app.tts import is_runaway
text = "Christelle fonce dans les rayons !" # 34 caractères
assert not is_runaway(3.0, text)
assert not is_runaway(6.5, text) # lecture lente, mais plausible
assert is_runaway(14.2, text) # vu en production : le modèle continue sans fin