refactor(ui): Geräte-STT entfernt + Menü-Redesign (schlanke Kopfzeile + ⋮-Sheet)

Geräte-STT (Web Speech API) entfernt — auf Android nur Cloud, Qualität < Whisper,
verwirrend. STT läuft jetzt überall serverseitig (Whisper). Geräte-TTS bleibt.
- Backend: allow_cloud_stt (config/runtime_config/api me) + Tests entfernt.
- Frontend: SpeechRecognition-Code, STT-Dropdown, "Lokal"-Button raus.

Menü-Redesign (verständlicher + passt auf Handys):
- Kopfzeile schlank: Mund-Icon + Titel + Sprache + ⋮-Menübutton (kein Überlauf mehr).
- ⋮ öffnet ein Einstellungs-Sheet: Ton als 3 Presets (📱 Im Gerät / ☁ Server /
   Beste Qualität) statt zweier kryptischer "Gerät"-Dropdowns; Neues Gespräch;
  Tag-/Nachtmodus; Konto (Identität, Admin, Abmelden).
- #tts bleibt als verborgenes Quell-Select -> bestehende TTS-Logik unverändert.
- Doku §5.1.2 neu, §6.3 STT-Hinweis. 167 grün.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-20 22:26:20 +02:00
commit 3f6bf53a7f
7 changed files with 161 additions and 254 deletions

View file

