So funktioniert es
Whisper-Transkription lokal, in deinem Browser
Die Seite lässt ein offenes Spracherkennungsmodell, Whisper, im Tab deines Browsers laufen. Hier steht, was sie herunterlädt, wie sie eine lange Datei liest, ohne sie ganz zu laden, wie die Absätze entstehen und warum die Dauer von Gerät zu Gerät schwankt.
Drei Schritte, alle in deinem Browser
1. Dein Browser liest die Datei
Wo dein Browser es kann, nimmt ein Worker in deinem Tab die Tonspur in Stücken von 30 Sekunden und wandelt sie in Mono-Ton mit 16 kHz um, den das Modell erwartet.
2. Whisper transkribiert in Fenstern
Die Engine, whisper.cpp als WebAssembly kompiliert, transkribiert etwa drei Minuten Ton auf einmal und gibt der Seite den Text jedes Fensters.
3. Die Seite ordnet den Text
Die Wörter werden an Pausen zu Absätzen gruppiert, auf Wunsch mit Zeitstempel, bereit zum Durchsuchen, Kopieren oder Speichern als TXT.
Das Modell: Whisper, base oder small
Whisper ist ein Spracherkennungsmodell, das OpenAI 2022 mit Code und Gewichten unter der MIT-Lizenz veröffentlicht hat. Es hört den Ton in Abschnitten von 30 Sekunden und schreibt die Wörter auf, mit einer Zeit für jedes Segment. Diese Website bietet zwei Größen davon an:
- Das kleinere Modell (Standard) ist Whisper base, mit 5 Bit pro Gewicht gespeichert. Es ist der leichtere Download.
- Das größere Modell ist Whisper small, mit 8 Bit pro Gewicht gespeichert: ein größerer Download, der mehr Arbeitsspeicher braucht.
Gewichte mit weniger Bits zu speichern (Quantisierung) macht ein Modell kleiner, kostet aber etwas Genauigkeit. Wie die beiden Größen auf dieser Engine abschneiden, Sprache für Sprache, veröffentlichen wir noch nicht: Wir messen, bevor wir beschreiben. Das Sprachmenü führt die Sprachen auf, die sich bei Whisper einstellen lassen; bei der automatischen Erkennung wählt die Engine die Sprache im ersten Fenster, in dem gesprochen wird, und behält sie für den Rest der Datei.
Die Engine: whisper.cpp als WebAssembly
Das Modell läuft in whisper.cpp, einer Open-Source-Fassung von Whisper in C/C++, die wir mit einer kleinen eigenen Schnittstelle als WebAssembly kompilieren (ein Programmformat, das jeder aktuelle Browser ausführen kann). Es gibt drei Versionen, und die Seite probiert sie in dieser Reihenfolge:
- WebGPU, wenn dein Browser einen Grafikadapter mit den Funktionen bietet, die die Engine braucht. Auf einer echten Grafikkarte haben wir diese Version noch nicht gemessen, deshalb behaupten wir dazu nichts.
- WebAssembly auf mehreren Threads, einer pro logischem Kern, den dein Browser meldet. Threads brauchen einen ursprungsübergreifend isolierten Tab, und den liefern die Header der Website.
- WebAssembly auf einem Thread, wenn keine Threads verfügbar sind oder dein Browser höchstens zwei logische Kerne meldet. Das Ergebnis ist von derselben Art.
Startet eine Version nicht, oder scheitert die WebGPU-Version mitten in der Arbeit, startet die Seite die Engine mit der nächsten Version neu und macht weiter. Die Zeile über dem Transkript nennt die Version, die gearbeitet hat.
Was die Seite herunterlädt, und wann
Beim Öffnen lädt nur die Seite mit ihren eigenen Dateien. Engine und Modell kommen von dieser Website, wenn du deine erste Datei hinzufügst:
| Datei | Größe | Wann |
|---|---|---|
| Engine, Mehr-Thread- oder Ein-Thread-Version (eine der beiden) | etwa 1,5 MB | Deine erste Datei |
| Kleineres Modell (Whisper base, 5 Bit), Standard | 59,7 MB in 3 Teilen | Deine erste Datei damit |
| Größeres Modell (Whisper small, 8 Bit) | 264,5 MB in 13 Teilen | Nur, wenn du es wählst |
| Sprachdetektor (Silero VAD) | 0,9 MB | Deine erste Datei |
| Medienleser (Mediabunny), Teil der Skripte der Seite | etwa 0,3 MB | Deine erste Datei |
| Engine, WebGPU-Version | etwa 3,4 MB | Nur, wenn der Browser einen nutzbaren WebGPU-Adapter bietet |
Die Modelle kommen in Teilen von höchstens 20 MiB, weil der Hoster keine Einzeldatei über 25 MiB ausliefert. Bevor die Engine einen Teil nutzt, vergleicht dein Browser ihn mit seinem SHA-256-Fingerabdruck, sodass ein beschädigter Download abgelehnt wird, statt ein falsches Transkript zu liefern. Die geprüften Teile bleiben im Cache Storage deines Browsers, wenn er Platz dafür hat, und deine nächste Datei und dein nächster Besuch sparen sich den Download.
Warum deine Aufnahme nie hochgeladen wird
Jeder Schritt läuft in deinem Tab, die Website hat keinen Endpunkt, der eine Datei annehmen könnte, und die Seite darf sich nur mit dieser Website verbinden. Die Prüfung, dass deine Aufnahme nicht hochgeladen wird, steht auf der Seite Datenschutz und Sicherheit, mit den Schritten, um die Anfragen selbst zu beobachten.
Wie eine lange Datei gelesen und transkribiert wird
Eine einstündige Aufnahme ergibt dekodiert als Mono mit 16 kHz etwa 115 MB Ton (3.600 Sekunden x 16.000 Samples x 2 Bytes, oder das Doppelte als 32-Bit-Zahlen, mit denen die Engine rechnet). Deshalb dekodiert die Seite die Datei, wo immer der Browser es zulässt, nicht auf einmal. Ein zweiter Worker öffnet die Datei mit Mediabunny, dekodiert ihre Tonspur mit dem Decoder des Browsers, 30 Sekunden auf einmal, und reicht das nächste Stück erst weiter, wenn die Engine dafür bereit ist.
Die Stücke werden zu Fenstern von etwa drei Minuten zusammengesetzt. Jedes Fenster endet an der leisesten halben Sekunde seiner letzten 15 Sekunden, damit ein Schnitt selten mitten in ein Wort fällt, und die Fenster folgen ohne Lücke und ohne Überlappung aufeinander. Ein kleiner Sprachdetektor markiert die Abschnitte mit Sprache in jedem Fenster, so überspringt das Modell die Stille, statt Wörter hineinzuschreiben. Jedes Fenster wird mit dem Ende des vorigen Texts als Kontext transkribiert, was einem Satz über einen Schnitt hinweg hilft, und seine Zeiten werden wieder auf die Uhr der Datei gesetzt.
Sobald ein Fenster fertig ist, erscheinen seine Absätze auf der Seite: Du kannst lesen und suchen, während der Rest läuft. Hat dein Browser keinen Decoder für den Ton einer Datei, dekodiert die Seite ersatzweise die ganze Datei auf einmal und lehnt dann Dateien über 500 MB oder über 1 Stunde ab.
Wie Absätze und Zeitstempel entstehen
Whisper liefert Textsegmente mit Start- und Endzeit und eine Zeit für jedes Wort. Die Seite fügt sie zu Absätzen zusammen: Ein neuer beginnt an einer Pause von 2 Sekunden oder mehr, gemessen an den Zeiten der Wörter davor und danach, und ein Absatz, der länger als etwa 600 Zeichen wird, endet am nächsten Satzende. Es gibt keine Sprecherkennzeichnung, ein Absatzwechsel steht also für eine Pause oder einen langen Redeabschnitt, nie für eine andere Stimme.
Der Zeitstempel eines Absatzes ist die Startzeit seines ersten Worts, geschrieben als [hh:mm:ss] und auf die Sekunde abgerundet. Er ist ungefähr: gut, um eine Stelle in der Aufnahme zu finden, nicht für Untertitel. Text kopieren und TXT herunterladen schreiben dieselben Absätze, getrennt durch eine Leerzeile und mit den Zeitstempeln, wenn sie eingeblendet sind.
Warum die Dauer schwankt
Die Arbeit erledigt dein Prozessor, also braucht dieselbe Datei auf einem neuen Laptop anders lang als auf einem alten, und Modell und Länge der Aufnahme spielen mit. Deshalb verspricht die Seite kein Tempo. Sobald die Engine den ersten Fortschritt meldet, misst die Seite, wie viele Sekunden Arbeit jede Sekunde Ton auf deinem Gerät kostet, glättet das über die Fenster, damit ein langsamer Moment es nicht verzerrt, und zeigt die Restzeit.
Was dein Gerät braucht
- Einen aktuellen Browser mit WebAssembly. Chrome, Edge, Firefox und Safari haben es; unser automatischer Test läuft in Chromium.
- Genug freien Arbeitsspeicher für das Modell und ein Fenster Ton. Das größere Modell braucht mehr; gemessene Zahlen veröffentlichen wir, sobald wir sie haben.
- Eine Verbindung für die erste Datei. Das Modell bleibt im Speicher des Browsers, wenn dort Platz ist, und spätere Besuche laden es nicht noch einmal.
Die Open-Source-Komponenten der Engine, die Modelle und der Medienleser stehen mit ihren Lizenzen auf der Seite Open-Source-Nachweise.
Fragen zur Engine
Ist das dasselbe Whisper, das OpenAI veröffentlicht hat?
Es ist dasselbe Modell: OpenAI hat Code und Gewichte von Whisper unter der MIT-Lizenz veröffentlicht. Diese Seite nutzt diese Gewichte im Dateiformat des Open-Source-Projekts whisper.cpp, quantisiert (mit weniger Bits pro Gewicht gespeichert), damit der Download kleiner ist. Die Engine ist whisper.cpp als WebAssembly, nicht der Python-Code von OpenAI, und keine Anfrage geht an OpenAI.
Nutzt es meine Grafikkarte?
Es versucht es. Bietet dein Browser WebGPU mit den Funktionen, die die Engine braucht, startet die Seite zuerst die WebGPU-Version und wechselt bei einem Fehler von selbst zu den CPU-Versionen. Unsere Testrechner haben keine Grafikkarte, deshalb haben wir bei der WebGPU-Version nur geprüft, dass sie sauber auf die CPU zurückfällt. Die Zeile über dem Transkript nennt die Version, die gearbeitet hat.
Warum wurde das Modell erneut geladen?
Dein Browser behält das Modell im Cache Storage dieser Website, bis du die Websitedaten löschst oder der Browser es löscht, um Platz zu schaffen. Danach lädt die nächste Datei es erneut. Was dein Browser behält und wie du es löschst erklärt die Einzelheiten.
Was passiert, wenn ich auf Abbrechen drücke?
Die Seite stoppt die Engine sofort, indem sie den Worker schließt, in dem sie läuft, und verwirft die bisher erstellten Absätze. Deine nächste Datei startet eine neue Engine und holt das Modell aus dem Speicher des Browsers, das Modell wird also nicht erneut geladen.
Quellen
- OpenAI, Whisper-Repository: Der Code des Modells, seine MIT-Lizenz und die Tabelle der Größen (base und small).
- Radford u. a., Robust Speech Recognition via Large-Scale Weak Supervision (2022): Der Artikel, der Whisper vorstellt.
- whisper.cpp: Die C/C++-Fassung von Whisper, die die Engine als WebAssembly kompiliert (Version 1.9.4), und ihre quantisierten Modelldateien.
- Silero VAD: Der Sprachaktivitätsdetektor, der die Abschnitte mit Sprache findet.
- Mediabunny: Die Medienbibliothek, die die Tonspur deiner Datei stückweise liest.
- MDN, AudioDecoder (WebCodecs): Der Decoder des Browsers selbst, der den komprimierten Ton in Samples umwandelt.
- MDN, CacheStorage: Wo die geprüften Teile des Modells zwischen Besuchen bleiben.
- web.dev, Making your website cross-origin isolated using COOP and COEP: Warum die Website diese Header sendet: WebAssembly-Threads brauchen SharedArrayBuffer.
- Cloudflare Workers, Limits: Die Grenze von 25 MiB pro statischer Datei, der Grund, warum die Modelle in Teilen kommen.
Probier es mit einer Aufnahme
Die Transkription läuft in deinem Browser. Deine Datei verlässt nie dein Gerät.