machine learning · signal processing · JARVIS
Why I'm training my own wake-word classifier instead of using an off-the-shelf SDK
There are at least five SDKs that would give JARVIS a wake word this afternoon. Porcupine would take about twenty minutes. Instead I'm spending weeks building a classifier from scratch, starting from raw MFCC features. Here's the reasoning.
"It works" and "I understand it" are different achievements, and I'm optimizing for the second. A wake-word detector is the smallest complete machine learning problem I know: a signal-processing front end, a feature representation, a small model, a hard real-time constraint, and a brutal precision requirement — one false positive every ten minutes makes an assistant unbearable to live with. It's small enough to hold entirely in your head, and real enough that hand-waving fails.
Extracting MFCCs myself forces the questions the SDK answers silently. Why mel-scale filter banks and not a plain spectrogram? What does the cosine transform actually decorrelate? Why does frame length trade time resolution against frequency resolution? These aren't implementation details — they're the content of the problem. When I take the DCT of log filter-bank energies, I'm applying a change of basis I've proven things about in Axler. The linear algebra isn't background music; it's the whole event.
There's also the principle the entire project runs on: JARVIS is local-first — no cloud APIs, no black boxes. A third-party binary listening to my microphone around the clock is precisely the kind of black box the project exists to eliminate.
My first classifier will almost certainly be worse than Porcupine. That's fine. The SDK is someone else's understanding, frozen. This one will be mine — and everything JARVIS does downstream will stand on it. Foundations first. Then the tower.