Technik

Streaming-Spracherkennung auf der CPU: NVIDIA Nemotron in einer Desktop-App

Wie OpenWhispr Text schon beim Sprechen anzeigt — mit einem cache-bewussten Streaming-Modell über einen lokalen WebSocket, ohne GPU und Cloud — und welche Technik das zuverlässig macht.

OpenWhispr

OpenWhispr

Ingenieurwesen

18. Juli 2026
Inhaltsverzeichnis

Streaming-Spracherkennung transkribiert Audio noch während des Sprechens, statt auf das Ende der Aufnahme zu warten. Seit Version 1.7.6 geschieht das in OpenWhispr vollständig auf dem Gerät: NVIDIAs Nemotron-Streaming-Modelle (600M Parameter, INT8-quantisiert) laufen über einen lokalen sherpa-onnx-WebSocket-Server auf der CPU, die Diktiervorschau wird mit eintreffenden Teilergebnissen live aktualisiert und beim Stoppen wird der Streaming-Text sofort als Transkript übernommen. Keine GPU, keine Python-Umgebung, kein Audio verlässt den Rechner.

Dieser Beitrag beschreibt die technische Umsetzung: weshalb sich die alte Live-Vorschau träge anfühlte, was cache-bewusstes Streaming konkret bedeutet, wie die Pipeline in eine Electron-App passt, welcher Fehler bei der Versionsbindung alles falsch decodierte und wie aus einer erneuten Decodierung jeder Aufnahme die direkte Übernahme des Streams wurde. Den Modellvergleich findest du unter Parakeet vs Whisper vs Nemotron.

Zuletzt aktualisiert am 18. Juli 2026. Die Implementierungsdetails beziehen sich auf die mit OpenWhispr 1.7.6 veröffentlichte Streaming-Transkription; alles Beschriebene ist im Open-Source-Repository einsehbar.

Faktencheck (Primärquellen)

Das Problem: eine Live-Vorschau auf Basis eines Batch-Modells

OpenWhispr hatte schon immer eine Live-Transkriptionsvorschau — ein kleines Fenster, das beim Diktieren zeigt, was das Modell verstanden hat. Vor 1.7.6 funktionierte sie so, wie ein Batch-Modell überhaupt nur live wirken kann: etwa 1.5 Sekunden Mikrofonaudio puffern, den Abschnitt vollständig transkribieren, den Text anhängen und von vorn beginnen.

Dieser Ansatz hat drei strukturelle Probleme. Erstens die Latenz: Wörter können erst erscheinen, wenn der Puffer voll ist; die Vorschau liegt deshalb stets eineinhalb Sekunden plus Inferenzzeit zurück. Zweitens Abschnittsgrenzen: Ein Wort über zwei Abschnitte wird zerschnitten und kann nicht korrigiert werden, weil beide unabhängig transkribiert werden. Drittens der Kontext: Abschnitt fünf kennt Abschnitt vier nicht, sodass das Modell dieselben Mehrdeutigkeiten alle 1.5 Sekunden neu entscheiden muss.

Kürzere Abschnitte wirken schneller, lassen aber die Genauigkeit einbrechen — weniger Kontext, mehr Grenzen. Überlappung repariert Grenzen, transkribiert dafür dasselbe Audio doppelt. Gesucht ist ein Modell, das für einen Audiostream trainiert wurde. Genau das ist Nemotron.

Was cache-bewusstes Streaming wirklich bedeutet

Ein cache-bewusstes Streaming-Modell behält seinen internen Zustand über Abschnittsgrenzen hinweg. Trifft der nächste Audioausschnitt ein, liest der Encoder nicht alles erneut. Er verarbeitet nur neue Frames und greift auf den bereits berechneten Kontext im Cache zu. Es ist derselbe Mechanismus, der Chatbots beschleunigt (KV-Cache), angewandt auf einen Sprachencoder.

Daraus folgen zwei Dinge. Der Rechenaufwand wächst nicht mehr mit der Aufnahmedauer: Jeder Abschnitt kostet nach zehn Sekunden so viel wie nach zehn Minuten. Damit wird reines CPU-Streaming praktikabel. Zugleich bleibt der Kontext erhalten: Das Modell löst Mehrdeutigkeiten anhand des gesamten bisherigen Gesprochenen und korrigiert frühere Wörter, wenn späteres Audio neue Hinweise liefert. Deshalb „setzt“ sich Streaming-Text erst kurz nach dem Sprechen — kein Fehler, sondern eine besser begründete Revision.

