rmayolaandClaude Opus 5 58ed0d9e6c Attend le relachement des touches avant de coller
Deux dictees ont ete transcrites correctement puis n'ont jamais atteint la zone de
saisie, sans la moindre erreur : inject_text avait bien envoye ses touches. Cause :
la hotkey Cmd+Ctrl+D etait encore enfoncee quand Zonza a simule Cmd+V. Le systeme a
recu Cmd+Ctrl+V, que l'application cible ignore. Le code croyait avoir reussi.

inject_text patiente donc jusqu'a ce qu'aucun modificateur physique ne soit enfonce
(drapeaux Quartz), au plus 2 s. Au-dela, il colle quand meme : mieux vaut un collage
douteux qu'une transcription perdue. Le delai du presse-papier passe de 0,05 a 0,12 s,
0,05 etant juste.

Et surtout, le collage se TRACE desormais ("[collage] ok" ou l'avertissement) : sans
cela, un echec futur resterait invisible dans le log, comme celui-ci l'a ete.

L'attente est une unite pure et bornee (core.attendre, horloge et sommeil injectables).
Detecteur verifie en conditions reelles : False au repos, retour immediat.

55 tests passent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 01:42:44 +02:00

Zonza 🎙️

Dictée vocale 100% locale pour macOS (Apple Silicon). Appuie sur un raccourci, un cercle pulse au rythme de ta voix, et ton texte est transcrit puis collé dans l'app active. Inspiré de Superwhisper — open source, hors-ligne, rien ne quitte ta machine.

  • Transcription locale : MLX-Whisper medium (français), aucun envoi réseau.
  • Cercle pulsant : une fenêtre flottante visualise tes intonations en temps réel.
  • Barre de menu : l'app vit dans la barre de menu macOS (jamais dans le Dock).
  • Toggle Cmd+Ctrl+D : démarre / arrête la dictée.

Installation

git clone ssh://git@git.mrtechlab.cloud:2222/rmayola/zonza.git
cd zonza
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
./build_app.sh        # installe /Applications/Zonza.app (lanceur lié à ce dépôt)

Zonza.app est un lanceur léger : il exécute le code via le venv du dépôt (MLX y tourne nativement, là où py2app/PyInstaller échouent sur les shaders Metal). Ne supprime donc ni le dossier du dépôt ni .venv. C'est aussi l'unique chemin de build — on ne construit jamais dans /tmp ni dans le dépôt, pour ne laisser aucune entrée fantôme dans LaunchServices (cause historique d'icônes en double).

Au tout premier lancement, l'app télécharge le modèle Whisper (~512 Mo, une seule fois).

Permissions macOS

Réglages Système → Confidentialité et sécurité :

  • Microphone — popup automatique au 1er enregistrement.
  • Surveillance de l'entrée / Accessibilité — pour la hotkey globale et le collage (Cmd+V simulé). Si non accordée, le texte reste dans le presse-papier : fais Cmd+V à la main.

Usage

  • L'icône 🎙️ apparaît dans la barre de menu (🔴 enregistrement, ⏳ transcription).
  • Cmd+Ctrl+D : le cercle apparaît, parle.
  • Cmd+Ctrl+D : transcription + collage dans l'app active.
  • Menu : activer/désactiver les sons, quitter.
  • Sécurité : arrêt automatique après 2 minutes d'enregistrement.

Lancer depuis les sources (développement)

source .venv/bin/activate
python3 app.py

Configuration

Édite CONFIG dans core.py : model, language, hotkey, sounds, min_duration_s, max_duration_s, fps, circle_base_radius, circle_amplitude, circle_color_rgb, level_gain, level_attack, level_release, wave_rings, wave_speed.

Tests

.venv/bin/python -m pytest tests/ -v

Architecture

  • core.py — config + utilitaires purs (seuil durée, nettoyage texte).
  • audio_level.py — niveau RMS du micro (alimente l'animation).
  • engine.py — capture, transcription MLX-Whisper, collage, sons.
  • pulse_window.py — fenêtre Cocoa + cercle pulsant + anneaux d'onde.
  • controller.py — machine à états, branche audio → animation → transcription.
  • app.py — app de barre de menu (point d'entrée).

L'icône de l'app est générée par script : python assets/make_icon.py && ./assets/make_icns.sh.

Licence

MIT — voir LICENSE.

S
Description
Dictée vocale 100% locale pour macOS (MLX-Whisper + cercle pulsant)
Readme MIT
248 KiB
Languages
Python 93.1%
Shell 4.1%
PowerShell 1.4%
C 1.4%