Dieses Dokument ist nach Feature-Gruppen gegliedert. Zu jedem Feature finden sich unter Überschriften je eine Liste mit Aufgaben für Server und Client.
Unter ./other-repos/ovos-stt-plugin-vosk findest du ein Beispielprojekt das folgende Features enthält die dir helfen könnten bei der Implementierung:
- Streaming-ASR via Vosk API: niedrige Latenz (kleiner 100 ms), CTC/WFST, CPU-optimiert.
- Code-Switching: Deutsche Modelle mit englischen Termini.
- Adapter-Feintuning: Nutzt Kaldi-Adapter, lässt sich in Personalisierungs-Pipeline einbinden.
Um eine funktionierende Echtzeit-Transkription zu ermöglichen, implementiere im Server die Streaming-Pipeline und im Client die Audio-Erfassung und Anzeige.
- Python-Projekt initialisieren mit venv und FastAPI
- Abhängigkeiten installieren (PyTorch, Transformers, PEFT, uvicorn, websockets)
- WebSocket-Endpunkt
/ws/streameinrichten - Eingehende 20 ms PCM-Chunks empfangen und in Tensoren umwandeln
- Modell
facebook/wav2vec2-large-xlsr-53-germanauf CPU/Neural Engine laden - Inferenz-Pipeline (Forward-Pass → Logits → CTC-Decoding) implementieren
- Transkripte als Chunks über WebSocket zurücksenden
Unter ./other-repos/leon findest du ein Beispielprojekt das dir helfen kann bei der Audio verarbeitung und anzeige des transkripts. Wichtig ist aber das ich das in einem eingabe feld haben möchte damit ich es später editieren kann
- React-Projekt initialisieren mit Vite und TypeScript
- Mikrofonzugriff via Web-Audio API anfordern
- 20 ms Audio-Chunks erfassen und als PCM-Buffer serialisieren
- WebSocket-Verbindung zu
/ws/streamaufbauen - Gesammelte Audio-Chunks in Echtzeit senden
- Eingehende Transkriptions-Chunks anzeigen (Streaming-Update)
- Fehler-Handling bei Verbindungsabbrüchen implementieren
Alle Details zur Verbesserung der Ist-Situation nach dem letzten Feature: https://www.perplexity.ai/search/bitte-recherchiere-und-fasse-z-Yeh3BqyJQhagazWxD1bKoQ
Die ASR-Qualität im Live-Streaming-Backend wird durch gezielte Maßnahmen deutlich verbessert
- Shallow Fusion mit KenLM (pyctcdecode):
- KenLM-Tools kompilieren (lmplz, build_binary etc.)
- Python-Bindings von KenLM im venv installieren
- README für Setup und Nutzung ergänzen
- Datensammlung & Vorverarbeitung:
- Korrekturtexte aus Nutzereingaben sammeln
- Vorverarbeitung (Sonderzeichen entfernen, Tokenisierung, ein Satz pro Zeile)
- Alles in
corpus.txtspeichern
- KenLM-Modell trainieren:
- n-Gramm-Modell (3- oder 4-Gramm, Kneser-Ney) mit lmplz bauen
- Komprimieren mit build_binary
- Modell nach
server/lm/legen
- KenLM-Optimierung für 32GB RAM implementieren:
- Aggressives Pruning mit
--prune 0 1 1 1für 60-80% Größenreduktion - 8-bit Quantisierung mit
-q 8für zusätzliche 50-70% Reduktion - Memory Mapping für lazy loading (automatisch durch KenLM)
- Optimierte lmplz-Parameter:
-o 4 --prune 0 1 1 1 -S 80% -T /tmp - Optimierte build_binary-Parameter:
-a 22 -q 8 -b 8 trie - Integration in bestehende Pipeline (keine separate Datei)
- Integration in pyctcdecode:
- Modell im Backend laden und für Decoding nutzen
- Kontinuierliche Aktualisierung:
- Nach jedem Personalisierungs-Loop neue Korrekturen anhängen
- KenLM-Modell neu bauen und bereitstellen
- Hot-Reload oder Server-Neustart für neues Modell
- Automatisierung:
- Trainings-Trigger automatisiert: Textdaten sammeln, Modell trainieren, bereitstellen
- Status- und Fehler-Logging
- Dokumentation & Referenzen:
- Quellen und Step-by-Step-Referenz in README.md und Code-Kommentaren
- Modellerstellung muss Hauptthread blockieren, ohne Modell macht es keinen Sinn das System zu benutzen:
threading.Thread(target=ensure_initial_kenlm, daemon=True).start()
- Aggressives Pruning mit
https://www.perplexity.ai/search/bei-meinem-aktuellen-projekt-h-p3YQ8JYSQ0eC2ztoRb1s7Q#0
- Automatisierte Grid-Search für KenLM-Parameter (Alpha/Beta) tune_decoder
- Neues Model
- Ergebnis für "facebook/wav2vec2-large-xlsr-53-german"
- Das waren auf jeden Fall 4000 Beispielen und 170 Kombinationen
- Beste Alpha: 0.20
- Beste Beta: -1.00
- Beste avg. WER: 0.2044
- wav2vec2-S ist nicht verfügbar?
- habe gemini-cli gefragt und das hat ein anderes verfügbares gefunden
- siehe
docs/2025-07-18-better-audio-modell.md - eine Kombination dauert: 3045s. Bei 170 Kombinationen kann man in 13h 356 Beispiele berechnen
- decoder tune run um WER zu vergleichen
- siehe
- wav2vec2-S ist nicht verfügbar ist falsch, ich hab das gefunden:
- Ergebnis für "facebook/wav2vec2-large-xlsr-53-german"
- siehe
./docs/2025-08-03-next-steps.md - personalisiertes KenLM:
- Durch eigene Notizen KenLM personalisieren
- siehe
./docs/2025-07-31-kenlm-personalisierung.md
- Hotword-Boosting:
- Boost-Words/Fachbegriffe mit erhöhtem Score via pyctcdecode
- Adapter-Feintuning per LoRA + EWC:
- Nutzer-Korrekturen werden für LoRA-Feintuning (r=16, α=32, EWC) genutzt und als Adapter deployed
- Automatisierter Trainings-Endpoint nach jeder Session
- Forced Alignment auf CTC-Logits:
- Dynamische Programmierung über CTC-Logit-Lattice für exakte Wort-Zeitstempel (z. B. mit
ctc-forced-aligner)
- Dynamische Programmierung über CTC-Logit-Lattice für exakte Wort-Zeitstempel (z. B. mit
- Zweite Pass-Rescoring mit Transformer-LM:
- Nach erster CTC-Hypothese: N-Best-Liste, Bewertung durch LLM (z. B. GPT-4) mit Cross-Attention für komplexe Begriffe
Um kontinuierliches Lernen zu ermöglichen, setze Server-Endpunkte für Corrections und Training und Client-UI für Korrekturen um.
Erweiterte Dokumentation zu diesem Task ist in docs/ecw.md
- POST-Endpoint
/upload/correctionsfür(audio_chunk, korrigierter_text)implementieren - Speicherstruktur anlegen:
/correctionsdas Dateipaare enthält wie2025-06-18 15:46.txtund2025-06-18 15:46.wavfür Audio und korrigiertem Text - Trainings-Trigger realisieren via HTTP-Endpoint
/train/ewc - Fisher-Information berechnen
- Funktion
get_fisher_diag(model, dataloader)
- Funktion
- EWCTrainer-Klasse erweitern
- Überschreiben von
compute_lossmit EWC-Term
- Überschreiben von
- Feintuning-Task
- Skript
run_ewc_training()für:- Laden des Basismodells
- Erzeugen der Datasets A und B
- Berechnung von Fisher & alten Parametern
- Training mit konfigurierbarem
ewc_lambda - Speichern und Versionieren des Modells unter
/models/, logging welche Datensätze in das neue Modell geflossen sind - neues Modell laden, hot swapping nicht nötig, downtime ist kein Problem
- Skript
- Logging für Performance-Messungen (Latenz, Trainingszeit)
- mit streamlit unter
/monitoringein Monitoring etablieren- welche Traningsdaten noch nicht verarbeitet wurden
- Übersicht über die letzten 5 Modelle und wie viele Traningsdaten in das Modell geflossen sind bei dessen Training
- letzten 200 Zeilen aus Performance Logging
- UI-Komponente zur Bearbeitung transkribierter Zeilen hinzufügen
- für jede Aufnahme wird der transkribierte Text in einem einfachen input feld dargestellt das bearbeitet werden kann, sobald die Aufnahme vom Benutzer beendet wird
- einen "upload" Button um die daten an
/correctionszu übertragen - nach einem upload kann dieser nicht nochmal getriggert werden, außer es ist ein Fehler aufgetreten beim upload. Auch der Text kann nicht mehr editiert werden
- loading spinner für Upload bis er fertig ist mit Fehlerbehandlung
- Automatisches Neuladen des neuen Modells nach Training
Um Fachbegriffe korrekt zu behandeln, implementiere Biasing im Server-Decoder und entsprechende Einstellungen im Client.
Unter ./other-repos/ASR-Adaptation findest du ein Beispielprojekt das dir hier helfen kann
- Mechanismus zur Prompt-Injection für Vokabular-Biasing umsetzen durch statisches
vocab_bias.jsondie vom Client aus geändert werden kann - Decoder anpassen, um Bias-Wahrscheinlichkeiten bei der CTC-Dekodierung zu priorisieren
- Optional: Rescoring-Endpoint
/rescorezur LLM-gestützten Priorisierung (z. B. GPT-API)
- Settings-Tab
- Eingabefeld zum Hinzufügen eigener Fachbegriffe zu
vocab_bias.json - Button um Neustart des Servers der die neuen Begriffe einbetten muss, loading spinner bis Server fertig ist
- Eingabefeld zum Hinzufügen eigener Fachbegriffe zu
- Anzeige der aktiven Bias-Begriffe und Möglichkeit zum Entfernen
- Option zum temporären Deaktivieren des Biasing
Um Systemstabilität und -performance zu steigern, integriere Augmentation, CI/CD, Monitoring und UI-Optimierungen.
- Synthetic Data Augmentation via VALL-E X integrieren (API und Lizenz prüfen)
- Alternative Streaming-Server evaluieren (VOSK, ESPnet-Conformer, Kaldi-Serve)
- CI/CD-Pipeline für Builds, Tests und Deployments einrichten (Docker, GitHub Actions)
- Audioaufnahme im Client von ScriptProcessorNode auf AudioWorkletNode umstellen (Web Audio API Best Practice)
- KenLM auf ARPA-Format umstellen:
- Lade und verwende das KenLM-Modell direkt im ARPA-Textformat statt als .klm-Binary.
- Vorteil: pyctcdecode kann Unigramme korrekt extrahieren, keine Warnungen mehr, bessere Decoding-Qualität.
- Nachteil: ARPA-Datei ist größer, Laden minimal langsamer (nur beim Start relevant).
- Umbau ist einfach: build_binary-Schritt weglassen, stattdessen .arpa-Datei verschieben und als Modellpfad verwenden.
- Umsetzung erst, wenn alle anderen Features stabil laufen.
Wird aktuell von LLM über Olama gefixed.
- Online-Punctuation-Module:
- Leichtgewichtiges ELECTRA-basiertes Modell (z. B. angepasstes
dslim/bert-base-NER) für inkrementelle Satzzeichen nach CTC
- Leichtgewichtiges ELECTRA-basiertes Modell (z. B. angepasstes
- Truecasing-Adapter:
- Truecasing-Stufe mit POS-Tagging (spaCy-Deutsch) für Großschreibung von Satzanfängen und Substantiven
-
Die KenLM-Trainingspipeline läuft jetzt vollständig in Python, nutzt sys.executable und dynamische Pfade für lmplz/build_binary (venv-sicher).
-
.gitignore für Sprachmodelle und Binärdateien angepasst
-
Fehler- und Fallback-Handling für KenLM-Integration implementiert
-
Real-Time Encoder State Revision:
- Speicherung und Überarbeitung früher Hypothesen mit neuen Frames zur Korrektur von Zusammenziehungen
- Jede Aufgabe wird als erledigt markiert, sobald alle zugehörigen Tests und Code-Reviews bestanden sind.
- Entscheidungen zwischen vorgestellten Optionen treffen oder bei Bedarf explizit nachfragen.