The first time the transcript said thank you, I believed it.

I was hunting. A phone had gone missing, and the evening of 4 September 2026 left me four WhatsApp voice notes instead of the phone: thirty-eight seconds, five minutes eighteen, seven minutes forty-three, and a long one, thirty minutes fifty-one seconds, almost 30 MB sitting on disk like it knew something. I did what I suspect you would have done. I stared at the upload box in the chat app, and for a while I thought of that box as listening.

Then I played the window the thank-you came from. Chairs and air. Nobody spoke, and a speech model had written a polite English sentence over the gap anyway. I had expected a chatbot to tell me what was said, maybe even where to look. What I did not expect, at all, was how quickly a fluent transcript starts thanking you over rooms that were only noisy.

So that night I built a small local transcriber, audio-analyzer, and ran mlx-community/whisper-large-v3-turbo over the four files. It cuts a recording into short windows, tries English and German on each one, and throws away text that looks like the end of a YouTube video. Other people were talking in those rooms, so the voice notes stay private and I will not quote them; the public trial is the scorer, on frozen strings, and it runs without a key. Two more things this is not, so you can stop here if you came for them: it does not rank ChatGPT against Gemini against Whisper for speech-to-text, and it will not help you find a lost phone, even though that is the only reason the tool exists.

Windows on the laptop first, the chatbot afterwards

If you have a messy recording and ten minutes, here is where I landed. On 5 September 2026 I compared four ways of getting speech out of a mixed-language file: one-shot language detection, forced German on the whole file, bilingual windows with a loop score, and the chat-upload default. The four WhatsApp files went through the local tool on Apple Silicon on the night itself; the trial you can rerun is the scorer on frozen strings, no key needed. In that trial the named loops scored 0.05 and were thrown out, the hotel sentences scored 8 to 10 and were kept, and thanks for watching, a phrase I had never listed, scored 3.00 and was kept as speech. The verdict is split: transcribe messy mixed-language audio locally, in windows, then let the chatbot read the timeline and never the raw file. What I cannot tell you is what live ChatGPT or Gemini would have said about these particular recordings, how the tool behaves on accents I did not test, or which loops are missing from my list beyond the one I already found.

A clue has a time, a language, and a sentence

You already have a chatbot that accepts audio. Gemini will take hours of it. OpenAI's transcription API will take a file if it is under 25 MB. ChatGPT will let you paste a question on top. When a recording arrives from a bad night, the implied move is to dump it in and ask what happened.

The dump is a conversation. What I needed was a clue, and a clue has a time, a language, and a sentence you would actually type into a search box. What would count as having listened? A timeline of windows I would defend one by one, with every fluent paragraph that might have been silence taken out. If the model wrote "thank you" because the room was quiet, I do not have a clue. I have a prior from YouTube.

Four labelled checks to apply before trusting a transcript as a clue: whether the window had speech, which language that window was in, whether the text is a known loop, and whether you would search that sentence as evidence.
Fig. 1 The four checks I used on every window. I added the fourth after the night, because a blocked thank-you is a default and a fluent paragraph is not.

The question that came out of the night is narrower than "which audio model". If I transcribe a messy bilingual recording the way a chatbot invites me to, does the timeline stay inside speech I would search, or can silence and the wrong language still look like a lead?

Four questions I now ask every window

Did anyone speak in this slice?

Often not, and the transcript will not tell you. Whisper was trained on 30-second chunks, including chunks with no speech, so it has a <|nospeech|> token. In practice it also has favorite sentences for rooms that are merely quiet. I had assumed that because the file was audio, the text was what was said. A file being audio tells you nothing about whether this particular slice has a voice in it.

The cheapest check is boring, and I skipped it for an hour. Play the window. If you hear chairs and air and the transcript says thank you, trust the chairs.

I forced German on seven minutes and lost a window

I did not know what I would hear, so the first probe tried German, English, Hindi, and Telugu on the opening 25 seconds. Then I did something dumber. The opening had sounded German to me, so I forced German across the whole seven-minute file, in 25-second slices. Later I had to go back and rerun one window in English, after I had already labelled it, in the script, as a comment about a bill. The file did not have a language. The windows did.

Auto-detect on a mixed recording is a guess that tends to stick, and Whisper's own long-form path makes it stickier: later windows are conditioned on earlier text unless you turn that off. I turned condition_on_previous_text off. Even then, I would not let one language token run for 30 minutes.

The sentences Whisper says when nobody does

"Thank you." "Vielen Dank." "Hello everyone." They are on my list because I watched them show up as fluent nonsense. A six-fold repeat of the same two words scores as garbage, which is the easy case. The hard case is a short, polite, unique sentence that nobody said.

I used to think I would notice. You don't, not at 1 a.m., not when you are hunting. The scorer exists so I do not have to feel wise.

