From 3e269dfb5e1da1a219021c3c0e39797894d457e1 Mon Sep 17 00:00:00 2001 From: Ralph Mayola Date: Sun, 23 Aug 2026 19:32:08 +0200 Subject: [PATCH] Le diagnostic eprouve le micro au debit reel de l'application MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- diagnostic.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/diagnostic.py b/diagnostic.py index 17812d1..dd12467 100644 --- a/diagnostic.py +++ b/diagnostic.py @@ -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: