mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 16:24:43 +02:00
Ajout d'une section '## État vérifié' à chaque doc admin/ basée sur l'inspection read-only du cluster (systemctl, kubectl, nft, etc.). Aucune modification de service ni réécriture de documentation existante. Co-Authored-By: Hermes <hermes@funk.lab>
153 lines
No EOL
5 KiB
Markdown
153 lines
No EOL
5 KiB
Markdown
# 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`).
|
|
|
|
|
|
---
|
|
|
|
## État vérifié — 2026-06-05
|
|
- Service `hermes-voice` absent (commande `systemctl status` retourne "service absent")
|
|
- Aucune divergence notable détectée entre la documentation et l'état réel
|
|
- Aucun élément opérationnel critique observé (pods, exports NFS, configurations) |