Funk-lab/admin/ia/hermes-voice.md
alkatrazz a3ba3089e2 feat(voice): améliorer hermes-voice + fix hermes-agent
hermes-voice :
- mode SSH : appel `hermes -z` via storage-01 (soul + skills + RAG + mémoire)
- mode litellm : fallback avec historique de session (10 échanges)
- Whisper large-v3 : meilleure reconnaissance FR (distil-large-v3 dérivait vers l'anglais)
- forcer français dans les requêtes SSH
- historique conversationnel + reset vocal ("oublie tout")

hermes-agent :
- fix boucle de redémarrage (510 restarts) : ajouter --replace à ExecStart

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 16:24:21 +02:00

4.7 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-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

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 :

  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 :

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).