feat: Audio-Eingang über WebSocket (/ws/voice) - Sprach-zu-Sprach (#4 Ausbau)

- /ws/voice: binaere Audio-Frames puffern, {"type":"end"} -> STT-Transkription
  -> transcript-Event -> bestehende Antwort-Pipeline (ack/token/audio/semantic/done)
- ws.py refaktoriert: gemeinsame _resolve + _run_turn fuer /ws/chat und /ws/voice
- stream/audio_stream auch fuer Sprach-Turns nutzbar; mehrere Utterances pro Verbindung
- Tests: 47 gruen (+2: Transkript->Antwort, leerer Puffer)
- Doku aktualisiert (README, BEDIENUNGSANLEITUNG, Architektur)

Hinweis: STT pro Aeusserung (gepuffert); partielle Live-Transkripte (Streaming-STT
mit VAD) bleiben naechster Increment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-17 04:51:49 +02:00
commit 9340d3f998
5 changed files with 233 additions and 98 deletions

View file

@ -88,7 +88,8 @@ Aktive Konfiguration prüfen: `curl http://localhost:8080/api/config`.
| `GET /api/me` | aktueller Nutzer + Präferenzen |
| `PUT /api/me/prefs` | dauerhafte Routing-Präferenzen des Nutzers setzen |
| `GET/POST/DELETE /api/me/memories` | Langzeit-Erinnerungen des Nutzers verwalten |
| `WS /ws/chat` | Echtzeit-Chat über WebSocket (Streaming-Events) |
| `WS /ws/chat` | Echtzeit-Chat über WebSocket (Text rein, Streaming-Events) |
| `WS /ws/voice` | Echtzeit-Sprache (Audio rein → Transkript → Antwort) |
Beispiel (Sprachausgabe an den Test-Loopback, lokaler TTS-Stub):
@ -142,8 +143,14 @@ via SSE; Provider ohne Streaming liefern die komplette Antwort als ein `token`-E
mit `seq` + binärer Frame) gesendet — die Ausgabe beginnt, bevor die Antwort fertig
ist. `stream` und `audio_stream` lassen sich kombinieren.
> Audio-Eingang/Streaming-STT, Barge-in/Turn-Manager und WebRTC sind als nächste
> Increments vorgesehen (siehe Architektur-Dokument).
**Sprach-Eingang (`/ws/voice`):** Der Client streamt Mikrofon-Audio als binäre
Frames; ein `{"type":"end"}`-Control-Frame schließt die Äußerung ab. Der Server
transkribiert (STT), sendet ein `transcript`-Event und durchläuft dann dieselbe
Antwort-Pipeline wie `/ws/chat` (inkl. `stream`/`audio_stream`). Damit ist
Sprach-zu-Sprach-Konversation über einen Kanal möglich.
> Partielle Live-Transkripte (Streaming-STT mit VAD), Barge-in/Turn-Manager und
> WebRTC sind als nächste Increments vorgesehen (siehe Architektur-Dokument).
## Authentifizierung