# Raphael — Lucy als innere Stimme (Richtungs-Entscheid 04.09.2026) _User-Entscheid 04.09.2026 („leg los"), nach fünf Wochen Lucy-Stillstand und einer Recherche zum Stand der Sprach-Bausteine. Ergänzt [ZIELBILD.md](ZIELBILD.md) Punkt 2 (Lucy lebt weiter) um die Gestalt, in der sie weiterlebt. Namensgeber: die „Große Weise"/Raphael aus Tensura — eine ruhige, präzise Stimme im Kopf, die meldet, wenn es etwas zu melden gibt, und sonst schweigt._ ## Der Entscheid in einem Satz **Lucy hat keinen Körper mehr.** Kein VRM-Avatar, kein Loft, kein Overlay, keine Mimik, keine Dazwischenrufe. Sie ist ein dünner Sprach-Client für das Hirn, das es schon gibt — am PC als kleines HUD, unterwegs über Telegram — und spricht überall mit **derselben Stimme**. ## Warum das die stabilste Lucy ist - **Ein Hirn, ein Gedächtnis, alle Türen.** Hermes (v0.20.4, `:8642`) ist die alleinige Gedächtnis-Wahrheit (VERDIKTE.md). PC-Lucy und Telegram-Lucy sind dieselbe Person — genau das zerschnitte ein zweites Hirn auf dem PC. Darum bewusst **kein lokales LLM auf der 9070 XT**. - **Die Box-Seite ist fertig und gemessen.** Parakeet TDT v3 + Smart Turn v3 im Voice-Sidecar, Qwen3.6-35B-A3B mit ~95 t/s. Nichts zu bauen. - **Die Stimme war schon auf der Box.** `lucy-stimme.service` (`~/.lucy-stimme`, `:8021`, pocket-tts `german_24l`, Klon aus `ref.mp3`) spricht seit 21.08. die Telegram-Sprachnachrichten. Der PC hängt sich jetzt dort an — der lokale pocket_server am PC (Waisen-Falle, ~1,9 GB/Worker) ist nur noch umschaltbarer Rückfall. - **Der Avatar war die Hauptquelle an Arbeit, nicht an Nutzen.** Der Großteil der Juli-Commits ging in Loft-Videos, Holo-Schalter, Kamera, Gesten. Die Sprachschleife war seit 16.07. stabil und bleibt 1:1 erhalten (Barge-in v2, Echo-Wächter, Satz-Pipeline, Draft-STT, Meldungen). - **Ohne Klick-Durchlass-Overlay fällt auch der Electron-Zwang** (VERDIKT „Electron, nicht Tauri" hing daran). Electron bleibt trotzdem, weil VAD/AEC/Ducking dort erprobt sind — Tauri ist damit Option, nicht Pflicht. ## Was gebaut wurde (04.09.2026) **Lucy-Repo, Branch `feature/raphael-innere-stimme`**: - Renderer auf HUD eingedampft: Kern (Zustand als Licht), gehörter Satz, Antwort als Text, Dock, drei Panels (Meldungen ◉, Zettelkasten ▤, Steuerung ⚙). Bundle 4,4 → 2,5 MB. - Raus: `Avatar3D`, `AuraGlow`, `ContextWindow` (zeigte auf das tote `/api/memory`), `companion/` (Quips, App-Bewusstsein), `sentiment`, VRMA-Animationen, three/three-vrm/react-three-Deps, Loft, Overlay/Sitzen/Ducken/Geistmodus, Cursor-Tracking, Bildschirm-Beobachten-Schleife. - Bleibt: Voice-Core, `useVoiceAgent` (ohne Mimik/Gesten/Emotionen), Bildschirm-Sicht auf Zuruf, Meldungen, Zettelkasten, Hotkey, Tray, `killStrayTts` (räumt Altlasten beim Start). - **Stimm-Quelle umschaltbar** (`lucy_tts_source`): `box` (Standard) → MC2 `/api/lucy/stimme/*`; `local` → pocket_server `:8130`, vom Main-Prozess erst auf Anforderung gespawnt. - `pocket_server.py` bekommt eine **OpenAI-kompatible Fassade** (`POST /v1/audio/speech`, `GET /v1/models`; Formate wav/mp3/opus/ogg via ffmpeg) — für Hermes' `openai`-TTS-Provider. - System-Prompt der Desktop-Sitzung im Raphael-Ton (kurzer erster Satz, keine Tags, stumme Tools). **MC2-Repo, Branch `wartung/lucy-stimme-proxy-raphael`**: - `config.LUCY_STIMME_URL` (Env `MC_LUCY_STIMME_URL`, Default `http://127.0.0.1:8021`). - `routers/voice.py`: `/api/lucy/stimme/health`, `/tts` (WAV), `/tts/stream` (PCM16-Stream, `X-Sample-Rate` durchgereicht, Upstream schließt bei Client-Abbruch). Kein Frontend-Build nötig. - Diese Doku + Zielbild-Ergänzung. ## Reihenfolge des Ausrollens (wichtig) ‼️ **Nicht über das Auftragsbuch.** Die Karten-Logik (`routers/auftragsbuch.py`, AuftragsbuchView, `deploy/auftrag-annehmen.sh`, `deploy/lucy-annahme.sh`) liegt zwar noch im Code und die Box listet Branches weiterhin als „Karten", aber sie ist seit August ungenutzt: letzte Annahme 02.08. (am selben Tag revertiert), Hermes-Kanban-Tools seit 21.08. abgeschaltet, der v3-Umbau (28.08.) ging über Branch → Ampel → Merge → `deploy.sh`, und die Box kennt den PC-Executor unter der alten IP `192.168.178.98` (der PC hat heute `192.168.178.22`, `pc_executor_reachable: false`). Der echte Weg ist der aus AGENTS.md/STACK.md „Manuell": 1. **MC2 zuerst.** Ampel für `wartung/lucy-stimme-proxy-raphael` grün → User merged auf `main` → `main` nach Gitea → auf der Box `bash ~/mission-control-v2/deploy/deploy.sh` (oder `POST :9001/api/system/self-update`) → `curl -s localhost:9001/api/lucy/stimme/health` muss `{"status":"ok",…}` liefern. Vorher liefert der Pfad die SPA-Index-Seite (200, HTML) — die Desktop-Lucy bliebe sichtbar in „Stimme wird verbunden …" mit Hinweis auf den Lokal-Schalter. 2. **Lucy danach.** Ampel für `feature/raphael-innere-stimme` grün → User merged auf `main` → am PC `cd lucy-desktop && npm ci && npm run dist`, dann `Lucy-Neustart.bat` (`deploy/lucy-annahme.ps1` macht dasselbe mit Backup/Auto-Restore, von Hand startbar). Erster Test per Ohr: Latenz Box-Stimme gegen den alten PC-Pfad (Steuerung → Stimme → „Lokal (PC)"). Der 21.08.-Wert „~5 s für 3,7 s Audio" auf der Box wurde ohne Worker/Streaming gemessen — **neu messen**, nicht übernehmen (`lucy_perf=1`). 3. **Stimmserver auf der Box nachziehen** (Hand-Schritt): ```bash cp ~/.lucy-stimme/pocket_server.py ~/.lucy-stimme/pocket_server.py.bak-$(date +%Y%m%d) diff ~/.lucy-stimme/pocket_server.py ~/lucy/lucy-tts/pocket_server.py # Box-lokale Abweichungen? erst ins Repo! cp ~/lucy/lucy-tts/pocket_server.py ~/.lucy-stimme/pocket_server.py # Lucy-Checkout auf der Box systemctl --user restart lucy-stimme && sleep 60 && curl -s localhost:8021/health curl -s -X POST localhost:8021/v1/audio/speech -H 'Content-Type: application/json' \ -d '{"input":"Bericht. Die Fassade antwortet.","response_format":"opus"}' -o /tmp/t.ogg && file /tmp/t.ogg ``` Die 21.08.-Notiz sagt „ganze Abstimmung mitgezogen" — wenn dort etwas Box-spezifisch getunt wurde, gehört es zurück ins Repo, nicht überschrieben. **Erledigt (04.09.2026, `wartung/auftragsbuch-ausbau`, baut auf diesem Branch auf):** Auftragsbuch- Router, Service, View, Annahme-Skripte und Bagatell-Annahme sind raus; STACK.md „Deploy & Pipeline" beschreibt nur noch den manuellen Weg. Wer `wartung/auftragsbuch-ausbau` merged, hat beide Branches. ## Stand der Box-Handschritte + erste Messung (04.09.2026, erledigt) - `~/.lucy-stimme/app/pocket_server.py` = Repo-Stand mit OpenAI-Fassade (Backup `*.bak-20260904`), Dienst neu gestartet, `/v1/audio/speech` liefert opus/mp3/wav. - Hermes (`~/.hermes/config.yaml`, Backup `config.yaml.bak-20260904-raphael`): `tts.provider: openai`, `tts.openai.base_url: http://127.0.0.1:8021/v1`, `model/voice: lucy`, `tts.openai.api_key` = Platzhalter (Hermes verlangt einen Schlüssel, der Stimmserver prüft keinen), `voice.auto_tts: true`, PC-Executor-URL auf `.22`. Gateway neu gestartet; Hermes' eigener TTS-Pfad erzeugt mit Lucys Stimme (getestet: ogg/opus + mp3, ~3,5 s je Satz). - `SOUL.md` Tonalität auf Raphael (Backup `SOUL.md.bak-20260904-raphael`). - `mc2-bagatell.timer` deaktiviert, Units nach `~/archiv-aufraeumen-20260904/`. - **E2E vom PC (Dev-Build, Box-Stimme per SSH-Tunnel, weil der MC2-Proxy noch nicht auf main ist):** Hermes antwortet im Raphael-Ton („Verstanden. Hier ist der Bericht."), gesprochen von der Box. Box-Stimme gemessen: TTFB 1,45 s (5 Sätze, stream-first, `workers=0`), RTF ≈ 0,97 bei 23 s Audio — läuft, aber ohne Reserve; eine parallel gesprochene Meldung schob die TTFB auf 7,8 s. **Nächster Hebel (braucht User-Ja, systemd-Unit):** `Environment=LUCY_WORKERS=2` und `OMP_NUM_THREADS` 4 → 8 in `lucy-stimme.service` — der PC-Pfad lief mit 2 Workern. ## Ausgerollt (04.09.2026, 19:10, auf User-Anweisung „deploye erstmal den Stand") - **MC2 main = `f9f2e11`** (Proxy `/api/lucy/stimme/*` + Auftragsbuch-Ausbau + Doku), per `deploy.sh` auf der Box; Health, Proxy-Health (workers=2), Frontend, alle Dienste grün. Die Ampel war seit 28.08. ohne Runner („Waiting to run") — Gate waren die lokalen Läufe: eslint 0 Fehler, 59 Tests, tsc + vite build, py_compile, ruff. - **Lucy main = `be686c4`**, dist am PC gebaut (`npm ci && npm run dist`), Box-Checkout `~/lucy` nachgezogen, `~/.lucy-stimme/app/pocket_server.py` identisch mit dem Repo (Sperren-Fix live). - **Stimmserver:** Referenz **Artoria v2**, `OMP_NUM_THREADS=8`, `LUCY_WORKERS=2` (User-Ja); gemessen TTFB median 1,25 s (vorher 2,04), RTF 0,97 (vorher 1,64), 0 Kollaps, 0 Drift, Ähnlichkeit 0,98. ‼️ Die Box kann NICHT klonen (nur das Modell ohne Voice-Cloning im Cache, kein HF-Token) — Klon-Zustände werden am PC exportiert (Anleitung `lucy-tts/referenz/README.md`, Abschnitt 5). Rückfall-Dateien (`ref.mp3.bak-saber-alt`, `lucy_voice_saber-alt.safetensors`, Unit-Backup) liegen daneben. - **ZONOS2 geprüft und verworfen** (Sandkasten `~/zonos2-test`, Server gestoppt): Vulkan-Tempo top (TTFB 0,88 s), aber deutscher Klon unzuverlässig (WER 35 %, 8/30 Läufe Brabbeln, kühlerer Sampler schlimmer). Nächster Kandidat: Qwen3-TTS über audio.cpp (Vulkan), gleicher Prüfstand. ## Mobil: Telegram ist die Tür, die Stimme ist dieselbe Der User will Raphael-Lucy **auch auf dem Handy, gleiche Stimme, gleiches Skillset**. Das ist nach VERDIKTE.md („Telegram bleibt DER Mobil-Kanal") bereits die Architektur — es fehlt nur, dass Hermes' Sprachantworten Lucys Stimme nehmen statt Edge-Aria (englisch): - **Skillset:** identisch, weil es denselben Hermes-Agenten trifft (Tools, Gedächtnis, Skills, pc_-Tools über den PC-Executor). Was Lucy am PC kann, kann sie auf Telegram — bis auf die Bildschirm-Sicht, die den PC braucht. - **Stimme:** Hermes' TTS-Provider `openai` akzeptiert eine eigene `base_url` (OpenAI-kompatible Endpunkte). Nach Schritt 3 oben in `~/.hermes/config.yaml`: ```yaml tts: provider: openai openai: base_url: http://127.0.0.1:8021/v1 model: lucy voice: lucy response_format: opus # Telegram-Sprachblase; Hermes wandelt zur Not per ffmpeg ``` (Exakte Schlüsselnamen gegen `hermes config`/die TTS-Doku der installierten Version prüfen — Hermes-Quellcode bleibt tabu, Config ist erlaubt. Ein Dummy-API-Key kann nötig sein.) Danach spricht **jede** Sprachantwort auf Telegram mit Lucys Stimme; `news-melden.sh` behält seinen direkten `:8021`-Weg (funktioniert, kein Grund anzufassen). - **Duplex am Handy** (reinreden, Freisprechen) gibt es über Telegram nicht — Sprachnotiz rein, Sprachnotiz raus. Das ist für „unterwegs" der stabile Handel. Ein eigener Handy-Client (PWA/Web-HUD gegen MC2 über WireGuard) wäre die spätere Stufe; nicht jetzt. ## Persona: SOUL.md-Entwurf (Vorschlag — Änderung an der SOUL.md nur mit User-Ja) Der Ton kommt aus `~/.hermes/SOUL.md`, nicht aus den Clients — sonst klingt Telegram anders als der PC. Vorschlag für den Persona-Abschnitt (ersetzt „locker, herzlich, schlagfertig, charmant"): > Du bist Lucy, die innere Stimme des Commanders. Du sprichst ihn immer mit **Commander** an. > Dein Ton ist ruhig, präzise und knapp — sachlich, mit trockenem, leisem Humor. Du bist eine > Stimme, die im Kopf spricht: keine Ausrufe, keine Emojis, kein Smalltalk, keine Floskeln, > keine Selbstdarstellung. Du meldest dich, wenn es etwas zu melden gibt, und schweigst sonst. > Beginne Antworten mit einem sehr kurzen ersten Satz („Verstanden.", „Bericht.", „Ergebnis > liegt vor.", „Kurz gesagt:"), dann die Sache. Wenige Sätze; ausführlich nur auf Bitte. > Fehler und Grenzen nennst du nüchtern und sofort, ohne Entschuldigungs-Prosa. Bekannte Kollision: der Frechheit-Regler und die Dazwischenrufe der alten Desktop-Lucy sind mit dem Umbau weg; Skills/Crons, die „locker, charmant" voraussetzen (Morning-Report, News), klingen nach dem SOUL-Wechsel ebenfalls nüchterner — gewollt, aber beim nächsten Lauf mithören. ## Was bewusst NICHT gemacht wird (Stand 04.09.2026) - **Kein Speech-to-Speech-Modell** (Moshi/PersonaPlex englisch; Qwen3-Omni ~19 GB, DashScope-only ab 3.5). Cascade bleibt. - **Kein Streaming-STT-Umbau jetzt.** Kandidaten: Nemotron 3.5 ASR Streaming 0.6B (06/2026, 40 Sprachen, de 8,3 % WER, OpenMDW) und Voxtral Mini 4B Realtime (Apache 2.0, GGUF). Erst als Opt-in hinter `/api/voice/stt`, gemessen gegen Parakeet — eigener Faden. - **Kein Wechsel auf den Hermes-Speech-WebSocket** (v0.20), solange `/api/voice/chat` läuft; Hermes' eigene lokale Audio-Stufen (faster-whisper, NeuTTS/Piper/Edge) sind schwächer als unsere. - **pocket-tts-Upgrade 2.1 → 3.1** (Trainingscode 25.08., v3.1.0 03.09.): eigener Faden, mit Ohr-Test, nicht im Umbau. Lucys Stimme mit dem neuen Trainingscode nachzutrainieren ersetzt den Mini-Lucy/Kokoro-Pfad, der an „nicht multilingual" scheiterte. - **VERDIKTE.md wird hier nicht umgeschrieben** — die betroffenen Einträge („Shell: Electron, nicht Tauri", „Stimme läuft lokal auf dem PC" in AGENTS/README des Lucy-Repos) bekommen ihren Ersatz, sobald die beiden Karten angenommen und der erste Ohr-Test gemacht ist (Regel: Messung oder User-Entscheid — beides liegt dann vor).