Funk-lab/stt/README.md
Claude d1bf20c86d
feat(stt): auto-start via stt --install-service (phase 6)
Ajoute `stt --install-service` / `--uninstall-service` : génère et active un
service systemd --user (lié à graphical-session.target) qui lance le HUD + voix
à l'ouverture de session. Le kiosk existant (ui.kiosk) fournit l'« écran Jarvis ».

- cli : _service_unit (génération du unit, fonction pure testable),
  _cmd_install_service (écrit le unit + import-environment DISPLAY/WAYLAND +
  daemon-reload/enable/start), _cmd_uninstall_service.
- Docs : admin/ia/stt.md (phase 6 → , section Auto-start + caveat DISPLAY),
  stt/README.
- Bump client 0.2.1 → 0.3.0.

Phase 6 de la roadmap STT. Reste : test sur poste, outils Hermes (7).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa
2026-06-18 20:18:39 +00:00

70 lines
3.7 KiB
Markdown

# 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@<branche>#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
stt --install-service # auto-start au login (systemd --user, kiosk « écran Jarvis »)
```
En mode texte : commandes `/model <nom>`, `/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-<commit>`** 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=<PAT_ghcr_read:packages> \
-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
```