|
| You say | What opens | Command |
|---|---|---|
| "Hey Claude" | Claude Code | claude-vscode.focus |
| "Hey Chat" or "Open Chat" | The editor's chat panel | workbench.action.chat.open |
| "Hey Computer" or "Open Terminal" | Terminal | workbench.action.terminal.focus |
The Claude route uses manual handoff (see Handoff mode): after it fires, listening stays paused until you click Wake: Paused in the status bar or press the toggle shortcut. The other two resume after the cooldown.
The Claude route needs the Claude Code extension. Without it, that route is set aside and the other two still work: see Routes whose command is not available.
To stop listening for one of these routes, switch it off: see Switching a route off.
Switching a route off
Switch any route off and back on, a default route or one of your own. Run Wake Word: Switch Routes On or Off, uncheck a route and press Enter. Listening restarts with the routes still checked.
Your choice is saved as a list of route labels. Switching off a default route adds only its label, and the other default routes stay as they are:
{
"wakeWord.routesSwitchedOff": ["Terminal"]
}
Wake Word: Show Diagnostics lists the routes that are switched off. When every route is switched off, the status bar shows Wake: Routes off. Click it to choose a route to switch back on.
Custom routes
Add your own phrases in settings.json. Any spoken English phrase works:
{
"wakeWord.routes": [
{
"label": "Claude",
"phrase": "hey claude",
"command": "claude-vscode.focus"
},
{
"label": "Codex",
"phrase": "hey codex",
"command": "chatgpt.newCodexPanel"
},
{
"label": "Search",
"phrase": "search files",
"command": "workbench.action.quickOpen"
},
{
"label": "Commands",
"phrase": "open commands",
"command": "workbench.action.showCommands"
}
]
}
Detection of uncommon words varies. The speech model works best with common English words, so a phrase built on a product name or other unusual word, such as "hey codex", may be missed more often than the default phrases. If one is, give that route a lower confidenceThreshold, lower wakeWord.confidenceThreshold for every phrase, or add an alias made of common words.
Phrase aliases
The phrase field accepts a string or an array of strings. Use arrays to map multiple trigger phrases to the same command:
{
"label": "Claude",
"phrase": ["hey claude", "open claude"],
"command": "claude-vscode.focus"
}
Phrase warnings
When listening starts, Wake Word checks your phrases. Anything likely to detect poorly is written to the Wake Word output channel, with one notification pointing at it:
- A single word, such as
"search". Single words cause more false positives than a two-word phrase such as"hey search". - A phrase shorter than four characters.
- A common word on its own, such as
"stop","okay", or"hello". - The same phrase on two routes. Only the first of those routes can fire.
- A phrase contained in another route's phrase, such as
"claude"and"hey claude". The shorter one may trigger when the longer one is spoken. Aliases on the same route are not compared, because they run the same command.
Warnings never block a phrase. They are shown once per session, and again when you change your routes' phrases.
Routes whose command is not available
When listening starts, Wake Word checks that each route's command exists in your editor. A route whose command is not available, such as the default Claude route when Claude Code is not installed, is not listened for. A notification names the route, its command, and the extension to install. It appears once, not every time the editor starts, and Wake Word: Show Diagnostics lists these routes under "Set aside". Wake Word checks the commands of the routes that are switched on, so switching a route off also ends the notification about its command: switch off the Claude route if you work without Claude Code.
Install or enable the extension a route needs and the route is listened for again, without restarting the editor. If none of your routes' commands are available, the microphone is not opened, and the status bar shows Wake: No commands until one is.
Per-route cooldown
Override the global cooldown for individual routes with cooldownSeconds:
{
"label": "Terminal",
"phrase": "hey computer",
"command": "workbench.action.terminal.focus",
"cooldownSeconds": 10
}
Per-route threshold
Override the global trigger threshold for one route with confidenceThreshold. Lower detects more easily, at the cost of more false triggers. Use it for a phrase the speech model finds hard, without making your other phrases trigger more readily:
{
"label": "Claude",
"phrase": "hey claude",
"command": "claude-vscode.focus",
"confidenceThreshold": 0.03
}
The range is 0.01 to 0.9, the same as wakeWord.confidenceThreshold. It applies to every phrase on the route, and a route without it uses the global setting.
Handoff mode
handoff chooses how listening comes back after a route fires:
"timer"(default): listening resumes aftercooldownSeconds."manual": listening stays paused until you click the status bar, press the toggle shortcut, or run Wake Word: Enable Listening. Use this for assistants whose voice sessions run longer than the cooldown, so Wake Word does not restart under them and compete for the microphone.
{
"label": "Claude",
"phrase": "hey claude",
"command": "claude-vscode.focus",
"handoff": "manual"
}
The status bar shows Wake: Paused while a manual route waits. The default Claude route uses manual handoff.
Multiple windows
Only the editor window you are using listens. When a window loses focus, Wake Word pauses there and releases the microphone, and the window you switch to starts listening, usually within a fraction of a second. While another application has focus, nothing listens. A window you are not using shows Wake: Unfocused in the status bar.
A wake phrase that hands the microphone to an assistant keeps it handed over whichever window you move to. Until the cooldown ends, or, for a manual handoff, until you resume in the window that handed over, the window you are in shows Wake: Other window and does not open the microphone.
To keep one window listening while you work elsewhere, turn off wakeWord.pauseOnFocusLoss. The first window to start listening then keeps the microphone, and the others show Wake: Other window. When that window closes, crashes, or has listening disabled, another takes over within about ten seconds.
Windows of different editors, such as VS Code and an editor built on it, do not share the microphone. With wakeWord.pauseOnFocusLoss on, only one of them listens all the same, because only one window has focus at a time.
Remote windows
Wake Word works in remote windows: SSH, WSL, dev containers, and Codespaces opened in the desktop editor. It runs on your own machine, beside your microphone, and the commands it runs reach extensions on the remote side, such as Claude Code installed there. It does not run in the editor in a web browser, which cannot run its speech engine.
Status bar
| Status bar | Meaning |
|---|---|
| Wake: Starting | Loading the speech model and opening the microphone. Wake phrases are not heard yet |
| Wake: Listening | Listening for wake phrases |
| Wake: Confirm | Confirmation mode heard a phrase once, and is waiting to hear it again |
| Wake: Active, Wake: 30s, Wake: Paused | A wake phrase handed the microphone to the assistant it opened |
| Wake: Unfocused | Paused because the window is not focused: the window you are using listens instead. Focusing this window resumes it |
| Wake: Restarting | The speech engine stopped and is being restarted |
| Wake: Calibrating | A Wake Word: Calibrate run is listening |
| Wake: Error | Listening stopped; the tooltip says why. Click to try again |
| Wake: Off | Not listening. Click, or press the toggle shortcut, to start |
| Wake: Other window | Another window of the same editor has the microphone: it is still pausing, or a wake phrase handed it to an assistant there. This window listens as soon as it is released |
| Wake: No commands | None of the routes' commands are available in this editor |
| Wake: Routes off | Every route is switched off. Click it to choose the routes to listen for |
Settings
| Setting | Default | Description |
|---|---|---|
wakeWord.routes |
[] |
Wake phrase routing table. Uses defaults if empty. |
wakeWord.routesSwitchedOff |
[] |
Labels of the routes to switch off, the default routes included, which stay in place. Wake Word: Switch Routes On or Off sets it |
wakeWord.cooldownSeconds |
30 |
Seconds to pause after handoff before resuming. Routes with handoff: "manual" wait for you instead |
wakeWord.enableOnStartup |
true |
Start listening when the editor opens |
wakeWord.showNotificationOnDetection |
true |
Show notification when wake phrase is heard |
wakeWord.pauseOnFocusLoss |
true |
Listen only in the focused editor window: pause when the window loses focus and resume when it is focused again. When off, the first window to start listening keeps the microphone until listening stops there |
wakeWord.confidenceThreshold |
0.05 |
Trigger threshold (0.01 to 0.9) for wake phrase detection. Lower detects more easily, higher gives fewer false positives |
wakeWord.confirmationMode |
false |
Require the wake phrase twice within 5 seconds before triggering. Reduces false positives in noisy environments. |
wakeWord.audioDevice |
"" |
Microphone to use: a case-insensitive substring of the device name (e.g. "USB") or a device index. Empty for the system default. |
Choosing a microphone
wakeWord.audioDevice selects the input device. Use any case-insensitive substring of the device name as it appears in your system sound settings, or the device's index number:
{
"wakeWord.audioDevice": "Headset"
}
Changing it restarts the engine. If the value matches no device, or more than one, the error notification says so and names the value. Wake Word: Show Diagnostics lists your input devices with their names and index numbers.
Commands
Every command is in the Command Palette under Wake Word. Toggle Listening also has a shortcut, Shift+Alt+W (Ctrl+Cmd+W on macOS), which works from the editor, the terminal, and an assistant's panel, and from a foot pedal that sends a key combination. Change it in Keyboard Shortcuts.
| Command | What it does |
|---|---|
| Wake Word: Enable Listening | Start listening, or resume after a handoff |
| Wake Word: Disable Listening | Stop listening and release the microphone |
| Wake Word: Toggle Listening | The status bar click: turn listening off or on, or resume after a manual handoff |
| Wake Word: Switch Routes On or Off | Choose which routes are listened for, the default routes included |
| Wake Word: Calibrate | Listen for 15 seconds and report each phrase heard, without running any route |
| Wake Word: Show Diagnostics | Write a report to the Wake Word output channel, with Show Log, Copy to Clipboard, and Report Issue |
| Wake Word: Open Settings | Open the Settings editor at Wake Word's settings |
| Wake Word: Reset Microphone Consent | Forget the consent given, so the next start asks again |
Common command IDs
Useful values for the command field in your routes. Command IDs listed are for VS Code. Cursor and other editors may use different IDs for the same features.
| Assistant / Feature | Command ID |
|---|---|
| The editor's chat panel | workbench.action.chat.open |
| Claude Code | claude-vscode.focus |
| VS Code Speech dictation | workbench.action.editorDictation.start |
| Command Palette | workbench.action.showCommands |
| Focus Terminal | workbench.action.terminal.focus |
| Quick Open | workbench.action.quickOpen |
| Toggle Sidebar | workbench.action.toggleSidebarVisibility |
| New File | workbench.action.files.newUntitledFile |
Troubleshooting
| Problem | What to do |
|---|---|
| The status bar shows Wake: Error | Hover over it for the reason, or open the Wake Word output channel. Fix what it names, then click the status bar to try again |
| Nothing is heard | Run Wake Word: Show Diagnostics: it lists your input devices and marks the one in use. Choose another with wakeWord.audioDevice, then run Wake Word: Calibrate to see what is heard |
| macOS: nothing is heard | Allow your editor in System Settings > Privacy & Security > Microphone, then quit and reopen it |
| Windows: nothing is heard | In Settings > Privacy & security > Microphone, turn on microphone access and "Let desktop apps access your microphone" |
| Windows: Wake: Error as soon as listening starts | Install the Microsoft Visual C++ Redistributable (x64), then enable listening again |
| A Bluetooth headset sounds worse while listening | Keeping its microphone open switches the headset to its lower-quality call mode. Set wakeWord.audioDevice to your computer's built-in microphone |
| A remote window (SSH, WSL, dev container) | Wake Word runs on your own machine, beside the microphone. If it was installed on the remote host, open it in the Extensions view and choose Install Locally |
| The shortcut does nothing in the terminal | Add wakeWord.toggle to terminal.integrated.commandsToSkipShell in your settings |
| Reporting a problem | Run Developer: Set Log Level, choose Wake Word, then Debug, and repeat what went wrong: the output channel now shows the engine's detail. Then run Wake Word: Show Diagnostics and choose Report Issue: the report is copied and a new issue opens for you to paste it into, check, and submit |
The log and the report never contain audio or anything you said, and device names that look like a person's are shortened in the report.
Privacy
All speech recognition runs locally on your machine. No audio data ever leaves your device. Nothing is recorded, stored, or transmitted. Wake Word makes no network requests: the speech model comes with the extension.
Dependencies
The speech engine is built on two open source projects, both packaged with the extension.
| Project | What it does | Links |
|---|---|---|
| decibri | Microphone capture, signal conditioning, and voice activity detection | GitHub / decibri.com |
| sherpa-onnx | Open-vocabulary keyword spotting | GitHub |
Platform Support
| Platform | Status | Needs |
|---|---|---|
| Windows 10/11 (x64) | Supported | Visual C++ Redistributable |
| macOS 14+ (Apple silicon) | Supported | nothing |
| Linux (x64, ARM64) | Supported | glibc 2.28+, ALSA |
License
Apache 2.0