Le diagnostic eprouve le micro au debit reel de l'application

16000 etait code en dur dans trois endroits de diagnostic.py alors que
CONFIG["sample_rate"] existe. La valeur coincide aujourd'hui, donc rien ne
cassait — mais si ce reglage changeait, le diagnostic aurait teste le micro et la
synthese a un debit different de celui du pipeline reel, et aurait cesse
SILENCIEUSEMENT d'etre representatif. Un diagnostic qui ne mesure pas ce qu'on
croit est pire qu'aucun diagnostic.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ralph Mayola 2026-08-23 19:32:08 +02:00
parent 205424f68a
commit 3e269dfb5e

View File

@ -91,13 +91,19 @@ def epreuve_moteur(detecter_moteur=None, resoudre_modele=None, creer_transcripte
# --- épreuve 3 : micro -------------------------------------------------------
def epreuve_micro(ouvrir_flux=None, sample_rate=16000, duree_s=1.0, dormir=None):
def epreuve_micro(ouvrir_flux=None, sample_rate=None, duree_s=1.0, dormir=None):
"""Ouvre VRAIMENT le micro pendant `duree_s` et compte les blocs reçus.
`ouvrir_flux` suit le même contrat que `Recorder._ouvrir_flux` dans
`capture.py` : injectable, pour que les tests ne touchent à aucun
périphérique réel.
Le débit vient de CONFIG et n'est pas codé en dur : le diagnostic doit
éprouver le micro AU DÉBIT QUE L'APPLICATION UTILISE VRAIMENT, sinon il
cesserait silencieusement d'être représentatif si ce réglage changeait.
"""
from core import CONFIG
sample_rate = sample_rate or CONFIG["sample_rate"]
dormir = dormir or time.sleep
if ouvrir_flux is None:
try:
@ -133,7 +139,7 @@ def epreuve_micro(ouvrir_flux=None, sample_rate=16000, duree_s=1.0, dormir=None)
# --- épreuve 4 : transcription -----------------------------------------------
def _generer_echantillon_parole(texte="Bonjour, ceci est un test de dictée Zonza.",
sample_rate=16000):
sample_rate=None):
"""Synthétise un court échantillon de parole via la commande `say` de macOS.
LÈVE si `say` est absent, échoue, ou si le WAV produit est illisible
@ -141,6 +147,8 @@ def _generer_echantillon_parole(texte="Bonjour, ceci est un test de dictée Zonz
d'inventer un résultat. Sur une machine sans `say` (Windows, Linux),
c'est TOUJOURS ce chemin qui est emprunté.
"""
from core import CONFIG
sample_rate = sample_rate or CONFIG["sample_rate"]
if shutil.which("say") is None:
raise RuntimeError("commande `say` absente (probablement pas macOS)")
chemin = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name
@ -168,7 +176,8 @@ def epreuve_transcription(transcripteur, generer_parole=None, horloge=None):
audio = generer_parole()
source = "parole synthétisée"
except Exception as e:
audio = np.zeros(16000, dtype="float32")
from core import CONFIG
audio = np.zeros(CONFIG["sample_rate"], dtype="float32") # une seconde
source = f"silence (synthèse vocale indisponible : {e})"
debut = horloge()
try: