Zonza previent quand le micro ne lui envoie rien

Loom tenait le micro : Zonza enregistrait dans le vide. La forme d'onde restait
plate et RIEN ne le signalait — on ne le decouvrait qu'apres avoir parle pour rien,
puis en cherchant pourquoi le halo se figeait.

Au bout de 1,8 s sans le moindre bloc audio, la bulle affiche « Aucun son — micro
pris ailleurs ? » et un son d'erreur previent. Le delai laisse le temps au flux
CoreAudio de s'ouvrir (quelques centaines de ms) sans laisser dicter une phrase
entiere pour rien.

Le garde `en_cours` evite le faux positif de la dictee tres courte : arreter avant
la fin du delai n'est pas une panne.

Verifie dans les deux sens : micro muet -> alerte, 0 bloc ; micro normal -> bulle
inchangee, 40 blocs. Pas de faux positif.

74 tests passent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 12:18:45 +02:00
co-authored by Claude Opus 5
parent 68e1f336c8
commit ebf3c8e749
3 changed files with 71 additions and 2 deletions
+13 -1
View File
@@ -21,7 +21,10 @@ CONFIG = {
"duree_max_overlay_s": 210.0,
# Garde COURTE, armee des l'arret : il ne reste alors que la transcription,
# qui se compte en secondes. 210 s a ce stade, c'est « fige » pour l'utilisateur.
"duree_max_transcription_s": 20.0, # sécurité : arrêt auto après 2 min (fenêtre jamais figée)
"duree_max_transcription_s": 20.0,
# Au bout de ce delai sans le moindre bloc audio, on previent : le micro est
# pris par une autre application (Loom, Zoom, OBS...). Sinon on dicte dans le vide.
"delai_detection_silence_s": 1.8, # sécurité : arrêt auto après 2 min (fenêtre jamais figée)
"sample_rate": 16000,
"fps": 30,
# --- overlay « barre de dictee » (bas de l'ecran) ---
@@ -132,6 +135,15 @@ def attendre(condition, delai_max_s, pas_s, dormir=None, horloge=None):
dormir(pas_s)
def entree_audio_muette(blocs_recus, en_cours):
"""Faut-il alerter : le micro n'envoie-t-il rien alors qu'on enregistre ?
`en_cours` evite un faux positif quand l'utilisateur a simplement arrete avant
la fin du delai — ce n'est pas une panne, juste une dictee courte.
"""
return bool(en_cours) and blocs_recus == 0
def bar_metrics(bar_height):
"""Mesures de l'overlay pour une hauteur de barre donnee, en points."""
if bar_height <= 0: