Training a wakeword

horchd loads .onnx classifiers and runs them. To get a model in the first place, use one of these paths.

Importing a model

horchctl wakeword import takes either an HTTP(S) URL or a local filesystem path. It stages the model under ~/.local/share/horchd/models/ and registers it with the daemon.

From a URL

# openWakeWord pretrained models live in the GitHub release:
horchctl wakeword import https://github.com/dscripka/openWakeWord/releases/download/v0.5.1/alexa_v0.1.onnx --as alexa
horchctl wakeword import https://github.com/dscripka/openWakeWord/releases/download/v0.5.1/hey_jarvis_v0.1.onnx --as jarvis --threshold 0.65

The default wakeword name is the filename stem with . replaced by _ (so alexa_v0.1.onnx becomes alexa_v0_1). Use --as <name> to pick a cleaner name.

From a local file

horchctl wakeword import ~/Downloads/my-model.onnx --as my_wake
horchctl wakeword import ./trained/jarvis.onnx --threshold 0.65

If the file already lives under ~/.local/share/horchd/models/, no copy happens. Otherwise it's copied in.

Common openWakeWord pretrained models

File Suggested --as
alexa_v0.1.onnx alexa
hey_jarvis_v0.1.onnx jarvis
hey_mycroft_v0.1.onnx mycroft
hey_rhasspy_v0.1.onnx rhasspy
weather_v0.1.onnx weather
timer_v0.1.onnx timer

All published at https://github.com/dscripka/openWakeWord/releases/download/v0.5.1/<file>.

Re-importing

--force re-downloads / re-copies the model and re-registers it idempotently (Remove + Add):

horchctl wakeword import https://example.com/wake.onnx --as wake --force

Train your own with openWakeWord

For a custom wakeword see openWakeWord's training docs. The output is an .onnx file with input shape (N, 16, 96) and output (N, 1) — exactly what horchd's classifier loader expects. Drop it under ~/.local/share/horchd/models/ and run horchctl wakeword add <name> --model ….

After training, validate the model against a few held-out recordings via horchctl process before relying on it live.

In-app training (planned)

The horchd-gui Tauri app will eventually ship a Train tab where you record positive + negative samples through the system mic and produce an .onnx end-to-end. Today that tab is a scaffold — the sample recorder works, but the training engine itself is not wired up yet. For production wakewords use one of the two paths above.

Validation

When you horchctl wakeword add ..., the daemon loads the .onnx and validates the shape before accepting it. If you see something like:

Error: classifier "jarvis" at /…/jarvis.onnx has shape [N, 12, 96] -> [N, 1],
expected (N, 16, 96) -> (N, 1) — was this model trained for openWakeWord?

then the model isn't a 16-frame openWakeWord classifier. Re-export it from your trainer with the right window size.

Found a bug? Improve a section?

These docs live at codeberg.org/NewtTheWolf/docs.horchd.xyz. File an issue or send a pull request — even a typo fix is welcome.

For bugs and feature requests against the daemon itself, head to the horchd issue tracker.