# STT — Assistant vocal "Jarvis" de Funk Assistant vocal type *Jarvis* pour le homelab Funk, en **architecture client-serveur** : - **`server/`** — STT-server : orchestrateur AI **dans le cluster k8s**. Reçoit les requêtes des clients et route l'inférence vers LiteLLM (Qwen3 / Claude). Mémoire centralisée (futur). - **`client/`** — commande `stt` installable sur le poste : capture micro, STT (Whisper), TTS (Piper), **HUD graphique**. Envoie le texte au serveur (URL paramétrable). > 📐 Conception complète : `admin/ia/stt.md`. ``` LAN / *.lab.local ┌─ POSTE ──────────┐ ┌─ CLUSTER k8s (ns ai) ──────────────┐ │ client `stt` │ HTTP │ STT-server (Deployment) │ │ • micro + Whisper│ ─────▶ │ POST /v1/ask → LiteLLM │ │ • Piper (TTS) │ ◀───── │ (→ s01 192.168.10.1:4000) │ │ • HUD web │ reply │ Ingress: stt.lab.local │ └───────────────────┘ └──────────────┬──────────────────────┘ ▼ LiteLLM :4000 (s01) → Qwen3 (g01) / Claude ``` ## Client — installation (poste) ```bash pipx install "git+ssh://git@github.com/Alkatrazz24/Funk-lab.git@#subdirectory=stt/client" stt --setup # génère ~/.config/stt/stt.toml (dont [server] url) stt --text # chat texte simple (sans micro ni HUD) — idéal pour tester stt # voix + HUD ; dis "Ok Hermès …" stt --model claude # choisir le modèle : hermes (défaut) | claude | qwen | opus ``` En mode texte : commandes `/model `, `/models`, `/quit`. Prérequis voix : micro, Piper + voix dans `~/.local/share/piper/`, `aplay` (alsa-utils). ## Serveur — déploiement (cluster) 1. **Image** : le workflow `.github/workflows/build-stt-server.yml` (push touchant `stt/server/`) build l'image taguée **`sha-`** et, sur `main`, **met à jour le manifest** avec ce tag (commit `ci(stt): image → …`). Plus de `:latest` ni de `rollout restart` manuel. 2. **ArgoCD** : `k8s/apps-of-apps/apps/stt.yaml` → déploie `k8s/apps/stt/` **depuis `main`**. Le bump du tag par la CI suffit à déclencher un nouveau pod (déploiement déterministe). 3. Le serveur joint LiteLLM (s01, hors cluster) en **IP directe** `192.168.10.1:4000` (même pattern qu'open-webui — pas de Service/Endpoints intermédiaire). 4. **Image privée** : le Deployment référence un `imagePullSecret` `ghcr-pull`. À créer une fois dans le ns `ai` (même pratique que `ghostfolio-secret`, non versionné) : ```bash kubectl create secret docker-registry ghcr-pull \ --docker-server=ghcr.io \ --docker-username=Alkatrazz24 \ --docker-password= \ -n ai ``` ## Structure ``` stt/ ├── client/ # commande `stt` (pipx) — voix + HUD │ ├── pyproject.toml │ ├── config/ # stt.example.toml + thèmes/avatars/voix │ └── stt/ # cli, config, voice/, api.py (→ serveur), ui/ (HUD), hud/ └── server/ # STT-server (conteneur) — API + orchestration AI ├── pyproject.toml ├── Dockerfile ├── memory/ # mémoire distillée GitHub (futur, server-side) └── stt_server/ # app.py (FastAPI), brain.py (→ LiteLLM), config.py ```