Say a wake phrase and the right AI assistant opens -- no clicking required.
Say "Hey Claude" and Claude opens. Say "Hey Copilot" and Copilot opens. Say "Computer" and the terminal focuses. The extension handles the routing, pauses its own mic so the assistant can use it, then resumes listening when the voice session ends.
Zero config. No API keys. No accounts. No system dependencies. Install and go.
All audio processing happens locally on your machine. Nothing is recorded or transmitted.
- Install the extension. On Windows, that's all. On macOS/Linux, a local speech model (~17MB) is downloaded on first use and cached.
- When your editor opens, the extension starts listening on your microphone
- The speech engine matches recognised speech against your configured wake phrases
- If a phrase is detected with sufficient confidence, the extension releases the mic and fires the mapped command
- The target assistant (Claude, Copilot, etc.) takes over the microphone with no contention
- After a configurable cooldown, wake word listening resumes automatically
Install directly from the VS Code Marketplace.
Or from the command line (VS Code only):
code --install-extension analytics-in-motion.wake-wordOption A: Open VSX Registry -- Search for "Wake Word" in the extensions panel.
Option B: Manual .vsix install -- Download the latest .vsix from GitHub Releases. Open Extensions, click the three-dot menu, select "Install from VSIX".
| Platform | Requirement |
|---|---|
| Windows 10/11 | No additional software. Uses built-in System.Speech.Recognition |
| macOS | Node.js 18+ (for the speech engine child process) |
| Linux | Node.js 18+ (for the speech engine child process) |
On macOS and Linux a local speech model (~17MB) is downloaded on first use and cached. If Node.js is installed via nvm or fnm and not on VS Code's PATH, set wakeWord.nodePath to the full path of your node executable.
The first time the extension tries to listen, a modal dialog explains exactly what happens: continuous microphone use, fully local processing. You must click "Allow Microphone Listening" to proceed.
If you decline, listening does not start. You can enable it any time via the status bar or command palette, which will re-prompt for consent. Reset the consent prompt with Wake Word: Reset Microphone Consent.
The core feature. Each spoken phrase maps to a VS Code command.
These work out of the box with no configuration:
| You say | What opens | Command |
|---|---|---|
| "Hey Copilot" | GitHub Copilot Chat | workbench.action.chat.open |
| "Hey Claude" | Claude Code | claude-vscode.focus |
| "Computer" | Terminal | workbench.action.terminal.focus |
Add your own phrases in settings.json. Any spoken English phrase works:
{
"wakeWord.routes": [
{
"label": "Copilot",
"phrase": "hey copilot",
"command": "workbench.action.chat.open"
},
{
"label": "Claude",
"phrase": "hey claude",
"command": "claude-vscode.focus"
},
{
"label": "Search",
"phrase": "search files",
"command": "workbench.action.quickOpen"
},
{
"label": "Commands",
"phrase": "open commands",
"command": "workbench.action.showCommands"
}
]
}The speech engine uses a constrained grammar built from your configured phrases for accurate matching.
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"
}Override the global cooldown for individual routes with cooldownSeconds:
{
"label": "Terminal",
"phrase": "computer",
"command": "workbench.action.terminal.focus",
"cooldownSeconds": 10
}When a wake phrase is detected:
- The extension immediately kills the speech engine process, releasing the mic
- The target VS Code command fires (opening the assistant)
- The assistant's voice mode takes over the microphone with no contention
- After
wakeWord.cooldownSeconds(default: 30), wake word listening resumes - Status bar shows a live countdown (
Wake: 30s → Wake: 29s → ...) during handoff, then returns to "Wake: Listening"
This ensures only one thing uses the mic at a time.
| Setting | Default | Description |
|---|---|---|
wakeWord.routes |
[] |
Wake phrase routing table. Uses defaults if empty. |
wakeWord.cooldownSeconds |
30 |
Seconds to pause after handoff before resuming |
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, resume on regain |
wakeWord.confidenceThreshold |
0.3 |
Minimum confidence score (0.1–0.9) for wake phrase detection |
wakeWord.engine |
auto |
Speech engine: auto (platform default), windows (System.Speech), or sherpa (cross-platform) |
wakeWord.nodePath |
"" |
Path to Node.js executable. Leave empty to auto-detect. Set this if the engine cannot find Node.js (macOS/Linux with nvm or fnm). |
- Wake Word: Enable Listening -- start the detector
- Wake Word: Disable Listening -- stop the detector
- Wake Word: Toggle Listening -- toggle on/off (also via status bar click)
- Wake Word: Reset Microphone Consent -- clear consent and re-prompt
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 |
|---|---|
| GitHub Copilot Chat | 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 |
The extension selects a speech engine based on platform (or the wakeWord.engine setting) and spawns it as a background child process. Both engines communicate via stdout using the same protocol: READY, DETECTED:<phrase>|<confidence>, ERROR:<message>, DEBUG:<info>.
Spawns a PowerShell process using System.Speech.Recognition.SpeechRecognitionEngine, the same engine built into Windows. A constrained grammar is built from your configured phrases and passed via encoded command. Zero model downloads; the speech engine ships with Windows.
Spawns audio-engine.js under system Node.js (not Electron). The child process uses @analyticsinmotion/micstream (PortAudio) for mic capture and sherpa-onnx for keyword spotting. Running under system Node.js is required because Electron's Node.js runtime cannot load native audio addons. A local speech model (~17MB) is downloaded to VS Code's global storage on first use and cached.
- Extension builds phrase list and spawns the engine process
- Engine writes
READYwhen the mic is open - Each detection above the confidence threshold is written to stdout as
DETECTED:<phrase>|<confidence> - The extension reads stdout and fires the corresponding command
- On handoff, the engine process is killed to release the microphone
- After the cooldown countdown, a new engine process starts
Zero runtime npm dependencies in the extension host. All native dependencies are isolated in the engine/ child process.
| Problem | Solution |
|---|---|
| Engine starts but never detects phrases | Try lowering wakeWord.confidenceThreshold (e.g. 0.2). Speak clearly and close to your microphone. |
| Too many false positives | Raise wakeWord.confidenceThreshold (e.g. 0.5 or higher). Use longer, more distinctive wake phrases. |
| "Failed to start speech engine" | Ensure your microphone is connected and not in use by another application. Check your system sound settings. |
| Status bar shows "Wake: Error" | Click the status bar item to retry. Check the Output panel for details. If the error persists, try Wake Word: Reset Microphone Consent and re-enable. |
| Extension keeps restarting | The engine retries up to 3 times on crash with increasing delays. If it fails after 3 retries, check that your audio device is working. |
| "Could not find Node.js" (macOS/Linux) | Set wakeWord.nodePath to the full path of your node executable (e.g. /opt/homebrew/bin/node). Common when using nvm or fnm. |
| Microphone access denied (macOS) | Open System Settings → Privacy & Security → Microphone and enable access for VS Code (or your editor). |
| Model download fails | Check your internet connection. The model is ~17MB downloaded from GitHub. If behind a proxy, ensure HTTPS traffic to github.com is allowed. |
All speech recognition runs locally on your machine. No audio data ever leaves your device. On Windows, speech is processed by the built-in System.Speech.Recognition engine in memory. On macOS and Linux, a local sherpa-onnx model processes audio in the engine child process. Nothing is recorded, stored, or transmitted.
| Platform | Status | Engine |
|---|---|---|
| Windows 10/11 | Supported | Windows built-in System.Speech |
| macOS | Supported | sherpa-onnx (requires Node.js 18+) |
| Linux | Supported | sherpa-onnx (requires Node.js 18+) |
| 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 |
Apache 2.0