CLI: --until-enter und optionale LLM-Korrektur (--llm-correct)

- --until-enter: Aufnahme mit beliebig langen Pausen, Enter beendet, Ausgabe als ein Text
- stt_llm.py: Nachkorrektur per lokalem LLM (Standard gemma4:12b über Ollama nativ mit
  kleinem Kontext; OpenAI-kompatible Server möglich), strenger Prompt mit Beispielen,
  Ähnlichkeitsprüfung und Fehler-Fallback auf den Rohtext
- Output-Klasse in der CLI: Korrektur in eigenem Thread, Reihenfolge bleibt erhalten
- Tests für die LLM-Korrektur (13 Unit, 1 Integration)
- Doku: Bedienungsanleitung, README, Entwicklerdoku (inkl. Modellvergleich), CLAUDE.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-14 00:48:02 +02:00
commit 6ebea4b745

View file

@ -22,7 +22,7 @@ mitpflegen.
## Befehle
```bash
.venv/bin/python -m pytest # Unit-Tests, ohne Modell (~9 s)
.venv/bin/python -m pytest # Unit-Tests, ohne Modell/LLM (~9 s)
.venv/bin/python -m pytest -m integration # echtes Whisper small/CPU + Silero, espeak-ng-Sprache (~20 s)
.venv/bin/python -m pytest tests/test_service.py::test_ws_stream_with_vad_emits_transcripts_per_utterance
@ -50,6 +50,9 @@ von dort); nur `wyoming` ist in der venv installiert. Tests immer mit `.venv/bin
- `stt_cli.py` — Client: Dateien per `POST /transcribe`, Mikrofon per `/ws/stream`; `--local` nutzt den Kern direkt.
stdout nur Transkripte, stderr Status. Default-Mikrofon über das ALSA-Gerät `pulse` (PortAudios Default ist hier
die falsche Onboard-Karte); ReSpeaker XVF3800 → automatisch Kanal 1 (ASR-Ausgang).
- `stt_llm.py` — optionale LLM-Nachkorrektur, nur über `Output` in `stt_cli.py` (`--llm-correct`); Kern und Dienst kennen
sie nicht. Ollama nativ (`num_ctx`/`keep_alive`/`think:false` pro Anfrage, weil Ollama global 131k Kontext hat) oder
OpenAI-kompatibel; `_accept` verwirft Antworten mit Ähnlichkeit < 0,75 oder ±30 % Länge → Rohtext.
- `legacy/stt.py`, `legacy/stt_respeaker.py` — **historische** Einzelskripte, nicht weiterentwickeln.
Sprache: `language=None` → Config-Default, `"auto"` → Erkennung, `"de-DE"` → `"de"` (`SttEngine.resolve_language`).