zonza/README.md
Ralph Mayola 22080eb997 Zonza : dictée vocale locale macOS (MLX-Whisper + cercle pulsant)
Reconstruction propre de l'ancien projet Dictée. Bundle id neuf
(cloud.mrtechlab.zonza), chemin de build unique vers /Applications
(plus jamais de builds /tmp enregistrés dans LaunchServices).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 23:57:59 +02:00

80 lines
3.0 KiB
Markdown

# 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
```bash
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)
```bash
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
```bash
.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](LICENSE).