# 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 »)
stt --install-desktop  # ajoute STT au menu des applis → fenêtre dédiée (type Discord)
stt --window app       # ouvre le HUD en fenêtre app (sinon : kiosk plein écran)
stt --update           # met à jour depuis git (plus de désinstall/réinstall manuel)
```
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
```