Der Latenzrahmen ist ein Regler: Nemotron bietet Abschnittsgrößen von 80ms (am schnellsten, wenigster Kontext pro Schritt) bis 1.12s (höchste Genauigkeit — durchschnittlich 6.93% WER auf den Leaderboard-Datensätzen und damit etwa einen Punkt hinter den besten Batch-Modellen). Trainiert wird NVIDIAs cache-bewusster FastConformer mit Transducer-Decoder; der technische Beitrag erläutert die Theorie ausführlich.

Die Architektur in OpenWhispr

Der Live-Streaming-Pfad in OpenWhispr

Microphone16kHz PCM via AudioWorklet
Local WebSocket127.0.0.1, float32 frames
Nemotron 0.6Bsherpa-onnx, INT8, CPU
Partial resultsJSON per chunk
Live previewText replaced in place
  • One persistent stream for the whole recording — the encoder cache carries context across chunks.
  • Everything is on-device: the WebSocket server is a local sherpa-onnx binary, not a cloud endpoint.
  • A clean flush at stop commits the streamed text as the final transcript; anything less falls back to a full re-decode.

Die Pipeline ist bewusst unspektakulär. Ein AudioWorklet erfasst Mikrofon-PCM mit 16kHz. Die Frames werden in das float32-Drahtformat umgewandelt und per WebSocket an einen sherpa-onnx-Online-Server übertragen — eine native Binärdatei, die OpenWhispr lokal startet und über 127.0.0.1 anspricht, mit einer persistenten Verbindung pro Aufnahme. Der Server führt Nemotron mit INT8-Gewichten aus und antwortet mit JSON-Teilergebnissen; die Vorschau ersetzt ihren Text jeweils vollständig, statt ihn anzuhängen.

Warum ein eigener Serverprozess statt In-Process-Inferenz? Isolation. Native Inferenz-Laufzeiten können abstürzen; eine fehlerhafte Speicherzuweisung in einem ONNX-Kernel darf nicht die gesamte Desktop-App beenden. Ein Sidecar-Prozess macht aus einem Absturz eine neue Verbindung statt eines verlorenen Diktats. Außerdem bleibt nativer Code vollständig außerhalb des Electron-Hauptprozesses: Die App spricht das Protokoll, das Sidecar rechnet.

Nach demselben Muster läuft unsere lokale Sprecherdiarisierung — eine sherpa-onnx-Werkzeugkette, mehrere Aufgaben, alles auf dem Gerät.

Was unterwegs schiefging

Die Laufzeitversion war wichtiger als erwartet. Nemotron benötigt sherpa-onnx 1.13.4 oder neuer für eine korrekte Decodierung. Mit der älteren, für Parakeet gebündelten Laufzeit brach es nicht sichtbar ab, sondern transkribierte schlicht falsch. Die Lösung war banal — Binärdateien auf jeder Plattform aktualisieren und neu binden. Die allgemeine Erkenntnis: Bei Modell-Laufzeiten sind „es läuft“ und „es ist korrekt“ getrennte Tests; nur der zweite zählt.

Streams fallen aus, deshalb blieb der alte Pfad erhalten. Ein Port kann belegt sein, eine Modelldatei fehlen oder der Server während der Aufnahme sterben. Startet der persistente Stream nicht, fällt die Vorschau automatisch auf gepufferte Abschnitte zurück — langsamer, aber nie leer. Offline-Modelle (Parakeet, Whisper) behalten diese Vorschau absichtlich; jedes Modell im Register deklariert seine Laufzeit als online oder offline, und die App wählt den passenden Pfad.

Teilergebnisse brauchten eine andere Darstellung. Der Abschnittspfad hängt Text an; eine Streaming-Hypothese überarbeitet sich, daher ersetzt die Oberfläche bei jedem Teilergebnis die gesamte Vorschau. Würde man eine revidierte Hypothese anhängen, entstünden stotternde Duplikate — die Kurzfassung eines echten UX-Fehlers, den wir früh behoben haben.

