# Hermes Voice Client Client vocal local pour interagir avec Hermes depuis le poste perso. ## Architecture ``` Micro → VAD (énergie) → Whisper large-v3 (STT) → hermes -z via SSH → piper TTS → Haut-parleur ``` - **STT** : Whisper `large-v3` sur CPU (9950X3D) — ~2-3s, excellent en français - **Détection** : mot-clé "hermes" détecté dans la transcription (pas de wake word model) - **Backend** : `hermes --profile funk-ai -z` sur storage-01 via SSH — soul + skills + RAG + mémoire long-terme - **TTS** : piper `fr_FR-upmc-medium` ## Installation ### Dépendances système ```bash sudo dnf install alsa-utils # AlmaLinux / Fedora # ou : sudo apt install alsa-utils ``` ### Environnement Python ```bash cd tools/hermes-voice/ python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt # Whisper large-v3 (~3GB) téléchargé automatiquement au premier lancement ``` ### Piper TTS ```bash mkdir -p ~/.local/share/piper-runtime ~/.local/share/piper # Binaire piper — télécharger depuis https://github.com/rhasspy/piper/releases # ex : piper_linux_x86_64.tar.gz tar xf piper_linux_x86_64.tar.gz -C /tmp cp -r /tmp/piper/* ~/.local/share/piper-runtime/ # Voix française wget -O ~/.local/share/piper/fr_FR-upmc-medium.onnx \ "https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx" wget -O ~/.local/share/piper/fr_FR-upmc-medium.onnx.json \ "https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx.json" ``` Test piper : ```bash echo "Bonjour, je suis Hermes." | \ LD_LIBRARY_PATH=~/.local/share/piper-runtime \ ~/.local/share/piper-runtime/piper \ --model ~/.local/share/piper/fr_FR-upmc-medium.onnx \ --output_file /tmp/test.wav && aplay /tmp/test.wav ``` ### Accès réseau Port 4000 (LiteLLM) ouvert depuis `192.168.1.0/24` dans nftables depuis le 2026-06-02. Vérification : ```bash curl -s http://192.168.1.200:4000/v1/models -H "Authorization: Bearer lm-studio" ``` SSH vers storage-01 doit fonctionner sans mot de passe (clé dans `~/.ssh/config`, alias `s01`). ## Utilisation ```bash cd tools/hermes-voice/ source .venv/bin/activate # Mode VAD — parler naturellement, commencer par "Hermes, ..." python hermes-voice.py # Mode push-to-talk — Entrée pour démarrer/terminer (plus simple) python hermes-voice.py --ptt # Sans TTS — réponses texte uniquement (debug réseau/Hermes) python hermes-voice.py --ptt --no-tts ``` ## Modes de fonctionnement ### Mode VAD (défaut) Écoute continue. Quand de l'énergie vocale est détectée : 1. Enregistre jusqu'à 1.5s de silence 2. Whisper transcrit en français 3. Si "hermes" apparaît dans les 5 premiers mots → envoyé à Hermes 4. Sinon → ignoré Exemple : *"Hermes, quel est l'état du cluster ?"* ### Mode SSH (HERMES_MODE = "ssh", défaut) La requête passe par `hermes --profile funk-ai -z` sur storage-01. Hermes a accès à : - Son **soul** (`funk-ai`) — connaissance complète du homelab - Ses **skills** — agent-delegation, RAG docs - Sa **mémoire long-terme** (`/srv/data/hermes/profiles/funk-ai/memories/`) ### Mode LiteLLM (HERMES_MODE = "litellm") Appel direct LiteLLM :4000, historique de session conservé en RAM (10 échanges). Pas de soul ni de mémoire persistante — utile si SSH trop lent ou Hermes indisponible. ## Configuration (`hermes-voice.py`) | Variable | Défaut | Description | |---|---|---| | `LITELLM_URL` | `http://192.168.1.200:4000/...` | Endpoint LiteLLM | | `HERMES_MODE` | `ssh` | `ssh` = vrai Hermes / `litellm` = LLM direct | | `HERMES_SSH` | `s01` | Alias SSH storage-01 | | `WHISPER_SIZE` | `large-v3` | Modèle Whisper (large-v3 recommandé pour le FR) | | `VOICE_THRESH` | `0.012` | Seuil RMS détection voix (augmenter si bruit ambiant) | | `SILENCE_SEC` | `1.5` | Délai silence pour terminer l'enregistrement | | `KEYWORD` | `hermes` | Mot-clé déclencheur (mode VAD) | | `PIPER_VOICE` | `~/.local/share/piper/fr_FR-upmc-medium.onnx` | Voix TTS | ## Dépannage **Whisper transcrit en anglais** : utiliser `large-v3` (pas `distil-large-v3` qui dérive vers l'anglais). **Modèle bloqué au chargement** : il télécharge depuis HuggingFace. Surveiller : ```bash watch -n2 'du -sh ~/.cache/huggingface/hub/' ``` `large-v3` = ~3GB, `small` = ~250MB. **Port 4000 inaccessible** : ouvrir un tunnel SSH temporaire : ```bash ssh -L 4000:localhost:4000 s01 # puis changer LITELLM_URL → http://localhost:4000/... ``` **libpiper_phonemize.so introuvable** : tous les fichiers piper doivent être dans `~/.local/share/piper-runtime/` (le script gère `LD_LIBRARY_PATH` automatiquement). **Hermes via SSH lent** : basculer `HERMES_MODE = "litellm"` pour bypasser SSH. **Faux positifs VAD** : augmenter `VOICE_THRESH` (ex: `0.02`).