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:
parent
205424f68a
commit
3e269dfb5e
@ -91,13 +91,19 @@ def epreuve_moteur(detecter_moteur=None, resoudre_modele=None, creer_transcripte
|
|||||||
|
|
||||||
# --- épreuve 3 : micro -------------------------------------------------------
|
# --- é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.
|
"""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
|
`ouvrir_flux` suit le même contrat que `Recorder._ouvrir_flux` dans
|
||||||
`capture.py` : injectable, pour que les tests ne touchent à aucun
|
`capture.py` : injectable, pour que les tests ne touchent à aucun
|
||||||
périphérique réel.
|
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
|
dormir = dormir or time.sleep
|
||||||
if ouvrir_flux is None:
|
if ouvrir_flux is None:
|
||||||
try:
|
try:
|
||||||
@ -133,7 +139,7 @@ def epreuve_micro(ouvrir_flux=None, sample_rate=16000, duree_s=1.0, dormir=None)
|
|||||||
# --- épreuve 4 : transcription -----------------------------------------------
|
# --- épreuve 4 : transcription -----------------------------------------------
|
||||||
|
|
||||||
def _generer_echantillon_parole(texte="Bonjour, ceci est un test de dictée Zonza.",
|
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.
|
"""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 —
|
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),
|
d'inventer un résultat. Sur une machine sans `say` (Windows, Linux),
|
||||||
c'est TOUJOURS ce chemin qui est emprunté.
|
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:
|
if shutil.which("say") is None:
|
||||||
raise RuntimeError("commande `say` absente (probablement pas macOS)")
|
raise RuntimeError("commande `say` absente (probablement pas macOS)")
|
||||||
chemin = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name
|
chemin = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name
|
||||||
@ -168,7 +176,8 @@ def epreuve_transcription(transcripteur, generer_parole=None, horloge=None):
|
|||||||
audio = generer_parole()
|
audio = generer_parole()
|
||||||
source = "parole synthétisée"
|
source = "parole synthétisée"
|
||||||
except Exception as 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})"
|
source = f"silence (synthèse vocale indisponible : {e})"
|
||||||
debut = horloge()
|
debut = horloge()
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user