Looking for suggestions: reliable two-word wake word detection on Android

Discussion in 'Android' started by Marvin B, Sep 12, 2026.

  1. Marvin B

    Marvin B MDL Novice

    Apr 8, 2024
    1
    0
    0
    I'm working on an Android music application and trying to implement a very simple-sounding feature that has turned out to be surprisingly difficult:

    Reliably detect the two-word wake phrase “Ear Wax.”

    That's it.

    The wake-word layer does not need to understand commands, artists, albums, playlists, etc. Once “Ear Wax” is detected, a separate speech-recognition/command layer takes over.

    The intended interaction is something like:

    “Ear Wax, play some music.”
    “Ear Wax, play artist Michael Jackson.”

    The requirements are:

    • Android/on-device

    • Offline wake-word detection

    • Low enough CPU/resource usage for continuous listening

    • No cloud dependency

    • Commercially distributable

    • Preferably open source

    • No per-user, per-device, API, subscription, or ongoing licensing fees

    • The wake detector only needs to recognize “Ear Wax”
    We've been benchmarking candidates on a Mac before putting anything on the phone. We also have a frozen real-world Samsung S23 recording containing music playing in the background with “Ear Wax” spoken over it.

    So far:

    Approach Clean “Ear Wax” recall Similar-phrase false positives Music-only false positives Real-world music + speech
    Heed small model 35% 0/50 0/24 Correct localized detection
    Sherpa-ONNX KWS 55% 2/50 0/24 Missed wake phrase
    PocketSphinx 90% 17/50 0/24 Missed wake phrase + 2 false triggers
    Purpose-trained Heed large model 85% 4/50 1/24 Not tested because the model had already failed our gates
    We also tried a NanoWakeWord-style end-to-end CNN, but that model was essentially unusable because it fired across huge amounts of negative audio.

    PocketSphinx was particularly interesting because it reached 90% clean recall, but similar-sounding phrases caused a 34% false-positive rate.

    Examples that fooled it included:

    • “Air max”

    • “Ear marks”

    • “Near wax”

    • “Clear facts”

    • “Bear tracks”

    • “Where next”

    • “We are back”

    • “Fair tax”
    “Near wax” has been especially troublesome across approaches.

    For the purpose-trained Heed experiment, we explicitly used these kinds of phrases as hard negatives. That improved clean recall substantially compared with our original Heed model (35% → 85%), but we still couldn't get the combination of recall and specificity we need.

    Our rough target is at least 90–95% wake-phrase recall with extremely low false activation, particularly during ordinary conversation.

    At this point I'm considering moving away from tiny end-to-end/phonetic keyword spotters and trying an embedding-based detector: a pretrained speech/audio embedding front end with a small classifier trained specifically for “Ear Wax” versus “not Ear Wax,” including hard negatives such as “Near wax.”

    Before going farther down that road, I thought I'd ask people who have actually dealt with wake-word/KWS systems:

    What would you use for a difficult two-word custom wake phrase like this?

    In particular:

    • Is an embedding-based classifier the right next direction?

    • Is there a current open-source KWS/wake-word project we have overlooked?

    • Would you approach “Ear Wax” as phoneme/keyword spotting, binary classification, speaker-independent embeddings, or something else?

    • Are there particular techniques for separating a wake phrase from very close negatives such as “Near wax” without destroying recall?

    • Is there a practical Android-friendly model/framework you'd recommend under the offline/zero-recurring-cost constraints above?
    I'm not opposed to training a custom model. I'm mainly trying to avoid spending another round testing an architecture that is fundamentally wrong for the problem.

    Any suggestions from people who have worked on this kind of two-word wake-word problem would be appreciated.