A JavaScript library for wake word detection and command extraction using the Web Speech API.
- Wake word detection using the Web Speech API
- Command extraction after wake word detection
- Configurable language support
- Event-based architecture with callbacks
- TypeScript support
- Configurable logging levels
npm install wake-word-commandimport { createWakeWordDetection } from "wake-word-command";
const wakeWordDetection = createWakeWordDetection({
wakeWord: "hey computer",
language: "en-US",
logLevel: "info", // Optional: Set log level (none, error, warn, info, debug, all)
onWakeWordDetected: () => {
console.log("Wake word detected!");
},
onCommand: (command) => {
console.log("Command:", command);
},
onError: (error) => {
console.error("Error:", error);
},
});
// Start listening
wakeWordDetection.start();
// Stop listening
wakeWordDetection.stop();
// Change wake word
wakeWordDetection.setWakeWord("hey assistant");
// Change language
wakeWordDetection.setLanguage("es-ES");
// Change log level
wakeWordDetection.setLogLevel("debug");Here's a practical example of using the library to create a voice-controlled todo list:
import { createWakeWordDetection } from "wake-word-command";
// Create a simple todo list UI
const todoList = document.createElement("ul");
document.body.appendChild(todoList);
// Create the wake word detector
const wakeWord = createWakeWordDetection({
wakeWord: "hey todo",
onWakeWordDetected: () => {
// Show a visual indicator that the system is listening
document.body.classList.add("listening");
},
onCommand: (command) => {
// Remove the listening indicator
document.body.classList.remove("listening");
// Process the command
const cmd = command.toLowerCase();
if (cmd.includes("add")) {
// Extract the todo item text
const itemText = cmd.replace("add", "").trim();
if (itemText) {
const li = document.createElement("li");
li.textContent = itemText;
todoList.appendChild(li);
}
} else if (cmd.includes("remove") || cmd.includes("delete")) {
// Extract the item number or text to remove
const itemToRemove = cmd.replace(/remove|delete/, "").trim();
const items = Array.from(todoList.children);
const index = parseInt(itemToRemove) - 1;
if (!isNaN(index) && items[index]) {
items[index].remove();
} else {
// Try to find by text
const item = items.find((li) =>
li.textContent.toLowerCase().includes(itemToRemove)
);
if (item) item.remove();
}
} else if (cmd.includes("clear") || cmd.includes("clear all")) {
todoList.innerHTML = "";
}
},
});
// Add some basic styles
const style = document.createElement("style");
style.textContent = `
.listening::after {
content: '🎤 Listening...';
position: fixed;
top: 20px;
right: 20px;
background: #4CAF50;
color: white;
padding: 10px 20px;
border-radius: 20px;
}
`;
document.head.appendChild(style);
// Start listening
wakeWord.start();Try these voice commands:
- "Hey todo, add buy groceries"
- "Hey todo, add call mom"
- "Hey todo, remove 1"
- "Hey todo, delete buy groceries"
- "Hey todo, clear all"
Creates a new wake word detection instance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| options | Object |
Yes | Configuration options |
| options.wakeWord | string |
Yes | The wake word to detect |
| options.language | string |
No | Language code (default: 'en-US') |
| options.logLevel | string |
No | The log level for console output |
| options.onWakeWordDetected | Function |
No | Callback when wake word is detected |
| options.onTranscription | Function |
No | Callback with current transcription |
| options.onCommand | Function |
No | Callback with extracted command |
| options.onCommandTimeout | Function |
No | Callback when command timeout occurs |
| options.onError | Function |
No | Callback when an error occurs |
| options.commandTimeoutMs | number |
No | Timeout duration in milliseconds for command detection |
An object with the following methods:
| Method | Description |
|---|---|
start() |
Start listening for the wake word |
stop() |
Stop listening for the wake word |
pause() |
Pause listening for the wake word |
resume() |
Resume listening for the wake word |
setWakeWord(wakeWord) |
Change the wake word |
setLanguage(language) |
Change the language |
setLogLevel(logLevel) |
Change the log level |
isSupported() |
Check if speech recognition is supported |
const wakeWord = createWakeWordDetection({
wakeWord: "hey assistant",
language: "en-US",
logLevel: "info",
onWakeWordDetected: () => console.log("Wake word detected!"),
onCommand: (command) => console.log("Command:", command),
});Called when the wake word is detected. No parameters.
Called with the current transcription as it's being spoken.
text(string): The current transcription
Called when a complete command is detected.
command(string): The extracted command (text after the wake word)
Called when no command is detected within the timeout period (default: 3 seconds) after the wake word is detected. This indicates that the system is returning to listening for the wake word.
Called when an error occurs.
error(string): The error message
This library uses the Web Speech API, which is supported in modern browsers:
- Chrome (desktop and mobile)
- Edge
- Safari (desktop and mobile)
Note: Firefox does not currently support the Web Speech API's speech recognition feature.
MIT
Contributions are welcome! Please read our Contributing Guidelines for details on our code of conduct and the process for submitting pull requests.