Den Stream übernehmen: von zwei Durchläufen zu einem

Unsere erste Version behandelte Streaming nur als Vorschau: Beim Ende des Diktats decodierte die App die komplette Aufnahme neu und fügte dieses Ergebnis ein. Das war sicher, weil der letzte Durchlauf den vollen Kontext sah. Es bedeutete aber zwei Decodierungen pro Diktat und zwang zum Warten auf eine zweite Meinung, obwohl man den fast immer gleichen Text bereits auf dem Bildschirm gesehen hatte.

Noch in derselben Version wurde der Stream deshalb zur maßgeblichen Quelle. Das Diktat läuft unabhängig vom geöffneten Vorschaufenster über die persistente Verbindung. Beim Stoppen leert die App den Modellnachlauf und übernimmt den Streaming-Text direkt — ohne zweite Decodierung. Die Abschlusslatenz sinkt auf einen Nachlauf, der CPU-Aufwand pro Diktat ungefähr auf die Hälfte.

Das Sicherheitsnetz verschwand nicht, sondern wurde zum Rückfallpfad. Das Leeren erkennt abgeschnittene Ergebnisse und verlängert seine Frist, solange weitere eintreffen. Stimmt etwas nicht — abgebrochene Verbindung oder gekürztes Resultat — verwirft die App den Stream und verarbeitet stattdessen die vollständige Aufnahme nach dem klassischen Prinzip Aufnahme, dann Transkription. Der schnelle Pfad gilt nur, wenn er zugleich korrekt ist.

Leistung und Ressourcenbedarf

  • Modelle: Nemotron Speech Streaming EN 0.6B (632MB) und Nemotron 3.5 ASR Streaming 0.6B (650MB, 15 transkriptionsbereite Sprachen, automatische Erkennung) — INT8 ONNX, einmal geladen und lokal zwischengespeichert.
  • Laufzeit: sherpa-onnx 1.13.4 als eigenständige native Binärdatei. Kein Python, PyTorch oder CUDA erforderlich.
  • Hardware: Echtzeit-Streaming auf einer modernen Laptop-CPU; Apple Silicon und aktuelle x86-Systeme halten problemlos mit dem Sprechtempo Schritt.
  • Eindruck: Teilergebnisse folgen der Stimme mit deutlich unter einer Sekunde Verzögerung; beim Stoppen übernimmt ein Nachlauf das Transkript, ohne zweite Decodierung.

Dieser Pfad berührt das Internet nicht. Die App kommuniziert über 127.0.0.1 mit dem Server (unter Windows sperrt eine begrenzte Firewall-Regel den Port zusätzlich gegenüber dem Netzwerk), die Modelldateien liegen im lokalen Cache und das Audio verlässt nie den Rechner — derselbe Datenschutz wie im Rest unserer lokalen Transkriptionsarchitektur.

Ehrliche Grenzen

  • Streaming tauscht etwas Genauigkeit gegen Unmittelbarkeit. ~6.9% beim Streaming gegenüber 5.91% für NVIDIAs bestes englisches Batch-Modell auf denselben Benchmarks. Da das übernommene Transkript jetzt aus dem Stream kommt, ist das der gewählte Kompromiss. Zählt nur das Endergebnis, bleibt ein Offline-Modell von Parakeet die genauere Wahl.
  • Die Sprachabdeckung ist kleiner als bei Whisper. Das mehrsprachige Modell unterstützt 15 transkriptionsbereite Sprachen, Whisper dagegen 99. Streaming auf Mandarin oder Thai ist noch nicht verfügbar.
  • Teilergebnisse bewegen sich. Die Hypothese wird mit neuem Kontext revidiert. Wir betrachten das sichtbare Stabilisieren als Vorteil; wer es ablenkend findet, kann die Vorschau deaktivieren und wie zuvor diktieren.
  • Es belegt weitere 650MB wenn bereits ein Offline-Modell vorhanden ist — der Preis eines zweiten, für eine andere Aufgabe optimierten Systems.

Ein Modell in OpenWhispr auswählen

