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>
|
||
|---|---|---|
| assets | ||
| launcher | ||
| tests | ||
| .gitignore | ||
| app.py | ||
| audio_level.py | ||
| build_app.sh | ||
| conftest.py | ||
| controller.py | ||
| core.py | ||
| engine.py | ||
| LICENSE | ||
| pulse_window.py | ||
| README.md | ||
| requirements.txt | ||
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+Vsimulé). Si non accordée, le texte reste dans le presse-papier : faisCmd+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.