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>
5 KiB
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-v3sur 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 -zsur storage-01 via SSH — soul + skills + RAG + mémoire long-terme - TTS : piper
fr_FR-upmc-medium
Installation
Dépendances système
sudo dnf install alsa-utils # AlmaLinux / Fedora
# ou : sudo apt install alsa-utils
Environnement Python
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
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 :
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 :
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
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 :
- Enregistre jusqu'à 1.5s de silence
- Whisper transcrit en français
- Si "hermes" apparaît dans les 5 premiers mots → envoyé à Hermes
- 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 :
watch -n2 'du -sh ~/.cache/huggingface/hub/'
large-v3 = ~3GB, small = ~250MB.
Port 4000 inaccessible : ouvrir un tunnel SSH temporaire :
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-voiceabsent (commandesystemctl statusretourne "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)