Would you search this line as evidence?

If you would not type it into a search box and act on what came back, it leaves the timeline. I put this fourth check on the figure after the night, because a blocked thank-you is a default and a fluent paragraph in a chat window is a story, and only the first of those had cost me anything yet.

What the papers say about quiet rooms

I read these after the night, not before, and they explain most of what I had watched happen. Every number here is the authors' own, and I have marked where their setup stops matching mine.

680,000 hours, thirty seconds at a time

Reported

OpenAI's Whisper paper (Radford, Kim, Xu, Brockman, McLeavey, Sutskever, ICML 2023, arXiv 2212.04356) trained sequence-to-sequence models on 680,000 hours of weakly labelled audio, including 117,000 hours covering 96 languages besides English. The models consume 30-second chunks. For longer files they shift a 30-second window using predicted timestamps. On FLEURS language identification, zero-shot Whisper underperformed the supervised state of the art by 13.6%, and on the 82 overlapping languages the best model reached 80.3% accuracy.

80% on a clean identification set is a long way from a mixed WhatsApp voice note. My read is that "the model will know the language" is a hope you should not carry into a bilingual room.

Thank you was a quarter of what Whisper invented

Reported

Barański, Jasiński, Bartolewska, Kacprzak, Witkowski, and Kowalczyk, in Investigation of Whisper ASR Hallucinations Induced by Non-Speech Audio (arXiv 2501.11378, January 2025), ran Whisper large-v3 on 301,317 non-speech files. Hallucinations appeared in 40.3% of those inferences, and 9.1% of the hallucinations involved looping. Two phrases did an embarrassing amount of the work: "thank you" was 24.76% of the hallucinated outputs, "thanks for watching" 10.32%. Stretch a non-speech clip to 30 seconds and the hallucination rate was 62.3%. Cut it to 10 seconds and it was 11.6%. On speech with extra noise or silence, an unprocessed pipeline posted word error rates of 104.8% and 112.0%. Silero VAD brought those down to 8.0% and 10.8%. Deleting loops and a bag of common hallucinations, without VAD, landed at 17.1% and 21.1%.

I am not going to pretend a 2025 study of large-v3 is a 2026 study of large-v3-turbo on my laptop. I will say that the upload box still invites you to do the exact thing that paper makes expensive: send a long, quiet, mixed file through a speech model and read the text as if a person had said it.

Gemini takes the long file, OpenAI refuses it

Reported

OpenAI's speech-to-text guide, as checked on 5 September 2026, limits file uploads to 25 MB. For larger recordings it tells you to compress or split, and not in the middle of a sentence. Gemini's audio docs, same day, say the model represents each second of audio as 32 tokens, so one minute is 1,920 tokens, and a single prompt can hold up to 9.5 hours. The documented jobs include transcription, translation, timestamps, and summaries. The docs do not claim that a summary of a hallucinated transcript is a witness.

The 30-minute WhatsApp file on disk was about 30 MB. The API would have refused it. Gemini would have accepted it. Refusal and acceptance are both product facts. Neither one tells you whether window 12 was speech.

Two languages in one file, twice the errors

Reported

Yan, Hamed, Shimizu and colleagues, in CS-FLEURS (Interspeech 2025), measured Whisper large-v3 on code-switched speech across 113 language pairs. Character error rate on CS-FLEURS-READ was more than twice the monolingual FLEURS control: 31.77 versus 14.38 on the 12 seen pairs they report in Table 8. They note the damage is worse when the two languages use different scripts. English and German share a script. The paper still does not say mixed speech is a solved paste.

The columns missing from every audio demo

LibriSpeech word error rate can be right and still point at the wrong default, because those speakers were trying to be heard. FLEURS language identification can be right and still point at the wrong default if you treat 80% on a clean set as "it will notice the switch at minute four". Gemini's 9.5-hour window can be right and still point at the wrong default if you read capacity as attention.

The columns missing from every audio demo I have watched this year are the same ones that wrecked my first pass. How much of the file is actually speech. Whether two languages take turns. Whether the model is allowed to copy its previous sentence into the next window. Whether "thank you" is on a kill list.

Inferred

A regular user who uploads a 30-minute voice note and asks a chatbot where the phone is has not scored the quiet windows, and has not checked that the language of minute one is still the language of minute twelve.

I had assumed, going in, that the interesting engineering was the model. After the night, my impression is that the interesting engineering is the window.

A trial on frozen strings, no tape, no key

The question

If I score Whisper-style outputs with the loop scorer from audio-analyzer, do the thank-you loops fall under the 0.4 speech floor while ordinary English and German sentences stay above it, and does a German reading beat an English thank-you on the same window?

