Voice dictation: single-language decoder cannot handle code-switching — English technical terms are translated, dropped, or the decoder flips language mid-utterance

Status Open
Maintainer reply None cached
Activity 3 comments · opened Aug 4, 2026

Summary

Voice dictation resolves to one target language per utterance. There is no multilingual or code-switching mode. For anyone speaking a non-English language while using English technical vocabulary — which is unavoidable in software development — every available language value is wrong: English destroys the French, French destroys the English.

This is distinct from #52384, #47806, #33170 and #34433, which all concern the language parameter being ignored or missing. This issue is the layer underneath: even when the language is set correctly, a single-language recognizer cannot decode a bilingual sentence. Setting language to French is the configuration under which every error below was produced.

Environment

| | |
|---|---|
| Application | Claude desktop app for macOS, 1.24012.11 |
| OS | macOS Tahoe 26.5.2 (build 25F84) |
| Hardware | MacBook Air 15", Apple M5, 24 GB |
| App locale | fr-FR; no language key in ~/.claude/settings.json |
| Spoken | French (Belgium) with English technical vocabulary |
| Domain | Unreal Engine, Three.js, C++ |

Steps to reproduce

  1. Set the app locale to French (or dictate French).
  2. Dictate a normal working sentence containing English technical terms, e.g. "Je vais deploy le build, mais le shader est cassé dans Unreal."
  3. Read the transcript.

Reproduces on every attempt. The failure is intermittent per-word, so several attempts may be needed to hit any specific term.

Actual behaviour — six distinct failure modes

All examples verbatim from my own session transcripts.

1. English word translated into French

| Transcribed | Said |
|---|---|
| Sandbox, box de sable, boîte de sable, boîte de sable, putain. | sandbox |

This is the diagnostic case. The word was not misheard — it was translated, then looped. A French language model is being applied to audio that is only partly French.

2. English word replaced by a French homophone

| Transcribed | Said |
|---|---|
| ma mère t'a fermé une réelle | tu as fermé Unreal |
| en mode play dans un Real | dans Unreal |
| Opus 5 n'est qu'un Fable 5 ou un habit | ou un Haiku |
| tu as fait la mer | tu as fait le HUD |
| une belle fonte | une belle font |
| tu as fait des screen screen | des screenshots |
| le modèle peut être rodé / je peux loder ça | loadé / loader |

Note the instability: load fails as rodé in one message and loder in the next.

3. English word silently dropped

| Transcribed | Said |
|---|---|
| je ne sais pas comment ça marche au niveau des […], mais tu pourrais | au niveau des shaders |
| transcription qui a cassé, , , , , tu vois | ~15 words replaced by empty commas |

4. Digits, acronyms and shortcuts spelled out

GPT cinq point six → GPT-5.6 · soixante f p s → 60 FPS · assets trois d → assets 3D · commande chiffre trois → Cmd+3

5. Repetition loop, then silent truncation

Ajoute tu tu tu tu tu tu tu tu tu tu tu tu tu tu — the rest of the sentence was lost.

Four messages in one session ended on an orphan word: …une sale merde. Il / …ça fait pitié… Et / …on a encore du taf. Et / …elle est pourrie. Tu

The recognizer enters a stuck-token loop, consumes the remainder of the utterance, and returns the truncated result as if it were complete — no error state, no confidence signal.

6. Decoder flips language mid-utterance

Single uninterrupted dictation, entirely in French:

Donc pour résumer, ma sensation était correcte, la transcription de ChatGPT de OpenAI est beaucoup plus qualitatif que la tienne. Qu'il y a un anglais English yes, follow wrong okay on mobile we follow you, your baby un zéro un petit petit

The first sentence is correct French. From the word anglais onward the output is English word salad. I did not speak a word of English. Naming the language appears to have switched the decoder into it mid-stream.

This matches the title of #52384 — "French audio is decoded as English gibberish" — except that there it is a session-wide condition set by a mis-propagated config flag. Here it happens within a single utterance, with no configuration change.

A related case, where the trigger appears to be semantic association rather than acoustics:

…je fais une conversation dans un chat, tu auras des erreurs en plus, tu vois, miaou miaou, petit chat, petit chat, miaou, zouzeau, ah, petit petit, kiki mis. En anglais, t

chat (French for both "chat" and "cat") pulled the decoder into a semantic field. zouzeau and kiki mis are not French words. The message then truncates on the orphan letter t.

Expected behaviour

English technical terms inside a French sentence are transcribed as English words. The decoder does not translate, does not switch language mid-utterance, and does not silently truncate.

Measured rate

