Whisper-Halluzinationen: Warum es Zeilen wiederholt und Text erfindet
Whisper-Halluzinationen: warum es über Stille „Thank you for watching“ schreibt, Zeilen wiederholt, was jede Maßnahme kostet und wie du sie in SRT findest.
Whisper-Halluzinationen (englisch „Whisper hallucinations“) sind Text, den das Modell schreibt, obwohl ihn niemand gesprochen hat: „Thank you for watching“ über Stille, ein Untertitel-Credit oder eine Zeile, die eine Minute lang wiederholt wird. Zwei Einstellungen verhindern die meisten davon: Audio ohne Sprache herausfiltern und die Kontextübernahme abschalten, bei der das Modell seine eigene vorherige Ausgabe als Kontext nutzt. Die üblichen Whisper-Tools haben ab Werk keine der beiden Maßnahmen aktiviert.
Hier findest du die beiden Arten im Vergleich, warum jede entsteht, was wir gemessen haben, als eine davon unsere eigene App getroffen hat, was jede Maßnahme kostet, die Einstellungen für openai-whisper, faster-whisper und whisper.cpp und wie du in einer fertigen Untertiteldatei findest, was trotzdem durchrutscht.
Whisper-Halluzinationen im Vergleich
| Phantomphrase | Wiederholungsschleife | Verschluckte Sprache | |
|---|---|---|---|
| Was du siehst | „Thank you for watching“, „Thanks for watching“, ein Untertitel-Credit | Eine Zeile, die immer wieder geschrieben wird, oft ohne Zeichensetzung | Ein Satz, der im Transkript fehlt |
| Wo es auftritt | Stille, Musik, Applaus, Raumgeräusche | Überall; einmal gestartet, läuft sie weiter | Leise Anfänge, kurze Zwischenrufe |
| Ursache | Audio ohne Sprache erreicht den Decoder | Jedes Fenster wird mit der vorherigen Ausgabe als Prompt dekodiert | Wie ein bestimmtes Modell mit diesem Audio umgeht |
| Erste Maßnahme | Ein Sprachaktivitätsfilter (VAD) | Den vorherigen Text nicht mehr als Kontext verwenden | Ein zweites Modell auf demselben Clip probieren |
| So zeigt es sich in Untertiteln | Eine zusätzliche Untertitelzeile über einer Pause | Eine Untertitelzeile, die an einem Satz festhängt, oder Untertitelzeilen ohne Satzgrenzen | Eine Lücke, wo eine Zeile stehen müsste |
Die dritte Spalte ist der umgekehrte Fehler: Sprache, die übersprungen wurde, statt Text, der erfunden wurde. Er hat andere Ursachen und Maßnahmen, die der Whisper-Modellvergleich behandelt. Alles Weitere unten betrifft die ersten beiden.
Warum schreibt Whisper Text, den niemand gesprochen hat?
Whisper arbeitet das Audio in Fenstern von 30 Sekunden ab, und sein Decoder schreibt für jedes Fenster Text. Es gibt zwar eine No-Speech-Prüfung, doch sie ist nur ein Schwellenwert auf einer Wahrscheinlichkeit, und Fenster mit Musik, Applaus oder Raumton kommen regelmäßig daran vorbei und werden zu Wörtern. Die Wörter, die es wählt, verraten die Ursache. Whisper wurde mit 680.000 Stunden Web-Audio samt Transkripten trainiert, und die Schlussformeln und Untertitel-Credits, die in diesen Texten häufig vorkommen, sind die übliche Erklärung dafür, was es schreibt, wenn es nichts zu transkribieren gibt.
Die Zahlen sind nicht klein. In einer Studie von 2025 ließen Forschende der AGH University of Kraków large-v3 301.317-mal auf Audio ohne Sprache laufen — Rauschen, Musik, Umgebungsgeräusche. In 40,3 % der Fälle erzeugte es Text, und 9,1 % dieser Halluzinationen waren Schleifen. Am häufigsten kamen „thank you“ (24,76 % der Halluzinationen) und „thanks for watching“ (10,32 %) vor.
Bei echter Sprache ist die Quote weit niedriger, der Schaden aber größer. Die Studie Careless Whisper von 2024 stellte fest, dass etwa 1 % der Transkriptionen ganze Phrasen oder Sätze enthielten, die im Audio gar nicht vorkamen, dass 38 % davon ausdrückliche Schäden enthielten, etwa Gewalt fortzuschreiben, Zusammenhänge zu erfinden oder eine falsche Autorität zu suggerieren, und dass sie überproportional häufig Sprecher mit langen Pausen betrafen.
Bei Untertiteln sieht der Schaden konkret so aus: Eine halluzinierte Phrase kommt als perfekt formatierte Untertitelzeile über einer Pause an, und der Zuschauer liest sie als Dialog.
Warum aus einer fehlerhaften Zeile vierzig werden
Die Schleife hat eine andere Ursache. Whisper dekodiert jedes Fenster standardmäßig mit der eigenen vorherigen Ausgabe als Prompt (diese Kontextübernahme heißt in den Tools condition_on_previous_text), sodass der Kontext über die Fenster hinweg erhalten bleibt: Namen bleiben gleich geschrieben, und Sätze setzen sich fort. Dieselbe Funktion lässt ein schlechtes Fenster das nächste vergiften. Schreibt der Decoder eine Zeile zweimal, wird das nächste Fenster mit dieser Zeile vorbelegt und schreibt sie erneut. Die Dokumentation von faster-whisper zu condition_on_previous_text sagt es unverblümt: Ist die Option ausgeschaltet, wird das Modell „weniger anfällig dafür, in einer Fehlerschleife festzustecken, etwa in einer Wiederholungsschleife oder bei Zeitstempeln, die aus dem Takt geraten“.
Wir sind in unserer eigenen App vor dem Release darauf gestoßen und haben es deshalb gemessen: derselbe 101 Sekunden lange türkische Clip wie in unserem Modellvergleich, auf einer RTX 3060 Ti mit float16, wobei wir nur diese eine Option geändert haben.
large-v3, Kontextübernahme an | large-v3, Kontextübernahme aus | medium, Kontextübernahme an | medium, Kontextübernahme aus | |
|---|---|---|---|---|
| Satzschlusszeichen im Transkript | 0 | 30 | 47 | 30 |
| Wiederholte Phrasen (6-Gramme) | 9 | 0 | 0 | 0 |
Die Standardeinstellung hat large-v3 ruiniert, medium blieb unberührt. Mit Kontextübernahme schrieb das größere Modell überhaupt keine Satzschlusszeichen und erzeugte neun wiederholte Phrasen; das kleinere war bei demselben Audio mit denselben Einstellungen in Ordnung. In einem Durchlauf enthielt eine einzige Untertitelzeile dies, innerhalb von 0,12 Sekunden Audio:
[58.26 -> 58.38] bir level oldu bir level oldu bir level oldu bir level oldu
bir level oldu bir level oldu bir level oldu bir level oldu
Die fehlende Zeichensetzung ist ebenso wichtig wie die Wiederholungen. Untertitel-Tools zerlegen ein Transkript an Satzgrenzen in Untertitelzeilen, und ein Transkript ohne Punkte gibt ihnen nichts, woran sie schneiden können: Du bekommst riesige Untertitelzeilen oder, bei einer nachlässigen Zeilentrennung, Untertitelzeilen mit nur einem Wort. Das Ausschalten der Kontextübernahme hat die Zeichensetzung wiederhergestellt, ohne das Modell zu ändern.
Ein einzelner Clip ist kein Benchmark. Er zeigt aber zwei Dinge: Die Modellgröße schützt nicht, und die billigste Maßnahme ist eine Einstellung.
Kostet das Abschalten der Kontextübernahme etwas?
Ja. Jede Maßnahme gegen Halluzinationen hat ihren Preis, und es lohnt sich, ihn zu kennen, bevor du sie anwendest:
- Einheitlichkeit über die Fenster hinweg. Ohne den vorherigen Text als Kontext können Schreibweise und Zeichensetzung abdriften; die Dokumentation warnt, dass das Abschalten „den Text über die Fenster hinweg uneinheitlich machen kann“. In der Praxis: ein Name, der in einer langen Datei auf zwei Arten geschrieben wird.
- Dein Initial Prompt (Starttext) endet beim ersten Fenster. Tools geben Whisper eine Wortliste — Namen, Marken, Fachjargon — als Initial Prompt mit, und ohne Kontextübernahme prägt sie nur das erste Fenster.
--carry_initial_prompt Truebei openai-whisper und--carry-initial-promptbei whisper.cpp senden sie für jedes Fenster erneut; in faster-whisper übernimmt die Optionhotwordsdiese Aufgabe. - Wiederholungsstrafen löschen echte Wiederholungen.
repetition_penaltyundno_repeat_ngram_sizewürden eine Schleife unterdrücken, können sie aber nicht von einem Sprecher unterscheiden, der sich selbst wiederholt. Unser Testclip enthält genau das: einen Satz, absichtlich zweimal hintereinander gesagt. Eine Wiederholungsstrafe, die ihn entfernt, löscht Dialog. - Ein Sprachaktivitätsfilter kann leise Sprache abschneiden. Der Filter entscheidet, was als Sprache gilt, bevor Whisper etwas hört, und bei leisen Anfängen und bandbegrenztem Audio wie Telefongesprächen verpasst er Wörter. AutoSubs hat im September 2026 einen Schalter ergänzt, mit dem sich das Überspringen von Stille genau für diesen Fall ausschalten lässt.
hallucination_silence_thresholdbraucht Wort-Zeitstempel und ist kein Heilmittel. Es überspringt lange Stille rund um eine vermutete Halluzination. Bei unserem Clip machte es keinen messbaren Unterschied: Die Zeile, die wir für erfunden hielten, entpuppte sich als echte Sprache.
Nichts davon kommt auch nur annähernd an die Kosten einer Schleife heran. Ein falsch geschriebener Name ist ein einziges Suchen und Ersetzen; eine Wiederholungsschleife ist eine Passage, die du erneut transkribieren musst.
So verhinderst du Whisper-Halluzinationen, Tool für Tool
| openai-whisper | faster-whisper | whisper.cpp | Sablate | |
|---|---|---|---|---|
| Sprachaktivitätsfilter | Nicht eingebaut | vad_filter=True, standardmäßig nur in der Batch-Pipeline aktiv | --vad mit einem Silero-Modell | Immer an |
| Kontextübernahme abschalten | --condition_on_previous_text False | condition_on_previous_text=False | -mc 0 | Immer aus |
| Stille nach vermuteter Halluzination überspringen | --hallucination_silence_threshold | hallucination_silence_threshold | Kein Äquivalent | Nein |
| Den Prompt in jedem Fenster erneut senden | --carry_initial_prompt True | hotwords | --carry-initial-prompt | Nein |
| Du kannst diese Einstellungen ändern | Ja | Ja | Ja | Nein |
Die letzten drei Zeilen sind Sablates ehrlicher Schwachpunkt: Beide Maßnahmen sind immer aktiv, und keine dieser Einstellungen ist in der App zugänglich. Willst du den Filter abstimmen oder einen Prompt über Fenster hinweg mitführen, lassen dich die offenen Tools das tun.
Für openai-whisper bei einer Interviewdatei:
whisper talk.mp4 --model turbo --output_format srt --condition_on_previous_text False
openai-whisper hat keinen eigenen Sprachaktivitätsfilter, dieser Befehl behebt also die Schleife, nicht die Phantomphrasen; für diese bietet es nur eine Teillösung: --hallucination_silence_threshold mit --word_timestamps True. whisper.cpp bringt beide Maßnahmen mit, und sein Kommandozeilen-Tool erwartet 16-Bit-WAV:
ffmpeg -i talk.mp4 -ar 16000 -ac 1 -c:a pcm_s16le talk.wav
./build/bin/whisper-cli -m models/ggml-large-v3-turbo.bin -f talk.wav -osrt -mc 0 --vad -vm models/ggml-silero-v6.2.0.bin
-mc 0 behält keinen Textkontext zwischen den Fenstern, und das Silero-Modell stammt aus dem Skript download-vad-model.sh des Repositorys. In Python übernimmt faster-whisper beides als Argumente:
from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo")
segments, info = model.transcribe("talk.mp4", vad_filter=True, condition_on_previous_text=False)
Wie findest du Halluzinationen in einer fertigen SRT-Datei?
Keine Einstellung beseitigt jede Halluzination, also prüfe die Datei. Drei Befehle fangen das meiste ab, was trotzdem durchgerutscht ist, unter macOS und Linux oder unter Windows in Git Bash und WSL:
grep -n -i -E "thank(s| you) for watching|amara\.org|subtitles by" talk.srt
awk '{ sub(/\r$/, "") } NF && !/-->/ && !/^[0-9]+$/ { if ($0 == prev) print NR": "$0; prev = $0 }' talk.srt
perl -ne 'print "$.: $_" if /(\S+(?: \S+){1,4}) \1 \1/' talk.srt
Der erste findet gängige Schlussformeln und Untertitel-Credits. Der zweite gibt jede Textzeile aus, die mit der davor identisch ist, so sieht eine Schleife meist aus, sobald sie in Untertitelzeilen zerlegt wurde. Der dritte erwischt eine Phrase aus zwei bis fünf Wörtern, die innerhalb einer Zeile dreimal wiederholt wird.
Behandle jeden Treffer als Frage, nicht als Urteil. Menschen sagen tatsächlich „thank you“, und sie wiederholen sich tatsächlich. Spiele die Untertitelzeile gegen das Audio ab und behalte oder lösche sie dann. Phantomphrasen über langen Pausen und Musik passen auf kein Muster; die einzige Kontrolle dafür ist, die Untertitelzeilen zu lesen, die über Abschnitten ohne Sprache liegen.
Wann du welche Maßnahme einsetzt
„Ich untertitele Vorträge, Interviews oder Vorlesungen.“ Schalte den Sprachaktivitätsfilter ein und die Kontextübernahme aus. Dieses Paar ist die sinnvolle Standardeinstellung für alles Gesprochene, das du untertiteln willst.
„Die Aufnahme hat lange Stille oder ein Musikbett.“ Hier ist der Filter am wichtigsten. Lies die Untertitelzeilen über der Musik trotzdem.
„Es ist ein Telefongespräch oder eine leise, bandbegrenzte Aufnahme.“ Lass es einmal mit und einmal ohne Filter laufen und vergleiche, was fehlt. Ein Filter, der leise Wörter verschluckt, ist schlimmer als ein verirrtes „thank you“.
„Ich verlasse mich bei Namen auf einen Initial Prompt.“ Schalte die Kontextübernahme aus und sende den Prompt mit den Flags von oben für jedes Fenster erneut, oder korrigiere die Namen hinterher mit Suchen und Ersetzen.
„Zeilen wiederholen sich trotz beider Maßnahmen.“ Probiere ein anderes Modell mit derselben Datei, bevor du zu einer Wiederholungsstrafe greifst; unser Clip lief bei large-v3 in eine Schleife und bei medium nicht. Brauchst du trotzdem no_repeat_ngram_size, hör dir die Aufnahme durch und achte auf Zeilen, die es womöglich entfernt hat.
Wie Sablate damit umgeht
Beide Maßnahmen sind in Sablate immer aktiv: ein Sprachaktivitätsfilter vor dem Modell und keine Kontextübernahme aus dem vorherigen Text. Sablate führt Whisper auf deinem eigenen Rechner aus, und wir haben die Kontextübernahme nach der Messung oben ausgeschaltet. Außerdem haben wir die Zeilentrennung repariert, die ein Transkript ohne Zeichensetzung in Untertitelzeilen mit je einem Wort zerlegt hat.
Zwei Konsequenzen solltest du kennen. Das eigene Vokabular unter Defaults → Custom vocabulary erreicht Whisper als Initial Prompt, prägt also ohne Kontextübernahme nur das erste Fenster, grob die ersten 30 Sekunden Sprache; Namen später in einer langen Aufnahme sind ein Fall für Find & replace im Editor, das jeweils nur eine Sprache bearbeitet. Und weil die Einstellungen fest sind, gibt es nichts zu justieren. Muss der Filter für eine Aufnahme aus sein, nimm eines der offenen Tools von oben.
Im Editor kannst du die Untertitelzeilen bei laufendem Video durchgehen, was der schnellste Weg ist, die Treffer der obigen Befehle zu beurteilen, und der Export schreibt die korrigierten Untertitel als .srt, .vtt oder als eingebranntes Video. Fast und Balanced laufen im kostenlosen Plan; Accurate und Best gehören zu Pro. Lade Sablate für Windows oder Mac herunter und probiere es mit deinem eigenen Filmmaterial aus.
Kurz gesagt
Whisper halluziniert auf zwei Arten: Es schreibt Standardsätze über Audio ohne Sprache, und es gerät in eine Schleife, wenn ein schlechtes Fenster das nächste speist. Ein Sprachaktivitätsfilter behebt das Erste, das Ausschalten von condition_on_previous_text das Zweite, und die üblichen Tools haben ab Werk keines von beiden aktiviert. Beide Maßnahmen kosten wenig im Vergleich zu einer Schleife. Ein größeres Modell ist kein sichereres. Und was auch immer du änderst: Lies die fertige Untertiteldatei, bevor es jemand anderes tut — die Anleitung zum Erstellen von SRT-Dateien enthält die Prüfungen für das Format selbst.