Baseline
No difference: loops score like speech, or both languages look equally usable when one of them is thank-you.
Continue if
Named loops score below 0.4, hotel sentences score at least 1.5, and a German hotel sentence is preferred over English thank-you.
Stop if
A named loop is classed as speech, a real sentence is classed as ambience, or the window picker keeps thank-you instead of German.

The live transcribe on 4 September needed Apple Silicon, ffmpeg, and the turbo weights, and I am not putting those voice notes in a public repository. The trial you can repeat is the scorer and the picker, on frozen strings, dated 5 September 2026, with no model API anywhere in it. The phrases, the floor, and the arithmetic live in the prototype repository.

Going in, I expected the named loops to fail and the hotel sentences to pass. I did not expect the second most common hallucination in the public bag to sail through, because I had never added it.

Thanks for watching scored 3.00 and got through

Table of frozen strings scored by the loop scorer. Thank you and Vielen Dank score 0.05 and count as ambience. Thanks for watching scores 3.00 and still counts as speech. English and German hotel sentences score 9.00 and 10.00. Two thank-yous in the same window become ambience.
Fig. 2 No Whisper weights. The continue rule held for the loops I had actually listed. It failed for thanks for watching, which I left in the table on purpose.

Reproduced

On 5 September 2026, python3 eval.py in audio-analyzer at ff938c7 scored Thank you. and Vielen Dank at 0.05, both ambience. A six-fold thank you repeat scored -1.00. yeah scored 0.20, still under the floor. An English hotel sentence scored 9.00. The German twin scored 10.00. On a mixed window, the German sentence was kept and the English thank-you was not. Two thank-yous in the same window became ambience with an empty string. thanks for watching scored 3.00 and was classed as speech.

The continue threshold fired for the claim I had written down: named loops under the floor, hotel sentences above it, German beating thank-you. The row that matters is the one that should have stopped me and didn't. thanks for watching is 10.32% of the non-speech outputs in Barański's study, and my scorer waved it through at 3.00, because the bag it checks against is the bag I typed from one bad night.

Trying both languages beat detecting silence

I started the night thinking silence detection would be the whole fix. ffmpeg's silencedetect is in the repo, and it is useful. It was not load-bearing. A quiet window still emits text if you decode it, and scoring that text is what turned those windows into empty timeline rows instead of polite clues.

The bilingual picker surprised me more than the scorer did. I had assumed I would pick a language for the file and live with it, and forcing German across seven minutes is the miss I can point at in probe_windows.py. Trying both languages on every window and keeping the higher score is uglier. It is also how a timeline appeared that I was willing to search.

Four ways a transcript fools someone in a hurry

A fluent sentence from a quiet room

Barański's 40.3% is the rate at which Whisper invented text for audio that contained no speech. My scorer only knows the phrases I typed in. If your recording is a café, "thank you" might be real. If your recording is a bag on a chair, it might be the prior. Check the window, not the vibe of the paragraph.

One language token for a mixed file

CS-FLEURS put Whisper's character error rate more than twice as high on code-switched speech as on monolingual FLEURS. English and German are a friendly pair, as these things go. I still would not let minute one pick minute twenty. Auto-detect is a first window. Treat it that way.

A chatbot summary of a transcript nobody scored

Gemini will summarise 9.5 hours, and that is a real product. Summarising a tape that already contains "thanks for watching" in a silent stretch is how you get a confident paragraph about a YouTube ending that never happened. The second model cannot see the waveform. It can only see the guess.

A loop list typed at 1 a.m.

I am keeping this miss on the table. I listed thank you, vielen dank, hello everyone, and a couple of German fragments I had already watched the model invent. I did not list thanks for watching, which is 10.32% of Barański's non-speech outputs, and my scorer gives that phrase a 3.00 and calls it speech. A bag that matches your bad night is a much smaller bag than the public one. I had assumed it was close enough, and it wasn't.

What I would run on Monday for a messy recording

Four-row decision table. Mixed-language field recordings go to local windows with a loop score. Clean self-recorded meetings may use the chat upload. A second pair of eyes gets the timeline, not the file. A thank-you over noise is the kill switch.
Fig. 3 A starting point for this week, with the kill switch in the last line. The chatbot is allowed to search. It is not allowed to invent the tape.

Named loop bag

4/54 out of 5

High confidence

Thank you, Vielen Dank, hello everyone, and repeats all fell under 0.4 in the frozen trial.

Public hallucination bag

2/52 out of 5

High confidence

thanks for watching scored 3.00 and classed as speech. The second-most-common non-speech phrase in Barański et al. is not on my list.

Bilingual window pick

5/55 out of 5

High confidence

German hotel sentence beat English thank-you. Two loops became ambience. Two real readings kept an alternate.

Chat upload as the investigation

1/51 out of 5

Medium confidence