Audit of nine of my own development sessions: ~49 substantive user messages, ~38 dictated.

  • 47.4% of dictated messages contain at least one clear transcription error (18/38).
  • Of ~27 English technical terms identifiable from context, ~13 mangled or dropped — about one in two.

For comparison I use another dictation tool on this same MacBook — same OS, same built-in microphone, same room, same speaker, same vocabulary, overlapping dates. The only variable that differs is the transcription engine. Over 539 logged dictations its error rate is 23.6%, and it never once translated an English word into French. Common English technical vocabulary (gamepad, download, anchor point, wireframe, prompt, token, folder) survives intact throughout; it fails only on rare proper nouns.

Two-proportion test on the difference: z = 3.27, p = 0.0011; the 95% confidence intervals do not overlap ([32.5–62.7] vs [20.2–27.3]). The smaller sample does not explain the gap.

The translation finding needs no statistics at all: zero occurrences in 539 dictations on one engine, routine on the other. That is a categorical difference in behaviour, which is why I believe this is fixable rather than inherent.

Probable root cause

The voice dictation docs state that transcription is "tuned for coding vocabulary", citing regex, OAuth, JSON, localhost — all English. In my French sessions that tuning does not appear to apply: shader, HUD, screenshot, font, load, Unreal fail routinely, and sandbox was translated rather than recognized.

Hypothesis, testable internally in minutes: the coding-vocabulary recognition hints are attached only to the English recognition path. That would account for every mode above.

Safety-relevant consequence

Voice dictation feeds an agent with filesystem access. In one session, a dropped syllable turned a verb into another verb:

Transcribed:  « Laisse tomber et FASSE tout ce que tu as fait. »
Intended:     « Laisse tomber et EFFACE tout ce que tu as fait. »

efface = erase; fasse = do. The resulting sentence is grammatically impossible in French — a subjunctive where an imperative belongs, with no subordinating conjunction. Claude resolved the corrupted verb by inference and executed immediately: 26 decals and 13 assets deleted, no confirmation requested, no uncertainty expressed.

To be precise and fair: the inference was correct. I did want the work erased, and the deleted objects were ones Claude had created earlier in that same session. Nothing irreplaceable was lost.

That is exactly why it is worth raising. The outcome was good by luck, not by design. The same corruption with the opposite intent produces the same confident, immediate, irreversible action against real work — and nothing in the system distinguishes the two cases. The corruption was visible in the text; that signal was available and unused.

A second case shows the harder form: a swallowed negation turned pourquoi tu n'utilises plus le MCP into pourquoi tu utilises les plus MCP. Meaning fully inverted, and the transcript is grammatically plausible — no surface signal at all.

Suggested fixes, in priority order

  1. Token-level language detection rather than one target language locked for the whole utterance. Root cause.
  2. Apply the coding-vocabulary tuning to every dictation language, not only English.
  3. Never translate. An English word in a French utterance should be transcribed, not replaced by its French dictionary equivalent.
  4. Digits as digits for versions, counts, measurements and keyboard shortcuts.
  5. Loop and flip detection. A repeated-token run, or a mid-utterance change of decoding language, should raise an error rather than returning a truncated result as complete.
  6. Agent-layer guardrail (cheapest, highest impact): when a low-confidence or ungrammatical segment resolves to a destructive instruction (erase, delete, remove, drop, reset), ask before acting instead of inferring through the corruption. No change to the recognizer required.

Related issues

  • #52384 — VS Code extension ignores language; French decoded as English gibberish
  • #47806 — language setting ignored; Russian transcribed as English
  • #33170 — request for speech-to-text language configuration
  • #34433 — /config references a dictation language setting that does not exist
  • #44441 — dictation silently stops mid-recording

Notes

I can provide the raw session transcripts, the tool-call sequence for the deletion incident, and audio samples.

This issue was itself dictated. It reproduced the bug while being written: ChatGPT cinq point six for "ChatGPT 5.6", Coin for "Qwen", entropique for "Anthropic", and a repetition loop that truncated a paragraph.

View original on GitHub ↗

3 Comments

jr402 · 26 days ago

Confirming this on a different setup: Claude Code desktop app on macOS, dictating French (France) with English vocabulary mixed in — in my case not only coding terms but also creative-production vocabulary (project names, song titles, tool names).

One observation that may support the single-language-decoder hypothesis: the English word is often displayed correctly in the live transcript while I'm speaking, then erased or replaced when the transcript finalizes. The acoustic pass clearly recognizes the word; the finalization pass, constrained to French, deletes it.

Silent deletion (failure mode 3 above) is the worst case for agent workflows: the sentence arrives with a hole, nothing signals that a word is missing, so neither the agent nor the user re-reading the transcript can tell something was lost.

