Claude Code voice mode lets you speak prompts instead of typing them: run /voice in the CLI, then hold Space while you talk, and your words are transcribed live into the prompt. It needs a claude.ai account and a local microphone, and transcription does not use your Claude tokens.
Anthropic's docs call the feature voice dictation, while the CLI itself prints "Voice mode enabled" when you switch it on. This guide covers setup, the two recording modes, settings, and the error messages you are most likely to hit. All details come from the official voice dictation docs, checked on 24 October 2026.
What does Claude Code voice mode do?
Voice dictation turns speech into prompt text inside the Claude Code CLI. Text appears dimmed as you speak and is finalized when you stop. Because the transcript is inserted at your cursor, you can mix typing and speaking in the same message: type a file name, dictate the explanation, then type a flag.
Two details make it practical for coding:
- Coding vocabulary. The docs say transcription "is tuned for coding vocabulary," recognizing terms like
regex,OAuth,JSONandlocalhost. - Project hints. Your current project name and git branch name are added as recognition hints automatically.
In hold mode, dictation also works in agent view, so you can dictate a reply to a background session.
What do you need to use voice dictation?
The requirements are strict, and most "voice not working" reports trace back to one of them:
| Requirement | Why |
|---|---|
| A claude.ai account sign-in | The speech-to-text service is not available with an Anthropic API key, Amazon Bedrock, Google Cloud's Agent Platform or Microsoft Foundry |
| A local microphone | Dictation does not work in cloud sessions or SSH sessions |
| WSLg if you use WSL | Included with WSL2 from the Microsoft Store on Windows 10 or 11; on WSL1, run Claude Code natively on Windows instead |
Audio is not processed on your machine. The docs state: "Voice dictation streams your recorded audio to Anthropic's servers for transcription." The same page says transcription "does not consume Claude messages or tokens and does not count toward the limits shown in /usage."
On Linux, recording uses a built-in native module and falls back to arecord (ALSA utils) or rec (SoX) if that module cannot load. The VS Code extension also supports dictation with the same account requirement, but not in Remote sessions such as SSH, Dev Containers or Codespaces.
How do you turn on voice mode?
Run the command at the Claude Code prompt:
/voice
Claude Code checks your microphone. On macOS, the first run triggers the system permission prompt for your terminal app. You then see a confirmation like this:
Voice mode enabled (hold). Hold space to record. Dictation language: en (/config to change).
/voice takes an optional argument, as the commands reference lists:
| Command | Effect |
|---|---|
/voice |
Toggle on or off, keeping the current mode |
/voice hold |
Enable in hold mode |
/voice tap |
Enable in tap mode |
/voice off |
Disable |
The setting persists across sessions. You can also set it in your user settings file instead of running the command:
{
"voice": {
"enabled": true,
"mode": "tap"
}
}
What is the difference between hold mode and tap mode?
Hold mode is push-to-talk and the default. Hold Space; after a short warmup the footer changes from keep holding… to listening…. Release to stop and finalize the text. Claude Code then waits for you to press Enter, unless you set "autoSubmit": true in the voice settings object, which sends the prompt on release when the transcript is at least three words long.
The warmup exists because Claude Code detects a held key by watching for rapid key-repeat events from your terminal. The first few repeated spaces type into the prompt and are removed once recording starts. A single tap still types a normal space.
Tap mode toggles recording with one keypress. With the prompt empty, tap Space to start (the footer shows ● REC · tap to send), speak, then tap again. The prompt is submitted automatically if the transcript has at least three words, so a stray tap does not send a lone word. Recording also stops on its own after 15 seconds of silence or two minutes in total.
| Hold mode | Tap mode | |
|---|---|---|
| Start | Hold Space |
Tap Space on an empty prompt |
| Stop | Release the key | Tap again |
| Warmup | Yes, brief | No |
| Sends automatically | Only with autoSubmit |
Yes, at three words or more |
| Needs OS key-repeat | Yes | No |
To cancel a recording in either mode, press Esc or Ctrl+C. Claude Code discards the transcript and restores the prompt as it was. That press does nothing else: it will not interrupt a response or count toward exiting.
How do you change the dictation key?
The key is the voice:pushToTalk action in the Chat context, and it defaults to Space. Rebind it in ~/.claude/keybindings.json, as described in the keybindings docs:
{
"bindings": [
{
"context": "Chat",
"bindings": {
"meta+k": "voice:pushToTalk",
"space": null
}
}
]
}
A custom key replaces Space rather than adding a second trigger. In hold mode, avoid a bare letter like v, because the letter types into the prompt during warmup. A modifier combination like meta+k starts recording on the first press with no warmup. Some keys, such as Caps Lock, never reach terminal apps and cannot be bound. See the keyboard shortcuts guide for the rest of the keybinding system.
How do you dictate in another language?
Dictation uses the same language setting that controls Claude's response language. If it is empty, dictation defaults to English. Set it in /config or in settings, with a language code or a name:
{
"language": "japanese"
}
The docs list 20 supported languages: Czech, Danish, Dutch, English, French, German, Greek, Hindi, Indonesian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Russian, Spanish, Swedish, Turkish and Ukrainian. If your language value is not on that list, /voice warns you and falls back to English for dictation, while Claude's text responses stay in your chosen language.
Why is Claude Code voice mode not working?
The troubleshooting section of the docs maps each error message to a fix. The common ones:
| Message or symptom | Fix |
|---|---|
Unknown command: /voice |
Sign in with /login. An API key, apiKeyHelper or cloud provider takes precedence over a claude.ai sign-in, so remove it and restart |
Voice mode is disabled by your organization's policy |
An admin has turned it off; ask your organization administrator |
Microphone access is denied |
On macOS, enable your terminal in System Settings > Privacy & Security > Microphone. On Windows, turn on microphone access for desktop apps |
Voice mode requires SoX for audio recording (Linux) |
Install SoX, for example sudo apt-get install sox |
Voice mode could not find a working audio recorder in WSL |
Run sudo apt install sox libsox-fmt-pulse; plain sox cannot record on WSL |
Holding Space only adds one or two spaces |
Your terminal is not sending key-repeat events; switch to /voice tap |
No audio detected from microphone |
Check the system default input device and its level |
| Garbled text or wrong language | Set the dictation language in /config |
If your terminal is missing from the macOS Microphone list, reset its permission with tccutil reset Microphone com.apple.Terminal (or com.googlecode.iterm2 for iTerm2), quit the terminal fully with Cmd+Q, reopen it and run /voice again. Avoid running tccutil reset Microphone without a bundle ID, since the docs warn it revokes microphone access from every app on your Mac.
When is voice dictation most useful?
Speaking is faster than typing for long, descriptive prompts: explaining a bug you just watched happen, describing the shape of a feature, or giving review feedback. It pairs well with plan mode, where you talk through what you want and then read the plan before anything changes. For short, exact input such as file paths or flags, typing is still quicker, and since you can mix both in one message, you do not have to choose.
If you notice you dictate the same kind of brief again and again, it may be worth turning it into a reusable prompt. Kipt keeps prompts as Markdown in a private GitHub repo you own, with blanks for the parts that change, so the structure stays fixed and you only speak the details.