|
| 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.
Custom routes
Add your own phrases in settings.json. Any spoken English phrase works. Routes are a list of objects, so the Settings editor links out to JSON rather than showing a form:
{
"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"
}
]
}
The speech engine listens only for the phrases in your routes, so speech that matches none of them never fires anything.
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".
A command counts as available as soon as an installed extension provides it, even before that extension has started. 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.
The handoff
When a wake phrase is detected:
- The extension asks the speech engine to close the microphone and waits for it to confirm. The engine keeps its process running with the speech model loaded, so listening comes back without reloading it. A process that has not confirmed within 500 ms is stopped, which closes the microphone as well
- Only then does the target VS Code command fire (opening the assistant)
- The assistant's voice mode takes over the microphone with no contention
- After
wakeWord.cooldownSeconds(default: 30), wake word listening resumes. A route withhandoff: "manual"waits for you instead. Running Wake Word: Enable Listening during a cooldown resumes early - Status bar shows a live countdown (
Wake: 30s→Wake: 29s→ ...) during handoff, then returns to "Wake: Listening". A manual route shows "Wake: Paused" instead, with no countdown
This ensures only one thing uses the mic at a time.
Multiple windows
If you have more than one editor window open, only one listens at a time. The first window to start listening takes a lock; the others show Wake: Other window in the status bar and stand by. When the listening window closes, crashes, or has listening disabled, a standing-by window takes over within about ten seconds. The lock is held through the cooldown after a detection, so a second window never opens the microphone while an assistant has it.
The lock lives in the extension's global storage, which windows of the same editor share. Windows of different editor products do not see each other's lock.
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.
If you installed Wake Word from a remote window before version 0.16.0, it was installed on the remote host. After updating, open Wake Word in the Extensions view and choose Install Locally.
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 while the window is not focused (wakeWord.pauseOnFocusLoss). Focusing the 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 is listening |
| Wake: No commands | None of the routes' commands are available in this editor |
Settings
| Setting | Default | Description |
|---|---|---|
wakeWord.routes |
[] |
Wake phrase routing table. Uses defaults if empty. |
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 |
false |
Pause listening when the editor loses focus, and resume when it is focused again. The status bar shows Wake: Unfocused meanwhile |
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: 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. A local sherpa-onnx model processes audio in memory in the engine child process. Nothing is recorded, stored, or transmitted. The only network request the extension makes is the one-time download of the speech model from GitHub.
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 |
The extension host has one runtime npm dependency, sentencepiece-js, which turns each wake phrase into the speech model's word pieces. All native code runs in the engine child process.
Platform Support
| Platform | Status | Engine | Needs |
|---|---|---|---|
| Windows 10/11 (x64) | Supported | sherpa-onnx | Visual C++ Redistributable |
| macOS 14+ (Apple silicon) | Supported | sherpa-onnx | nothing |
| Linux (x64, ARM64) | Supported | sherpa-onnx | glibc 2.28+, ALSA |
Compatibility
| Editor | Install method |
|---|---|
| VS Code | Marketplace or code --install-extension analytics-in-motion.wake-word |
| Cursor | Open VSX or .vsix from GitHub Releases |
| Windsurf | Open VSX or .vsix from GitHub Releases |
| Other VS Code forks | .vsix from GitHub Releases |
License
Apache 2.0