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> |
||
|---|---|---|
| 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.