zonza/tests/test_modele_par_moteur.py
Ralph Mayola 2ccb614649 A chaque moteur son modele, et un forcage manuel
app.py passait CONFIG["model"] — un depot MLX — quel que soit le moteur detecte.
Sur une machine sans Apple Silicon, faster-whisper aurait recu un depot qu'il ne
sait pas charger. Le defaut etait invisible ici, la detection rendant toujours
"mlx" sur ce Mac : aucun test ne pouvait le voir.

MODELES_PAR_MOTEUR associe chaque moteur a son depot. Les valeurs viennent de la
mesure du jour (trois echantillons, amorce active, CPU Apple Silicon) :

  faster-whisper base   0,52 s  10/13 termes techniques   142 Mo
  faster-whisper small  1,42 s  11/13                     464 Mo
  faster-whisper medium 4,40 s  13/13                    1460 Mo
  MLX medium (GPU)      0,75 s  11/13                     489 Mo

Le GPU vise donc la precision (medium, 13/13, il absorbe le cout) ; le CPU vise
la latence (small, 11/13 — AUTANT que le MLX utilise aujourd'hui — pour 1,4 s).
`medium` sur CPU serait plus juste, mais ces 4,4 s sont celles d'un CPU Apple
Silicon : sur un CPU Intel ou Windows, le meme modele peut demander trois a quatre
fois plus. La commande de diagnostic mesurera la machine reelle et pourra
promouvoir `medium`.

CONFIG["model"] passe a None et devient un FORCAGE manuel qui prime sur la table,
au lieu d'un reglage mort qu'on modifie sans effet.

115 tests. Comportement inchange sur ce Mac : moteur mlx, modele identique.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:45:14 +02:00

53 lines
1.8 KiB
Python

"""À chaque moteur son modèle.
`app.py` passait `CONFIG["model"]` — un dépôt MLX — quel que soit le moteur détecté.
Sur une machine sans Apple Silicon, `faster-whisper` aurait reçu un dépôt qu'il ne
sait pas charger. Le défaut était invisible ici, puisque la détection rend toujours
`mlx` sur ce Mac.
"""
import pytest
from core import MODELES_PAR_MOTEUR, modele_pour_moteur
def test_chaque_moteur_connu_a_son_modele():
for nom in ("mlx", "faster-cpu", "faster-gpu"):
assert modele_pour_moteur(nom)
def test_mlx_garde_le_modele_d_aujourd_hui():
assert modele_pour_moteur("mlx") == "mlx-community/whisper-medium"
def test_les_moteurs_faster_ne_recoivent_jamais_un_depot_mlx():
for nom in ("faster-cpu", "faster-gpu"):
assert "mlx" not in modele_pour_moteur(nom).lower()
def test_le_gpu_vise_la_precision_le_cpu_la_latence():
# mesuré le 2026-08-23 : medium = 13/13 termes mais 4,4 s sur CPU ; small = 11/13 en 1,4 s
assert "medium" in modele_pour_moteur("faster-gpu")
assert "small" in modele_pour_moteur("faster-cpu")
def test_un_moteur_inconnu_est_refuse_clairement():
with pytest.raises(KeyError) as e:
modele_pour_moteur("vosk")
assert "vosk" in str(e.value)
def test_la_table_ne_contient_que_les_moteurs_reconnus():
assert set(MODELES_PAR_MOTEUR) == {"mlx", "faster-cpu", "faster-gpu"}
def test_le_reglage_manuel_prime_sur_la_table():
from core import modele_retenu
assert modele_retenu("faster-cpu", forcage=None) == modele_pour_moteur("faster-cpu")
assert modele_retenu("faster-cpu", forcage="Systran/faster-whisper-medium") \
== "Systran/faster-whisper-medium"
def test_un_forcage_vide_est_ignore():
from core import modele_retenu
assert modele_retenu("mlx", forcage="") == modele_pour_moteur("mlx")