L'overlay devient une barre de dictee au lieu d'un cercle

Reprend le design demande par Ralph, d'apres une capture : barre sombre
arrondie posee en bas de l'ecran, et dedans, de gauche a droite, un bouton stop
rond rouge-orange a carre blanc, une forme d'onde en barres verticales dont la
traine retombe en pointilles, une icone de micro. Au-dessus, une bulle sombre a
pointe.

La forme d'onde demandait un HISTORIQUE de niveaux, la ou l'ancien cercle ne
lisait que le niveau courant : push_level et bar_heights sont ajoutes a
audio_level.py comme unites pures (le plus recent a gauche, les positions vides
ou silencieuses retombent sur un plancher — c'est lui qui donne les pointilles).

La bulle ne peut pas afficher le texte en direct comme la reference : Zonza
transcrit APRES l'arret, il n'y a pas de flux continu. Elle porte donc l'etape
en cours, et la fenetre reste affichee jusqu'au collage au lieu de disparaitre
pendant les secondes de calcul — l'ecran ne se vide plus sans explication.

Rendu verifie par capture d'ecran, pas seulement par les tests : le micro a ete
redessine apres coup (il sortait en tache blanche) et une marge basse ajoutee,
l'arrondi de la barre etant rogne par le bord de la fenetre.

45 tests passent. Le cdhash du stub est inchange, donc les autorisations
d'Accessibilite survivent a cette mise a jour (verifie : accordee = True).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 00:46:56 +02:00
co-authored by Claude Opus 5
parent f1cff4239d
commit 55c860c5b9
7 changed files with 327 additions and 86 deletions
+6 -1
View File
@@ -57,6 +57,7 @@ class ZonzaController:
self.recorder.start()
self.recording = True
self.pulse.show()
self.pulse.set_status("Je vous écoute…")
play_sound("start")
self.on_state("recording")
self._arm_safety_timer()
@@ -93,11 +94,14 @@ class ZonzaController:
self._cancel_safety_timer()
try:
audio = self.recorder.stop()
self.pulse.hide()
play_sound("done")
if not is_long_enough(len(audio), self.config["sample_rate"], self.config["min_duration_s"]):
self.pulse.hide()
self.on_state("idle")
return
# la fenetre reste affichee : la bulle porte l'etape en cours, sinon
# l'ecran se vide pendant les secondes de calcul et on croit a un plantage.
self.pulse.set_status("Transcription…")
self.on_state("transcribing")
threading.Thread(target=self._transcribe_and_inject, args=(audio,), daemon=True).start()
except Exception as e:
@@ -122,4 +126,5 @@ class ZonzaController:
print(f"[erreur] transcription : {e}")
play_sound("error")
finally:
self.run_on_main(self.pulse.hide)
self.on_state("idle")