Vendor docs promise transcription and summaries. They do not score quiet windows. I did not run the night's files through a chatbot.

API file limit on the long note

2/52 out of 5

High confidence

The 30-minute WhatsApp file was about 30 MB. OpenAI's transcription upload limit is 25 MB. That is a refusal, not a hearing.

Searching a scored timeline

5/55 out of 5

Medium confidence

The report writes timestamps and languages. I used that shape on the night. The public trial cannot replay the private tape.

Average
3.3 / 5
Binding constraint
Fluent text over silence. Named loops fell under the floor. thanks for watching did not, and a chatbot would have treated that row as speech.
Override applied
None. Split is already the conservative reading of a 3.3 average: local windows for messy audio, chat only on a timeline you would defend.

The average says you can get usable speech out of this if you transcribe locally and stay humble about the bag. The binding constraint says do not let a polite sentence over silence pick the next place you look.

Replay the scorer without the tape

You can rerun the scorer without an API key, a GPU, or the original voice notes. You still need your own recording if you want a default for Monday.

bash
git clone https://github.com/shravan1996/audio-analyzer
cd audio-analyzer
python3 -m unittest discover -s tests -t .
python3 eval.py

No network. If you are on Apple Silicon and you have a file you are allowed to transcribe, uv run audio-intel path/to/recording.m4a -o output writes report.md with a timeline. The full implementation is in the prototype repository.

  1. 01

    Name the clue you are actually hunting

    Owner
    You
    Artifact
    One sentence: a place, a name, a time, a language you expect
    Signal
    If you cannot name it, you are browsing, not searching
  2. 02

    Run the frozen eval

    Owner
    You
    Artifact
    The table from eval.py
    Signal
    If thank-you is classed as speech, stop and look at the floor
  3. 03

    Transcribe your file in short windows, both languages

    Owner
    You
    Artifact
    report.md with timestamps
    Signal
    A single language for the whole file is the miss I already made
  4. 04

    Delete or flag every window that is a known loop

    Owner
    You
    Artifact
    A timeline you would search as evidence
    Signal
    If thanks for watching survives, add it to the bag
  5. 05

    Only then ask a chatbot to help you read the timeline

    Owner
    You
    Artifact
    A second pass over scored text, not over the waveform
    Signal
    If the chat needs the raw file to be useful, it is doing the job you already skipped

Before you search a line as evidence

  • Quiet windows are empty, or labelled ambience, in the report
  • Each remaining sentence has a timestamp and a language for that window
  • You can name the loop list you used, including the phrases you know you missed

Go back to the tape if

  • A thank-you or a YouTube tail appears where you heard noise
  • One language token was asked to cover a mixed recording
  • The chatbot's summary mentions a sentence you cannot find in the timeline

Should you ask the chatbot where the phone is?

No. Ask it to read a timeline you already scored, because the upload box will summarise thank-yous from rooms that were only noisy.

Split, because the night was a window problem

Split for getting speech out of a messy recording in September 2026.

As far as I can tell, the night I had was a window problem and never a chatbot problem. A speech model will invent text for a quiet room, and a second model will happily summarise the invention. I would start a colleague on short windows, both languages they actually expect, and a kill list that includes the YouTube tails. I would let them use the chatbot on the timeline. I would not hand the raw file to the upload box and call that a search. I expect Whisper, Gemini, and ChatGPT can all host a later reading of a scored transcript; which product you pick decides less than which window you trust.

I would change this verdict if:

  1. Your live ChatGPT or Gemini upload, on a file with long silences, returns empty windows where you heard no voice, including on thanks for watching style tails.
  2. A single auto language token on a mixed English/German recording matches a human transcript of both sides, on a file that is not mine.
  3. You have a clean, one-language meeting you recorded yourself. Use the upload box. This article is not about that job.

If you ran your own mixed recording through the scorer and thanks for watching was not the hole, or a different phrase was, write to me. I would rather lengthen the bag than defend the list I happened to type at 1 a.m.

Acknowledgements

This article builds on public ASR papers and vendor docs linked in References. The lost-phone night belongs to people who were talking in those rooms, which is why the recordings are not in the repository. Thanks to nobody in particular for the YouTube prior. Whisper brought that itself.

References

Independent results

Vendor posts and product help

  • Speech to text. OpenAI Developers. File uploads currently limited to 25 MB; split or compress longer audio.
  • Audio understanding. Gemini API docs. 32 tokens per second of audio; 9.5-hour prompt limit; transcription, timestamps, summaries.
  • openai/whisper. OpenAI. Sliding 30-second window; condition_on_previous_text defaults to true and is documented as a source of failure loops if left on.
  • mlx-community/whisper-large-v3-turbo. The weights used for the live night. Not the frozen trial.

This trial

Sources last checked: 2026-09-05