For anyone working in a non-English language, mixed-language sentences are the norm, not an edge case — technical and creative domains all carry English vocabulary. Single-language decoding makes dictation unusable for this population.

PixelWave-max · 8 days ago

Update from the original reporter, 19 days in: the issue persists, and I now have a working counter-example on the same machine.

I wired whisper.cpp with the large-v3-turbo model on-device (Apple Silicon laptop) as a system-wide push-to-talk replacement for the built-in dictation. The exact same French plus English code-switched sentences that get mangled here come out clean: English technical terms preserved, French grammar intact, punctuation included, roughly 1 second of processing for 8 seconds of audio.

Same speaker, same microphone, same vocabulary, consumer hardware. This supports the single-language-decoder hypothesis discussed above: a multilingual decoder resolves the code-switching locally, so the capability gap is in the decoding path, not in the acoustic signal.

Happy to provide details or comparative samples if useful.

PixelWave-max · 20 hours ago

Update — still reproducing as of August 30, 2026

26 days after filing, the defect persists. Two sampling passes over my own
sessions since the report (Aug 4 → Aug 30): 24 of 30 dictated messages
contained at least one clear transcription error. Absolute counts on
purpose — the sample is self-collected and I am not claiming a rate. Raw
transcripts available on request. Uncertain reconstructions are marked as
such in my notes and were counted conservatively.

The dominant failure now: English words silently DISAPPEAR. This has
become the daily experience, and it is worse than distortion, because
deletion leaves nothing to proofread against. Embedded English terms are
dropped from the transcript entirely, and utterances are cut mid-sentence:

  • a message ends dead on …tu es devenue obso — the rest of the

utterance is gone (mid-word truncation, content loss);

  • a feedback message ends dead on `…c'est dès que je mets des mots

English, tu n'as` — cut mid-sentence, the actual point never made it
into text (August 30, while writing THIS update);

  • object nouns vanish: je vais péter [un câble], appelons-le — the

English-adjacent or emphasized word simply never appears;

  • from the original report, the pattern was already there (shader

dropped, empty commas). It has grown from occasional to routine.
A distorted word can be caught by rereading. A deleted one cannot: the
sentence still parses, and the information is unrecoverable.

Safety-relevant: the decoder inverts meaning with no surface trace.
The worst failure class produces output that is grammatically perfect and
semantically plausible — and means the opposite of what was said:

  • différentindifférent (a privative prefix was added; nothing

in the audio contained it)

  • from the original report: n'utilises plus Xutilises les X

(a negation was removed)
Negation markers are being created and deleted in both directions. Neither
the user nor the model gets any signal that corruption occurred. For a CLI
agent that executes filesystem and shell actions from dictated
instructions, this is the failure class that matters most: an inverted
order with zero trace. (One verified occurrence per direction so far —
rare, but the cost of a single hit is unbounded.)

Failure surface has widened since the report:

  • Numbers, acronyms and file extensions spelled out: .md

point m d, M1 Maxm un max, 512 GB
cinq cent douze gigabytes (three times in one message), AB2C
la a b deux c — then B2C transcribed correctly twice in the same
message. Dictated filenames and hardware specs come out unusable.

  • Technical proper nouns destroyed: AbletonHableton and

Hamilton, droppershopper, QwenCoin, SETWIDE
cette white, Global Solution Management
globale, solution management (with French agreement added), the
Creator mode name → créateur (translated).

  • Invented spellings of common words (not code-switching, not

technical): intrountorp, l'itérationliteration,
remontrancesremonterance, alarmantalertant.

  • Mid-word message truncation: a message ends dead on

…tu es devenue obso (for obsolète) — the rest of the utterance is
simply gone. Content loss, not just distortion.

  • French-only errors persist (filmaisfumais, épuisé

épousé, double jeutrouble jeu): the issue title
(code-switching) is narrower than the underlying problem.

There is no user-side workaround. I systematically tested the obvious
one — exaggerated French pronunciation of English terms: 3 failures out of
4 on exactly the words it would be needed for (UnrealUn Real,
shaderChadeur, loadLohad), and since the defect is
intermittent, no word can be identified as at-risk in advance. The only
remaining mitigation is proofreading and re-dictating every message, which
defeats the purpose of dictation.

Reproduction protocol — please do not test with short prepared
sentences.
I tested that too: short, clean, prepared utterances —
including French sentences with embedded English terms — transcribe almost
perfectly. The defect triggers under natural speech conditions: long
dictation (60s+), fast rate, hesitations and self-corrections left in,
English terms embedded mid-flow in French sentences with no prosodic
boundary — i.e. exactly how a bilingual developer talks while working.
A three-minute test with prepared phrases will falsely pass.