app.py passait CONFIG["model"] — un depot MLX — quel que soit le moteur detecte. Sur une machine sans Apple Silicon, faster-whisper aurait recu un depot qu'il ne sait pas charger. Le defaut etait invisible ici, la detection rendant toujours "mlx" sur ce Mac : aucun test ne pouvait le voir. MODELES_PAR_MOTEUR associe chaque moteur a son depot. Les valeurs viennent de la mesure du jour (trois echantillons, amorce active, CPU Apple Silicon) : faster-whisper base 0,52 s 10/13 termes techniques 142 Mo faster-whisper small 1,42 s 11/13 464 Mo faster-whisper medium 4,40 s 13/13 1460 Mo MLX medium (GPU) 0,75 s 11/13 489 Mo Le GPU vise donc la precision (medium, 13/13, il absorbe le cout) ; le CPU vise la latence (small, 11/13 — AUTANT que le MLX utilise aujourd'hui — pour 1,4 s). `medium` sur CPU serait plus juste, mais ces 4,4 s sont celles d'un CPU Apple Silicon : sur un CPU Intel ou Windows, le meme modele peut demander trois a quatre fois plus. La commande de diagnostic mesurera la machine reelle et pourra promouvoir `medium`. CONFIG["model"] passe a None et devient un FORCAGE manuel qui prime sur la table, au lieu d'un reglage mort qu'on modifie sans effet. 115 tests. Comportement inchange sur ce Mac : moteur mlx, modele identique. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| assets | ||
| docs/superpowers | ||
| interface | ||
| launcher | ||
| moteur | ||
| systeme | ||
| tests | ||
| .gitignore | ||
| app.py | ||
| audio_level.py | ||
| build_app.sh | ||
| capture.py | ||
| conftest.py | ||
| contrats.py | ||
| controller.py | ||
| core.py | ||
| LICENSE | ||
| 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.