Files
mission-control-v2/docs/wissen/RAPHAEL.md
T

13 KiB

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