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>
80 lines
3.0 KiB
Markdown
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).
|