GewünschtModell
Englische Live-Vorschau beim DiktierenNemotron Speech Streaming EN 0.6B
Live-Vorschau auf Spanisch, Japanisch, Arabisch, Hindi…Nemotron 3.5 ASR Streaming 0.6B
Maximale englische Genauigkeit, Live-Text unwichtigParakeet Unified EN 0.6B
Eine Sprache außerhalb des NVIDIA-AngebotsWhisper (turbo oder large)

Alle Modelle stehen in den Einstellungen zur Auswahl; den vollständigen Katalog mit Größen und Kompromissen findest du auf der Modellseite. OpenWhispr ist kostenlos, Open Source und für macOS, Windows und Linux erhältlich.

Häufig gestellte Fragen

Was ist Streaming-Spracherkennung?

Streaming- oder „Online“-Spracherkennung transkribiert Audio noch während des Sprechens und liefert innerhalb eines festen Latenzrahmens Teilergebnisse — typischerweise nach 80 Millisekunden bis etwa einer Sekunde. Batch- oder „Offline“-Modelle wie Whisper warten dagegen bis zum Ende der Aufnahme und verarbeiten sie vollständig. Streaming ermöglicht Live-Untertitel, Sprachagenten und Diktiervorschauen, in denen der Text beim Sprechen erscheint.

Kann Streaming-Spracherkennung lokal ohne GPU laufen?

Ja. NVIDIAs Nemotron-Streaming-Modelle haben 600M Parameter, werden als INT8-quantisierte ONNX-Dateien mit rund 650MB ausgeliefert und laufen über sherpa-onnx in Echtzeit auf einer modernen CPU. Diese native Binärdatei benötigt weder Python noch PyTorch. OpenWhispr liefert die Konfiguration für macOS, Windows und Linux aus.

Was ist cache-bewusstes Streaming-ASR?

Bei dieser Architektur — NVIDIAs cache-bewusstem FastConformer — behält das Modell den internen Zustand des Encoders zwischen Audioabschnitten. Jeder neue Abschnitt wird einmal verarbeitet und nutzt den bereits zwischengespeicherten Kontext, statt überlappende Audiofenster erneut zu codieren. Dadurch ist Streaming mit niedriger Latenz effizient genug für eine Laptop-CPU.

Warum ändert sich der Text in der Live-Vorschau nachträglich?

Streaming-Modelle überarbeiten ihre Hypothese, sobald weiteres Audio eintrifft: Wortgrenzen oder gleich klingende Wörter lassen sich mit späterem Kontext besser auflösen, daher werden Teilergebnisse an Ort und Stelle ersetzt. Das ist beabsichtigt. Beim Stoppen leert OpenWhispr den Modellnachlauf und übernimmt den stabilisierten Streaming-Text als Transkript. Wird dieser Vorgang unterbrochen oder abgeschnitten, decodiert die App automatisch die gesamte Aufnahme neu; ein instabiler Stream wird nie zum eingefügten Text.

Ist Streaming-Transkription ungenauer als Batch-Verarbeitung?

Etwas — denn ein Streaming-Modell kennt zukünftiges Audio nicht. Nemotrons englisches Streaming-Modell erreicht bei 1.12-Sekunden-Abschnitten auf den Datensätzen des Open ASR Leaderboard durchschnittlich 6.93% Wortfehlerrate. Das liegt bemerkenswert nah an Batch-Modellen, aber hinter den 5.91% von NVIDIAs bestem englischen Batch-Modell. Für Live-Text und ein sofortiges Transkript beim Stoppen nimmt man diesen kleinen Abstand in Kauf; zählt maximale Genauigkeit mehr, ist ein Offline-Modell von Parakeet die bessere Wahl.

Welche Sprachen unterstützt Streaming in OpenWhispr?

Es gibt zwei Nemotron-Modelle: eines nur für Englisch und Nemotron 3.5 mit 15 transkriptionsbereiten Sprachen (Englisch, Spanisch, Französisch, Italienisch, Portugiesisch, Niederländisch, Deutsch, Türkisch, Russisch, Arabisch, Hindi, Japanisch, Koreanisch, Vietnamesisch und Ukrainisch) sowie automatischer Spracherkennung. Offline-Modelle wie Parakeet und Whisper decken mehr Sprachen ab, zeigen die Vorschau aber über gepufferte Abschnitte statt über einen Live-Stream.