llmrouter: Sprechtext-Normalisierung vor TTS — Postleitzahl als Ziffernfolge mit Pause

"Bergstraße 7, 83646 Bad Tölz" -> "Bergstraße 7; Postleitzahl 8 3 6 4 6, Bad Tölz"
(Andreas 2026-09-06, Variante 4 nach Hörtest mit Fish S2 Pro). Betraege, Daten,
Einheiten und Bindestrich-Nummern bleiben unberuehrt; 10 Tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-06 08:28:19 +02:00
committed by andreas
co-authored by Claude Fable 5.1
parent d07bef5e10
commit dfc85a4829
5 changed files with 109 additions and 2 deletions
+17
View File
@@ -130,6 +130,23 @@ Der erste Lauf mit leerem State prüft jeden Alias unter Last, das ist gewollt.
- Upstream-Schlüssel aus der Umgebung: `OPENROUTER_API_KEY`, `MISTRAL_API_KEY`.
- `ADMIN_KEY` schützt `GET /stats?days=N`, `GET /zuordnung`, `POST /auffrischen`.
## Sprechtext-Normalisierung (TTS)
Vor jeder Synthese über `/v1/audio/speech` läuft `input` durch
`src/sprechtext.ts`, für alle TTS-Ziele gleich (lokales Qwen-TTS, Mistral
Voxtral, künftig Fish). Befund 2026-09-06 mit Fish S2 Pro: Beträge
(„1.248,50 Euro") und Daten („14. August 2026") liest das Modell richtig, eine
Postleitzahl nicht, und die Hausnummer davor verschmilzt damit. Regel (Andreas,
Variante 4 von vier gehörten):
Bergstraße 7, 83646 Bad Tölz → Bergstraße 7; Postleitzahl 8 3 6 4 6, Bad Tölz
Ziffern bleiben Ziffern (übersetzbar), mit Leerzeichen getrennt; das Semikolon
erzwingt die Pause, die Ansage macht die Folge eindeutig. Greift nur bei fünf
Ziffern vor einem großgeschriebenen Ortsnamen; Einheiten („83646 Euro"),
Bindestrich-Nummern („2026-83646") und Zahlen ohne Ortsnamen bleiben
unberührt. Tests: `bun test` im Router-Verzeichnis.
## Log und Statistik
Je Anfrage eine Zeile in `log/requests.jsonl` und in `log/requests.sqlite`: