★ Reading this for free? Get 20 structured AI courses + per-chapter AI tutor — the first chapter of every course free, no card.Start free in 30 seconds
Troubleshooting

Whisper Keeps Repeating Itself: Fix Hallucinated Lines

September 13, 2026
12 min read
LocalAimaster Research Team

Want to go deeper than this article?

Free account unlocks the first chapter of all 25 courses — RAG, agents, MCP, voice AI, MLOps, real GitHub repos.

📚AI Learning Path

Voice working locally? Build the whole pipeline. Whisper, TTS, and voice cloning wired into real projects — hands-on courses. First chapter free, no card.

Start free
Or own it for life — Lifetime $149, pay once

Short answer: turn on the VAD filter and turn off previous-text conditioning. In faster-whisper that is vad_filter=True, condition_on_previous_text=False. The first stops silence ever reaching the model, which is where the phantom "Thank you for watching!" comes from. The second breaks the feedback loop that turns one repeated line into forty. Everything below is what to do when those two are not enough — and what each fix costs you in accuracy.

Parameter names and defaults on this page were read from the current faster-whisper source (latest release v1.2.1, 2025-10-31) and openai/whisper transcribe.py. They are not identical between the two projects, and that mismatch is itself a common cause of "I set the flag and nothing changed" — there is a translation table below.


The Two-Line Fix

These two lines resolve the majority of hallucination reports. Try them before you change models, re-encode audio, or read any further.

from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cuda", compute_type="float16")

segments, info = model.transcribe(
    "meeting.wav",
    vad_filter=True,                    # default is False in WhisperModel.transcribe
    condition_on_previous_text=False,   # default is True
)

for s in segments:
    print(f"[{s.start:.2f} -> {s.end:.2f}] {s.text}")

Two things in that snippet are worth stopping on.

vad_filter defaults to False in WhisperModel.transcribe() — but to True in BatchedInferencePipeline.transcribe(). Same library, same version, opposite default. We have watched people conclude that VAD "does nothing" because their benchmark script used the batched pipeline (where it was already on) and their production script used the plain model class (where it was not). Check which class your code calls.

condition_on_previous_text defaults to True in openai/whisper and in faster-whisper's WhisperModel.transcribe() — the batched pipeline is the exception, defaulting it to False. That default is the single design decision behind the classic 40-repeats transcript, and it exists for a good reason — cross-segment context genuinely improves proper nouns and jargon. It just fails catastrophically rather than gracefully.


Reading articles is good. Building is better.

Free account = the first chapter of all 25 courses, with a per-chapter AI tutor. No card.

Symptom 1: "Thank You for Watching" Over Silence

Cause: Whisper always emits text for a window, and silent windows have no answer, so the model falls back to the most likely thing in its training data — subtitle boilerplate.

The strings people paste into Google are consistent across every language and every project: "Thank you for watching!", "Subtitles by the Amara.org community", "Please subscribe", channel outros. These are not random. They are the highest-probability text for a 30-second window that contains no speech, learned from a training corpus full of subtitle files whose final lines look exactly like that.

The important consequence: you cannot fix this with a decoding parameter alone, because the problem is the input. Thresholds like no_speech_threshold (default 0.6) and log_prob_threshold (default -1.0) are meant to suppress this, and they help, but they are probabilistic filters applied after the model has already generated a confident-looking sentence. The reliable fix is to never send the silence.

segments, info = model.transcribe(
    "lecture.wav",
    vad_filter=True,
    vad_parameters=dict(
        threshold=0.5,                  # Silero speech probability cutoff
        min_silence_duration_ms=2000,   # library default
        speech_pad_ms=400,              # library default
    ),
)

faster-whisper runs Silero VAD (upgraded to Silero-VAD V6 in the v1.2.1 release) to find speech regions and hands the model only those. Silence never becomes a 30-second window, so there is nothing for the model to fill.

If you are transcribing long recordings with substantial dead air — lectures with pauses, security-camera audio, interview recordings with setup time at the front — this is the whole fix. See our faster-whisper guide for the install and model-size side, and local AI subtitles with Whisper if the output is destined for SRT.


Symptom 2: The Same Paragraph, Forty Times

Cause: condition_on_previous_text=True feeds the text Whisper just produced back in as the prompt for the next window. Once a repetition starts, the model is being told that repeating is what this recording sounds like.

This is why the failure has its distinctive shape: it does not produce forty scattered errors, it produces one error that then runs to the end of the file. The loop is self-reinforcing by construction.

segments, info = model.transcribe(
    "interview.wav",
    condition_on_previous_text=False,
)

If you would rather not lose context across the whole file, faster-whisper has a middle setting: prompt_reset_on_temperature, default 0.5. The prompt is kept while decoding is going well and dropped once the decoder has already fallen back past that temperature — that is, at the point where things are starting to go wrong anyway. It is a reasonable default and worth trying before you turn conditioning off entirely.

faster-whisper also exposes two sequence-level penalties that openai/whisper does not: repetition_penalty (default 1, i.e. off) and no_repeat_ngram_size (default 0, i.e. off). These are blunt instruments — a no_repeat_ngram_size of 3 will also block legitimate repeated phrases, and transcripts of real meetings contain plenty of those. Reach for them last, and only for audio where you know repetition is never genuine.


Symptom 3: Loops That Survive Both Fixes

Cause, most often: someone disabled the temperature fallback to make runs deterministic, and removed the guardrail that catches degenerate output.

Whisper's default temperature is not a single value. It is a fallback ladder — (0.0, 0.2, 0.4, 0.6, 0.8, 1.0) in openai/whisper, and the same list in faster-whisper. Decoding starts greedy at 0.0; if the result trips a quality check, it retries the window at a higher temperature. Two checks drive that retry:

CheckDefaultWhat trips it
compression_ratio_threshold2.4The output gzip-compresses too well — the signature of repeated text
log_prob_threshold (openai/whisper: logprob_threshold)-1.0The model's own average confidence is too low
no_speech_threshold0.6The no-speech token probability is high enough to call the window silent

The compression-ratio check exists precisely to catch repetition loops: text that says the same thing forty times compresses far better than natural speech does. If you passed temperature=0 to make output reproducible, you disabled the retry that this check triggers. You get determinism and you keep the loop. Put the list back.

The second-line tool is hallucination_silence_threshold, which defaults to None (off) in both projects. openai/whisper's docstring is explicit about the catch: it applies "when word_timestamps is True", skipping silent periods longer than the threshold in seconds when a possible hallucination is detected. Set it without word timestamps and it does nothing — which is exactly why it has a reputation for being broken.

segments, info = model.transcribe(
    "long_recording.wav",
    vad_filter=True,
    condition_on_previous_text=False,
    word_timestamps=True,               # REQUIRED for the next line to do anything
    hallucination_silence_threshold=2.0,
    temperature=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0],
)

Word timestamps cost extra compute, so this is a fix to apply when you need it rather than by default. If you want word-level alignment anyway, WhisperX does that job properly with a separate alignment model.


Own it instead of renting it

Run this on your own machine and stop paying every month

Pay once and keep it. No renewal, no per-token bill, and nothing you feed it ever leaves your hardware.

Parameter Names by Engine

The names are not the same across projects, and a silently ignored keyword argument is the most common reason a "fix" appears not to work.

What you wantopenai/whisperfaster-whisperwhisper.cpp
Stop sending silence to the modelnot built invad_filter=True, vad_parameters--vad with --vad-model
Break the repetition feedback loopcondition_on_previous_text=Falsecondition_on_previous_text=False
Confidence floorlogprob_threshold (-1.0)log_prob_threshold (-1.0)
Repetition guardrailcompression_ratio_threshold (2.4)compression_ratio_threshold (2.4)
Silence detection thresholdno_speech_threshold (0.6)no_speech_threshold (0.6)
Skip long silences on suspicionhallucination_silence_threshold (None)hallucination_silence_threshold (None)
Partial context resetprompt_reset_on_temperature (0.5)
Token-level repetition penaltyrepetition_penalty (1), no_repeat_ngram_size (0)

Note logprob_threshold versus log_prob_threshold. One underscore. Both projects will accept a wrong keyword into **decode_options or reject it depending on the call path, and neither will tell you your intended fix did nothing.


Tuning the VAD (When the Default Clips Speech)

If VAD fixed the hallucinations but ate the first word of quiet sentences, adjust speech_pad_ms and threshold — in that order.

These are faster-whisper's VadOptions defaults, read from the library source:

OptionDefaultWhat it does
threshold0.5Silero speech probability; chunks above this are treated as speech
neg_thresholdNoneBelow this probability it is always silence — used to decide where speech ends
min_speech_duration_ms0Speech chunks shorter than this are discarded
max_speech_duration_sinfLonger chunks are split at the last long-enough silence
min_silence_duration_ms2000How much silence must follow before a chunk is closed
speech_pad_ms400Padding added to each side of every speech chunk

Practical reading of that table:

  • Clipped word onsets → raise speech_pad_ms (600-800 is a reasonable next step). This is the setting that exists for exactly this problem.
  • Quiet or distant speakers dropped entirely → lower threshold toward 0.3. You will let more noise through, which means more chances for the model to hallucinate on it — so lower it as little as you can get away with.
  • Music or applause being treated as speech → raise threshold toward 0.6-0.7. Music is the hardest case for any VAD and you should expect to keep some manual cleanup on music-heavy files.
  • Segments running absurdly long → set max_speech_duration_s to something finite, e.g. 30.

whisper.cpp and Parakeet

whisper.cpp has VAD built in now, and it is a flag, not a code change. The documentation names Silero-VAD as the supported model, downloaded with the bundled script:

./models/download-vad-model.sh silero-v6.2.0

./build/bin/whisper-cli \
  -m models/ggml-base.en.bin \
  -vm models/ggml-silero-v6.2.0.bin --vad \
  -f samples/jfk.wav

The VAD tuning flags mirror the Python ones: --vad-threshold, --vad-min-speech-duration-ms, --vad-min-silence-duration-ms, --vad-max-speech-duration-s, --vad-speech-pad-ms, and --vad-samples-overlap (how much audio to extend from each speech segment into the next).

Parakeet is the architecture answer, not a parameter answer. NVIDIA's parakeet-tdt-0.6b-v3 is a 600M-parameter FastConformer-TDT model under CC-BY-4.0, covering 25 European languages, reporting a 6.34% average WER on the Open ASR Leaderboard, and able to transcribe up to 24 minutes in one pass with full attention (or roughly 3 hours with local attention) per its model card. Because it is a transducer rather than an autoregressive decoder conditioned on its own previous text, it does not have the specific feedback structure that produces Whisper's forty-repeats failure.

We want to be careful here, because the internet is not: the Parakeet model card makes no hallucination-resistance claim. "Different architecture, different failure modes" is the honest statement. It has its own weaknesses — the card reports a large relative degradation at -5dB SNR, and the language coverage is European, not universal. If you are considering the switch, our Parakeet vs Whisper comparison is the fuller picture.


Measure It on Your Own Audio

Do not re-run a 90-minute file to test a hypothesis. Build a 3-minute test clip that contains all four failure triggers, and iterate on that.

The four inputs that provoke Whisper hallucination reliably: a long stretch of pure silence, a music-only or applause passage, low-SNR speech (distant mic, air conditioning), and a short non-English clip padded out to a 30-second window. Concatenate them:

# 45s of silence, then your three real problem clips
ffmpeg -f lavfi -i anullsrc=r=16000:cl=mono -t 45 silence.wav
ffmpeg -i "concat:silence.wav|music.wav|quiet_speech.wav|foreign_clip.wav" \
  -ar 16000 -ac 1 hallucination_test.wav

Then run one variable at a time and grep the output for the tell:

# count repeated lines — the fastest hallucination detector there is
sort transcript.txt | uniq -c | sort -rn | head -10

Any line with a count above 3 in a 3-minute clip is a loop, not speech. That single command is a better regression test than reading the transcript, and it runs in a second.

We are publishing the mechanism and the recipe rather than a table of our own WER numbers, because a hallucination rate measured on our test clip would tell you nothing useful about your microphone, your room and your language. Run the recipe; the numbers you get are the only ones that apply to you.


What Each Fix Costs

Every fix on this page trades something. Here is the honest ledger.

FixWhat it costs
vad_filter=TrueCan clip quiet word onsets; speech_pad_ms mitigates. Adds a VAD pass to runtime
condition_on_previous_text=FalseLoses cross-segment context — worse on proper nouns, jargon and consistent spelling
prompt_reset_on_temperatureMilder version of the above; only helps once decoding has already degraded
Keeping the temperature ladderSlower and non-deterministic on hard windows — that is the price of the retry that saves you
hallucination_silence_thresholdRequires word_timestamps=True, which costs extra compute
no_repeat_ngram_sizeBlocks genuinely repeated phrases too. Blunt
Switching to ParakeetDifferent language coverage, different tooling, its own weak spots

Our order of operations, every time: VAD first, conditioning second, restore the temperature ladder third, word-timestamp threshold fourth, engine change last.

If your problem is upstream of any of this — the model not loading, GPU not being used, out-of-memory during transcription — start at troubleshooting local AI instead. And if you are building this into an always-on assistant, the pipeline considerations are in our local voice assistant guide.


Sources


FAQ

🎯
AI Learning Path

Voice working locally? Build the whole pipeline.

Whisper, TTS, and voice cloning wired into real projects — hands-on courses. First chapter free, no card.

Or own it for life — Lifetime $149 $599, pay once
Once your hardware is sorted

Replace the speech-AI subscription

Local Speech Studio covers TTS, voice cloning and transcription end to end — including which licences actually let you sell what you make.

$149 once unlocks everything, forever — about $0.27/chapter for life. Prefer to spread it out? Pro is $79/year (saves 27%) or $8.99/month.
Secure checkout by Lemon Squeezy — your card never touches this siteInstant access the moment you payFirst chapter of every course is free — try before you buy

Liked this? 25 full AI courses are waiting.

From fundamentals to RAG, agents, MCP servers, voice AI, and production deployment with real GitHub repos. First chapter free, every course.

Reading now
Join the discussion

LocalAimaster Research Team

Creator of Local AI Master. I've built datasets with over 77,000 examples and trained AI models from scratch. Now I help people achieve AI independence through local AI mastery.

Build Real AI on Your Machine

RAG, agents, NLP, vision, and MLOps - chapters across 25 courses that take you from reading about AI to building AI.

Want structured AI education?

25 courses, 519+ chapters, from $9. Understand AI, don't just use it.

AI Learning Path
More on Local Voice & Speech
See the full Coqui TTS & Local Voice AI guide.

Comments (0)

No comments yet. Be the first to share your thoughts!

Why does Whisper write 'Thank you for watching' when nobody is speaking?

Because Whisper is an autoregressive model that always produces text for whatever 30-second window you hand it, and its training data contained enormous quantities of subtitle files. Given a window with no speech in it, the highest-probability continuation is subtitle boilerplate — sign-offs, 'Subtitles by...', channel outros. The model is not confused; it is doing exactly what it was trained to do with an input that has no answer. The fix is to stop sending silence to the model at all, which is what a VAD filter does: in faster-whisper, vad_filter=True; in whisper.cpp, the --vad flag with a downloaded Silero VAD model.

