Replace push-to-talk with hands-free wake word. Speak "ducky" → conversation opens automatically. Same code path as physical button currently triggers.
Approach
microWakeWord (esphome, MIT, used by Home Assistant Voice). Custom "ducky" model trained in Google Colab from ~50 recordings. ~80KB TFLite, real-time inference on ESP32-S3 Xtensa DSP at ~5% CPU.
Alternatives:
- Espressif esp-sr / WakeNet (paid for custom training)
- Picovoice Porcupine (best accuracy, commercial license, ~$1–5/device for distribution)
microWakeWord is the right choice for v1: free, open, proven on this chip class.
Architecture
```
mic_task (I2S read) ─→ s_mic_stream ─→ ws_send_task
└─→ wake_word_task (gated by !s_agent_speaking)
on detect ─→ start_session() // same as button press
```
The wake word detector reads from the same I2S RX channel. Crucially gated by `!s_agent_speaking` so the agent saying "ducky" or anything similar doesn't self-trigger.
Training
User records ~50 takes of "ducky" in their voice + room. Negative samples should include:
- Agent's voice saying "ducky" and similar phonemes
- Quiet ambient
- Music / TV / conversation
Train once, embed the .tflite in firmware EMBED_FILES, ship.
Power
Always-on wake-word detection on USB power is fine. For battery-powered v2, would need to power-gate or use ULP coprocessor — out of scope for v1.
Tied to
- #27 firmware tracker
- #34 spoken onboarding can announce wake word at end of setup
Replace push-to-talk with hands-free wake word. Speak "ducky" → conversation opens automatically. Same code path as physical button currently triggers.
Approach
microWakeWord (esphome, MIT, used by Home Assistant Voice). Custom "ducky" model trained in Google Colab from ~50 recordings. ~80KB TFLite, real-time inference on ESP32-S3 Xtensa DSP at ~5% CPU.
Alternatives:
microWakeWord is the right choice for v1: free, open, proven on this chip class.
Architecture
```
mic_task (I2S read) ─→ s_mic_stream ─→ ws_send_task
└─→ wake_word_task (gated by !s_agent_speaking)
on detect ─→ start_session() // same as button press
```
The wake word detector reads from the same I2S RX channel. Crucially gated by `!s_agent_speaking` so the agent saying "ducky" or anything similar doesn't self-trigger.
Training
User records ~50 takes of "ducky" in their voice + room. Negative samples should include:
Train once, embed the .tflite in firmware EMBED_FILES, ship.
Power
Always-on wake-word detection on USB power is fine. For battery-powered v2, would need to power-gate or use ULP coprocessor — out of scope for v1.
Tied to