Claude Code Voice: Chinese Not Supported? Dictate 中英 Anyway
Claude Code's /voice doc lists 20 dictation languages and no Chinese (Sep 2026). How to dictate mixed Chinese-English prompts into Claude Code on a Mac anyway.
You ran /voice in Claude Code, set language to zh, and got a warning and English dictation. The doc explains why, and there is a plain workaround on a Mac. This post covers both.
What the /voice doc lists as supported languages
Anthropic’s Claude Code documentation has a page for voice dictation. As of 2026-09-18 it lists twenty dictation languages:
| Czech | Danish | Dutch | English |
| French | German | Greek | Hindi |
| Indonesian | Italian | Japanese | Korean |
| Norwegian | Polish | Portuguese | Russian |
| Spanish | Swedish | Turkish | Ukrainian |
No Chinese, Simplified or Traditional. It can change; treat the linked page as the source and this table as a dated snapshot.
Three other lines on that page matter here. Dictation uses the same language setting as Claude’s replies; if that setting is not in the table, /voice warns you when you enable it and falls back to English. Voice dictation, in the doc’s words, “streams your recorded audio to Anthropic’s servers for transcription”, and audio is not processed locally. And it requires a Claude.ai login plus a local microphone: it is not available with an API key, Bedrock, or Foundry, and it does not work in SSH or cloud sessions.
What happens when you speak Chinese to /voice today
Either way, Mandarin goes to an English transcriber. The doc does not say what comes out, and I will not guess; its troubleshooting entry for wrong-language output points back to /config, which for Chinese loops to the fallback.
The same page says Japanese, Chinese and Thai transcripts count individual words for tap-mode auto-submit. The language table is still what decides what /config accepts.
The real gap: Chinese with English tech terms in one sentence
Even if a Chinese row appears in that table tomorrow, most developer speech is not monolingual. It sounds like this:
把 header 的 toggle 组件放到右上角,然后 API 层不要动。
Mandarin grammar, English identifiers, no pause between them. A recognizer set to one language handles the other half badly: an embedded word like header comes back as a non-word, or the whole sentence gets flattened into one language.
That mixed sentence is the case ListenIn is built around. The mechanics are on the bilingual dictation page.
A system-wide dictation app types into the Claude Code prompt
Claude Code’s prompt box is a text field in your terminal that takes pasted text like typed text. So an app that recognizes speech and inserts text at the current cursor needs no plugin and no permission from Claude Code, and works the same way in Cursor, VS Code, or Mail.
That is what ListenIn does. It is a macOS menu-bar app: tap a trigger key, speak, tap again, and cleaned text lands at your cursor. Recognition runs on Apple’s speech engines, both forced on-device, so audio never leaves the Mac and never reaches ListenIn’s cleanup service. Cleanup sends text only, to ListenIn’s built-in service, to a provider you bring your own key for, or to a local Ollama model if nothing may leave the machine. The mode-by-mode table is on the security page.
Two terminal details: ListenIn pastes through the clipboard and restores it afterward, and if your terminal has Secure Keyboard Entry on it shows a copy card instead of pasting (see the secure-input post).
Two things it is not. It is not a coding agent: it prepares the prompt and Claude Code decides what to do with it. And it does not answer the prompt on the way through: ask a question in Chinese and you get the question, cleaned, not a reply.
Setup on a Mac: trigger key, permissions, and the macOS 14–15 language pack
Requirements: macOS 14 or later, Apple Silicon or Intel.
Trigger key. fn is the default. If macOS already has fn bound to the emoji picker or input switching, a fresh install starts on Right ⌘ instead and onboarding says so: “fn is taken by macOS — ListenIn uses Right ⌘ Command instead.” Change it under Settings › Dictation, “Trigger key”, “Record…”, or free fn up by setting it to “Do Nothing” in Keyboard settings. Trade-offs are in the fn conflict post.
Permissions. Onboarding asks for two: “① Microphone + Speech Recognition” and “② Accessibility”. Accessibility is used to paste at your cursor and, in Ask Anything, to read the text you selected. ListenIn takes no screenshots and sends no screen image. Your terminal needs no microphone permission; ListenIn does the recording. (/voice, per its doc, prompts your terminal for microphone access the first time you enable it.)
Recognition language. Set “Recognition language” to “Chinese (with mixed English)”. That is the whole language configuration for a bilingual session; there is no per-sentence switch.
The language pack. This is the cost of forcing on-device recognition. On macOS 14–15, Apple’s classic engine only recognizes a language whose dictation pack is downloaded. If Chinese is not, ListenIn does not quietly fall back to Apple’s cloud: recognition fails outright and you get a “Dictation language unavailable” card with an “Open Dictation Settings” button, which lands you in System Settings › Keyboard, at the Dictation section (Languages…). Download Chinese there once. On macOS 26 the same card can offer “Download speech model” and fetch it in place. More in the language-pack post.
Prompt shaping. There is a “Write prompts in AI coding tools” switch. With it on, dictation in Claude Code, Cursor, VS Code, Xcode and terminals is rewritten as a prompt: goal first, ordered steps numbered, constraints in their own block.
A mixed 中英 prompt before and after cleanup
Here is a raw transcript from ListenIn’s own regression suite (case cmd-struct-01 in eval/asr-repair.json): spoken rambling, as the recognizer produced it.
嗯那个我想把这个用户设置页面改一下就是重构一下然后呃大概分三步吧第一个是先把那个表单校验抽成一个 hook第二个是把保存按钮的 loading 状态修好第三个是把那个错误提示统一成 toast然后哦对了不要动那个 API 层然后单元测试要能过
The regression check on this case requires numbered steps, hook, toast and API intact, and 嗯 / 呃 / 哦对了 gone. Output that passes looks like this:
重构用户设置页面,分三步:
1. 把表单校验抽成一个 hook
2. 修好保存按钮的 loading 状态
3. 把错误提示统一成 toast
不要动 API 层。单元测试要能过。
Nothing was translated: hook did not become 钩子. Nothing was added: no heading, no fourth step, no deadline. The rule ListenIn’s cleanup lives by is reordered, never invented. In Claude Code that block lands in the prompt box; you read it and press Enter. If you would rather it were sent, AI Command mode has a “Press Return automatically” option for a chosen “Target app”.
Every dictation stays in “Dictation History” on the Mac with a “Show raw transcript” toggle.
Simplified vs Traditional, and the personal dictionary for your identifiers
Script. In Settings, “Chinese script” has three values: “Auto (follow speech)”, “Always Simplified”, “Always Traditional”. The lock applies to the cleanup output, so a Traditional writer does not get Simplified characters from the model’s mood. See the script-lock post.
Your identifiers. ListenIn ships a built-in technical lexicon (Claude, Cursor, GitHub, OAuth, JSON, SwiftUI, Vercel and others), and its regression suite checks that terms like regex, localhost and kubectl survive cleanup. For names only your codebase uses (a product called 智付, say), open “Manage Personal Dictionary…” and add them one at a time. Or fix the word once in the inserted text: ListenIn notices the correction, offers to add it, and offers “Replace All” for the other occurrences.
The dictionary and learned corrections feed the text cleanup pass, and on macOS 14–15 they also bias the classic recognizer. ListenIn does not retrain or bias Apple’s modern recognizer. It exports and imports (merge, never erase), so it moves between Macs. Details in the dictionary post.
When /voice is enough and you don’t need this
If you dictate in English or one of the other nineteen listed languages, sign in with a Claude.ai account, and are fine with your audio going to Anthropic’s servers, /voice is already built in. Per its doc it consumes no tokens, is tuned for coding vocabulary, adds your project and branch names as recognition hints, and lets you mix typing and speech in one prompt. Use it.
You want a system-wide app when at least one of these is true: you speak Chinese, or Chinese and English in one sentence; audio must stay on the machine; you authenticate with an API key or Bedrock, where /voice is unavailable; your Claude Code session runs over SSH, since ListenIn inserts text into the local terminal window; or you want one trigger key across Claude Code, Cursor and Mail.
If you try it in Claude Code and something in this post disagrees with the app, that is a bug. Say so.
Try it on your own Mac
Free tier, no account. Audio never leaves your Mac.