feat(voice_loop): --stream-text (Antworttext live am Monitor)

- neuer Flag --stream-text setzt stream:true im /ws/voice-Start-Frame;
  token-Events werden inline ausgegeben (Wort fuer Wort, waehrend die KI generiert)
- mit --stream-audio kombinierbar; bei semantic wird die Live-Zeile abgeschlossen
- Token-Events sind winzig -> Audio-Startzeit praktisch unveraendert (gemessen:
  Text 1. Token lokal ~1 s, Cloud ~3 s; erster Ton wie zuvor)
- Test: /ws/voice mit stream:true liefert token-Events; 66 Tests gruen
- Doku ergaenzt (Optionen + Feature-Hinweis)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-17 17:47:11 +02:00
commit 5296459b07
3 changed files with 36 additions and 3 deletions

View file

@ -110,6 +110,7 @@ Ablauf je Runde:
Nützliche Optionen:
```bash
python scripts/voice_loop.py --stream-audio # satzweises Vorlesen: Antwort beginnt frueher
python scripts/voice_loop.py --stream-text # Antworttext live anzeigen (kombinierbar mit --stream-audio)
python scripts/voice_loop.py --recorder pw-record # PipeWire-Aufnahme (Standard bei 'auto')
python scripts/voice_loop.py --recorder arecord --device hw:1,0 # ALSA, bestimmtes Mikrofon
python scripts/voice_loop.py --llm-provider openrouter --tts-provider openrouter
@ -177,8 +178,10 @@ curl -s -X POST "$URL/api/chat?debug=true" \
- **Echtzeit-Streaming:** WebSocket `/ws/chat` mit `{"text":"…","stream":true}` liefert
die Antwort wortweise; `"audio_stream":true` zusätzlich das Audio satzweise. Im
Sprech-Loop aktivierst du das satzweise Vorlesen mit `--stream-audio` (das Vorlesen
beginnt dann schon nach dem ersten Satz, statt erst nach der ganzen Antwort).
Provider-Overrides und `--stream-audio` wirken auch über `/ws/voice` (start-Frame).
beginnt dann schon nach dem ersten Satz, statt erst nach der ganzen Antwort) und die
**Live-Anzeige des Antworttextes** mit `--stream-text` (erscheint Wort für Wort,
während die KI generiert — beides kombinierbar). Provider-Overrides, `--stream-audio`
und `--stream-text` wirken auch über `/ws/voice` (start-Frame).
- **Unterbrechen (Barge-in):** während der Assistent spricht `{"type":"interrupt"}`
senden → laufende Antwort wird abgebrochen.
- **Automatische Sprechpausen-Erkennung (VAD):** im Start-Frame von `/ws/voice`