Auto-Detect Keeps Guessing Wrong: Pin Your Language

Teodor Deleanu · July 10, 2026 · 7 min read

If you dictate in more than one language, you've seen the failure. You say a sentence in Romanian and the transcript comes back as phonetically mangled English — real words, none of them yours. Or it flips mid-sentence: the first half in the right language, the second half in something the model decided you switched to. Or, my personal favorite, mixed-alphabet soup — Latin characters with a few Cyrillic ones sprinkled in, as if the model hedged its bets letter by letter.

This isn't a complaint about one product. It's a recurring pattern across the dictation category — you'll find versions of it among users of Wispr Flow, Superwhisper, and every other tool that does automatic language detection, ours included. And it hits hardest for exactly the people who most need dictation to work in more than one language: speakers with accented English, and anyone who code-switches through the day. The bilingual developer whose Slack is in Polish and whose commit messages are in English is the worst-case input for auto-detection, and the most common user outside the anglosphere.

The second half of the complaint is quieter but just as real: when a language setting does exist, it's often buried. Three menus deep, behind an engine picker, past a toggle whose name doesn't mention language at all. If you switch languages twenty times a day, a buried setting is functionally no setting.

I want to explain why the thrashing happens — using my own product's war story, because Keebye had this problem before it had the fix — and then show what an actual solution looks like.

Why auto-detect thrashes (and why it's not exactly a bug)

Here's the honest mechanics. Modern speech models do language identification silently, as part of decoding. The model listens, forms an internal guess about what language it's hearing, and decodes against that guess. When the audio is clean, unaccented, and monolingual, this works so well you never think about it.

Now feed it real speech. An accent shifts the vowels toward another language's phonemes. A sentence contains three English loanwords — every technical conversation does. There's a kid in the background, or you're on a laptop mic. Each of these makes the model's internal language guess less confident, and a low-confidence guess can flip between frames. When it flips, the decode flips with it, and you get a transcript that changes language mid-thought.

The crucial part: in most tools there is nothing anchoring that guess. The model decides, silently, per utterance, and you have no override. That's not a bug in any one app — it's what silent auto-detection is. A model making a judgment call you can't correct.

I know this intimately because Keebye's default engine has exactly this property. Parakeet, our English-tuned default, ignores any language hint at the decoding layer — you can't tell it what you're about to speak. On clear English it's excellent, which is why it's the default. On unclear audio it can thrash between languages like everything else in the category. I'm telling you this about my own product first, because the fix only makes sense once you accept that the problem lives in the architecture, not in some competitor's sloppiness.

What does pinning a language actually do?

The fix is to stop asking the model to guess. Keebye ships a second on-device engine — NVIDIA's Canary 1B v2, quantized to int8 — that covers exactly 25 languages: Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Slovak, Slovenian, Spanish, Swedish, Russian, and Ukrainian. Unlike the default engine, Canary accepts a language instruction and honors it.

Keebye exposes that as a pin: an explicit language setting the engine respects on every single utterance. Not a preference the model weighs against its own opinion — an instruction. Pin Romanian and it decodes Romanian, period. Your accented English loanwords inside a Romanian sentence come out as Romanian-context text, not as a trigger for the whole transcript to defect to English.

The setting is read live, per dictation. Change it and the very next hold-to-dictate uses the new language — no restart, no engine reload, no waiting. That matters more than it sounds: a language setting that requires an app restart gets set once and never touched, which means it's wrong half the time for anyone bilingual.

And because Canary runs on-device like everything else in Keebye, the pin doesn't cost you the privacy story. The model is about 1.3 GB, downloaded once; after that your Romanian, your Polish, your Ukrainian never leaves the machine. (Why we think local multilingual dictation matters at all is its own post — dictation for developers shouldn't be English-only. This one is its practical sequel: that post argues for the languages, this one is about making them actually usable.)

Two clicks, not three menus deep

A pin you can't reach is a pin you won't use, so the switch lives in the tray. Keebye's menu-bar icon has a "Dictation Language" menu with a curated shortlist of 11 languages — English, Romanian, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Ukrainian. Two clicks from any app: click the tray, click the language. You don't open Settings, you don't leave the window you were working in.

The full 25-language list lives in Settings for the languages outside the shortlist. But the shortlist covers the daily reality of most bilingual work: you're writing to your team in one language and to a client or an AI agent in another, and you need the flip to cost nothing.

There's one more option worth knowing about, because it changes how some people use the pin entirely: a translate-to-English toggle. Speak your language, English lands at the cursor — same engine, same on-device execution. If your inner monologue runs in Romanian but your output needs to be English (commit messages, prompts to a coding agent, replies to an international team), this collapses the translation step you were doing in your head. I use it more than I expected to.

What the pin costs you

25 languages is 25 languages. Cloud dictation tools list far more, because sending audio to a large server-side model is the cheap way to add languages. That's the real tradeoff of on-device: a model that fits on your Mac covers less of the world than a model that fills a datacenter. If your language isn't on the list of 25, Keebye's multilingual engine doesn't cover you today, and I'd rather say that than round up.

A pin means a pin. This is the flip side of determinism, and I want to be plain about it: if you pin Romanian and then speak English, Keebye will faithfully mis-decode your English as Romanian until you switch. The engine is doing exactly what you told it to. Auto-detection's whole appeal was that you'd never have to think about this — the pin trades that convenience for predictability. In my experience the trade is worth it, because a wrong guess you can't control is worse than a wrong setting you can fix in two clicks. But it is a trade, not a free lunch.

The tray shortlist is 11 languages, not 25. If your daily pair includes, say, Finnish or Greek, you're going through Settings for one side of it. Curation means somebody's language didn't make the quick menu.

Where this leaves the complaint

The category-level complaint — "my dictation keeps coming out in the wrong language" — is really a complaint about silent decisions. The model guessed, the guess was wrong, and there was no way to tell it otherwise. Every fix that keeps the guessing (better detection, longer audio windows, confidence thresholds) just makes the failure rarer and stranger. The fix that actually ends the complaint is giving the user the decision back.

If you're currently living this with another tool, our comparison pages are honest about where each tool fits — Keebye vs Superwhisper and Keebye vs Wispr Flow both cover the language question among others. And if you want to try the pin itself: Keebye is in early access for macOS. Pin the language you actually think in, and see how much of the thrashing was never your accent's fault.

Keep reading