What is the single fastest fix for Whisper repeating the same sentence?

Set condition_on_previous_text=False. It defaults to True in openai/whisper and in faster-whisper's WhisperModel.transcribe() (the batched pipeline defaults it to False), which means the text Whisper just produced is fed back in as the prompt for the next window. Once a repetition starts, that feedback loop is what locks it in for the rest of the file — the model keeps being told that repeating is what this recording sounds like. Turning it off costs you some long-range consistency (names, jargon and speaker style carry over less well between segments), so it is a trade, not a free win. If you want a lighter touch, faster-whisper's prompt_reset_on_temperature (default 0.5) resets the prompt only once decoding has already fallen back to a higher temperature.

Is vad_filter on by default in faster-whisper?

It depends on which class you call, and this trips people up constantly. In WhisperModel.transcribe() the default is vad_filter=False. In BatchedInferencePipeline.transcribe() the default is vad_filter=True. So the same audio can hallucinate through one code path and be clean through the other, on the same install, with nothing else changed. Check which one your script uses before you conclude the parameter does nothing.

Does hallucination_silence_threshold work on its own?

No — openai/whisper's own docstring says it applies 'when word_timestamps is True': it skips silent periods longer than the threshold, in seconds, when a possible hallucination is detected. Set it without word_timestamps=True and it does nothing at all, which is why so many forum posts report it as broken. It also defaults to None in both openai/whisper and faster-whisper, so it is off unless you turn it on. Treat it as a second-line fix after VAD, not a replacement for it.

Should I switch engines instead of tuning parameters?

Only after you have tried VAD plus condition_on_previous_text=False, because those two are free and take thirty seconds. If you still have loops, the engine question is real: Whisper's failure mode comes from an autoregressive text decoder attending over a fixed 30-second window, and transducer models such as NVIDIA's Parakeet (parakeet-tdt-0.6b-v3, 600M parameters, FastConformer-TDT, CC-BY-4.0) do not have that same previous-text feedback structure. Its model card reports a 6.34% average WER on the Open ASR Leaderboard and 25 supported European languages — but it makes no explicit hallucination-resistance claim, so treat 'different architecture, different failure modes' as the honest framing rather than 'immune'.

Do these fixes make my transcript less accurate?

Some of them do, and you should know which. VAD filtering can clip the first syllable of a quiet sentence — the speech_pad_ms setting (400ms by default in faster-whisper) exists specifically to buy that back, and lowering the VAD threshold below 0.5 recovers quiet speakers at the cost of letting more noise through. condition_on_previous_text=False loses cross-segment context, which matters most for technical vocabulary and proper nouns. Turning off the temperature fallback list makes runs faster and more deterministic but removes the guardrail that catches degenerate output. Nothing here is free; the question is only which cost is cheaper than a transcript with the same paragraph in it forty times.

Ready to Go Beyond Tutorials?

20 structured courses with hands-on chapters - build RAG chatbots, AI agents, and ML pipelines on your own hardware.

Was this helpful?

📅 Published: September 13, 2026🔄 Last Updated: September 13, 2026✓ Manually Reviewed
LM

Written by the Local AI Master Team

The team behind Local AI Master

We build Local AI Master around practical, testable local AI workflows: model selection, hardware planning, RAG systems, agents, and MLOps. The goal is to turn scattered tutorials into a structured learning path you can follow on your own hardware.

✓ Local AI Curriculum✓ Hands-On Projects✓ Open Source Contributor
📚
Free · no account required

Grab the AI Starter Kit — career roadmap, cheat sheet, setup guide

No spam. Unsubscribe with one click.

🎯
AI Learning Path

Voice working locally? Build the whole pipeline.

Whisper, TTS, and voice cloning wired into real projects — hands-on courses. First chapter free, no card.

Or own it for life — Lifetime $149 $599, pay once
Free Tools & Calculators