Hi 👋
First of all, thank you for NanoWakeWord — it’s a very well-designed project.
The data generation, augmentation, and training pipeline work great and I’m getting very good accuracy in Python.
I’m currently trying to deploy a trained NanoWakeWord model on Android (ONNX Runtime, low-power SoC) and I’d like to clarify the intended deployment path.
My current understanding
From reading the code and issues, it seems that:
The exported wakeword.onnx does NOT accept raw waveform
The model expects precomputed features with shape similar to (1, 8, 96)
The actual wake-word system relies on:
streaming ring buffers
MelSpectrogram ONNX
embedding ONNX
temporal feature stacking
reset / state / patience logic
So NanoWakeWord is effectively:
PCM → streaming features → embedding → stacked features → wakeword model
and not an end-to-end waveform → score model.
The problem
On Android, if I directly feed:
raw PCM
or even a fixed 1.38s waveform window
into wakeword.onnx, I get:
constant zeros
or false positives
or input shape errors
Which makes sense if feature matching is required.
Questions
Is it intentionally not supported to export an end-to-end ONNX model (waveform → score)?
Is the recommended approach to:
re-implement the feature pipeline (AudioFeatures, streaming melspec, embedding, stacking) on the target platform?
Is there any official or planned:
E2E export
reference Android / Kotlin implementation
or feature-exact spec for third-party ports?
Context / Motivation
I fully understand why feature logic may not be embedded into ONNX (state, control flow, buffers).
I’m not asking for magic auto-export — just clarity on:
what is guaranteed to match training
what is expected from downstream deployments
NanoWakeWord’s data generation and training quality is excellent, and I want to keep using it rather than switching to a simpler but less accurate wake-word stack.
Thanks again for the great work,
and I’d really appreciate any guidance on the intended production deployment path 🙏
Hi 👋
First of all, thank you for NanoWakeWord — it’s a very well-designed project.
The data generation, augmentation, and training pipeline work great and I’m getting very good accuracy in Python.
I’m currently trying to deploy a trained NanoWakeWord model on Android (ONNX Runtime, low-power SoC) and I’d like to clarify the intended deployment path.
My current understanding
From reading the code and issues, it seems that:
The exported wakeword.onnx does NOT accept raw waveform
The model expects precomputed features with shape similar to (1, 8, 96)
The actual wake-word system relies on:
streaming ring buffers
MelSpectrogram ONNX
embedding ONNX
temporal feature stacking
reset / state / patience logic
So NanoWakeWord is effectively:
PCM → streaming features → embedding → stacked features → wakeword model
and not an end-to-end waveform → score model.
The problem
On Android, if I directly feed:
raw PCM
or even a fixed 1.38s waveform window
into wakeword.onnx, I get:
constant zeros
or false positives
or input shape errors
Which makes sense if feature matching is required.
Questions
Is it intentionally not supported to export an end-to-end ONNX model (waveform → score)?
Is the recommended approach to:
re-implement the feature pipeline (AudioFeatures, streaming melspec, embedding, stacking) on the target platform?
Is there any official or planned:
E2E export
reference Android / Kotlin implementation
or feature-exact spec for third-party ports?
Context / Motivation
I fully understand why feature logic may not be embedded into ONNX (state, control flow, buffers).
I’m not asking for magic auto-export — just clarity on:
what is guaranteed to match training
what is expected from downstream deployments
NanoWakeWord’s data generation and training quality is excellent, and I want to keep using it rather than switching to a simpler but less accurate wake-word stack.
Thanks again for the great work,
and I’d really appreciate any guidance on the intended production deployment path 🙏