@ -774,29 +774,43 @@ https://va.beispiel.de/ ← remote über Reverse-Proxy (alles, inkl. Mikr
```
┌─────────────────────────────────────────────────────────┐
│ Voice Assistant [🇩🇪 ▾] [Qualität ▾] [⚙️] [🌙] │
├─────────────────────────────────────────────────────────┤
│ │
│ Nachrichtenverlauf │
│ (eigene Nachrichten: blaue Blase rechts) │
│ (Assistent: graue Blase links) │
│ │
├─────────────────────────────┬───────────────────────────┤
│ Texteingabe … [Senden] │ [🎤] │
└─────────────────────────────┴───────────────────────────┘
Statuszeile: „denkt …" / „verarbeite Sprache …" / leer
│ 👄 Voice Assistant ............... [🇩🇪 ▾] [ ⋮ ] │
├─────────────────────────────────────────────────────────┤ ┌─ Menü (⋮) ──────────────┐
│ │ │ VORLESEN │
│ Nachrichtenverlauf │ │ ▣ 📱 Im Gerät │
│ (eigene Nachrichten: blaue Blase rechts) │ │ ▢ ☁ Server │
│ (Assistent: graue Blase links) │ │ ▢ ✨ Beste Qualität │
│ │ │ ────────────────────── │
├─────────────────────────────┬───────────────────────────┤ │ ✎ Neues Gespräch │
│ Texteingabe … [Senden] │ [🎤] │ │ 🌙 Tag-/Nachtmodus │
└─────────────────────────────┴───────────────────────────┘ │ ────────────────────── │
Statuszeile: „denkt …" / „verarbeite Sprache …" / leer │ Angemeldet · Admin · Ab │
└──────────────────────────┘
```
**Kopfzeile (immer schlank):**
| Element | Funktion |
|---------|----------|
| **👄 / Titel** | Marke; Mund-Symbol als Wiedererkennung |
| **Sprache ▾** | Antwortsprache (→ § 6.6): `🔄 Flex` = folgt der gesprochenen Sprache · feste Sprache (🇩🇪/🇬🇧/…) = Antwort + Stimme in dieser Sprache |
| **⋮ Menü** | Öffnet die Einstellungen (unten) |
**Im ⋮-Menü:**
| Element | Funktion |
|---------|----------|
| **Vorlesen** | Wie wird die Antwort vorgelesen? `📱 Im Gerät` = das Handy liest selbst vor (kein Server-Audio → spart Daten) · `☁ Server` = piper (lokal, zuverlässig) · `✨ Beste Qualität` = chatterbox (natürliche Stimme). „Im Gerät" erscheint nur, wo der Browser es unterstützt. |
| **✎ Neues Gespräch** | Frische Sitzung (Verlauf zurücksetzen) |
| **🌙 Tag-/Nachtmodus** | Heller/dunkler Modus; folgt sonst dem Betriebssystem |
| **Konto** | „Angemeldet als …", **⚙ Admin** (nur Admins → § 7.5), **Abmelden** |
**Unten:**
| Element | Funktion |
|---------|----------|
| **🎤 Mikrofon** | **grün:** tippen → Aufnahme · **rot:** tippen → stoppt & sendet · **amber ⏹:** tippen → KI unterbrechen (Barge-in). STT läuft serverseitig (Whisper). |
| **Texteingabe + Senden** | Text tippen, dann Enter oder „Senden" |
| **🎤 Mikrofon-Button** | **Idle (grün 🎤):** Tippen → Aufnahme startet · **Aufnahme (rot pulsierend 🎤):** Tippen → Aufnahme stoppt und wird gesendet · **KI antwortet (amber ⏹):** Tippen → Antwort sofort unterbrechen (Barge-in) |
| **Sprache ▾** | Antwortsprache wählen (→ § 6.6): `🔄 Flex` = folgt automatisch der gesprochenen Sprache · feste Sprache (🇩🇪/🇬🇧/…) = Eingabe wird in diese Sprache übersetzt. Die vorlesende Stimme folgt der Auswahl. |
| **Qualität ▾** (Ausgabe/TTS) | Vorlese-Quelle: `📱 Gerät` = das Handy/der Browser liest selbst vor (Web Speech API, kein Server-Audio → spart Daten/Kosten) · `Schnell` = piper (lokal) · `Hoch` = chatterbox (neuronal) · `Cloud` = openrouter |
| **STT ▾** (Eingabe) | *Nur sichtbar auf Geräten mit lokaler Spracherkennung* (iOS/Android): `🎙 Gerät` = Spracherkennung im Gerät (nur Text wird gesendet) · `☁ Server` = Audio-Upload + Whisper (wie am PC/Laptop). Getrennt von der Ausgabe wählbar (→ § 6.3.1). |
| **☀️ / 🌙** | Tag-/Nacht-Modus; folgt sonst automatisch dem Betriebssystem |
| **⚙️** (Admin) | Öffnet das Admin-Panel — nur für Admin-Nutzer sichtbar (→ § 7.5) |
| **Angemeldet als …** | SSO-Identität; „Gast" wenn AUTH deaktiviert oder kein SSO-Cookie |
#### 5.1.3 Typischer Ablauf — Textchat
@ -1013,34 +1027,10 @@ FASTER_WHISPER_DEVICE=cuda
FASTER_WHISPER_COMPUTE_TYPE=float16
```
#### 6.3.1 Geräte-STT (Web Speech API) — „🎙 Gerät"
Auf **Mobilgeräten** (iOS/Android) kann die Spracherkennung **im Gerät** laufen: Das
Handy wandelt Sprache in Text um und sendet nur den **Text** an den Server — kein
Audio-Upload, keine Server-STT-Last. Gegenstück zum Geräte-TTS (§ 6.5.0), aber
**getrennt** wählbar (STT-Dropdown in der Kopfzeile).
- **Erscheint nur**, wenn das Gerät lokale Spracherkennung bietet. **Terminal, Desktop-
Browser und Laptop** zeigen die Option nicht — dort läuft STT wie bisher über den
Server (Whisper).
- **Datenschutz (Linie C):** Standardmäßig nur bei **nachweislich lokaler** Erkennung
(iOS-Safari; Chrome mit On-Device-Modus). **Chrome am Desktop** würde das Audio zur
Erkennung an Google schicken — das ist nur erlaubt, wenn ein Admin
`ALLOW_CLOUD_STT=true` setzt (Admin → Einstellungen → „Geräte-STT (mobil)").
- **Nur Fix-Sprache:** Geräte-STT braucht einen Sprach-Hint → es nutzt die im
Sprach-Dropdown gewählte feste Sprache. Im **Flex-Modus** fällt es automatisch auf
Server-STT (Whisper-Auto-Erkennung) zurück.
- **On-Device-Sprachpakete (Chrome):** Vor der lokalen Erkennung wird per
`SpeechRecognition.available()` geprüft, ob das Sprachpaket vorhanden ist. Fehlt es,
wird es im Hintergrund heruntergeladen (`install()`) und für **diesen** Turn auf
Cloud (falls erlaubt) bzw. Server zurückgefallen — so erscheint kein
„language not supported" mehr.
- **Fallback:** Ohne Unterstützung (z. B. Firefox), bei fehlendem Sprachpaket oder
Erkennungsfehlern (`language-not-supported`, `network` …) wird automatisch der
Server-STT-Pfad genutzt. Während der Erkennung erscheint der Text **live** im
Eingabefeld; erneutes Tippen aufs Mikrofon beendet und sendet.
- **Schnellwahl „📴 Lokal":** Setzt mit einem Tipp **STT + TTS** auf „Gerät" — dann
sendet/empfängt das Handy nur noch Text (maximale Daten-/Kostenersparnis).
> **Hinweis:** Die Spracherkennung läuft auf **allen** Geräten serverseitig (Whisper) —
> einheitlich und zuverlässig. (Ein früher erprobtes Geräte-STT über die Web Speech API
> wurde wieder entfernt: Auf Android-Chrome lief es nur über die Google-Cloud, und die
> Erkennungsqualität war Whisper unterlegen. Das **Vorlesen** im Gerät (§ 6.5.0) bleibt.)
---