hermes-agent/website/docs/user-guide/features
Ben Barclay 76ac204846 fix(wake): run openWakeWord on tflite on macOS ARM64
openWakeWord's ONNX backend returns near-zero scores on Apple Silicon
(dscripka/openWakeWord#336), so "Hey Hermes" never crossed the 0.5
threshold: the listener armed, the microphone worked, and nothing fired.

Bisecting the pipeline puts the fault in exactly one stage — feeding the
same audio through both backends, the melspectrogram front-end is
bit-identical (maxdiff 0.00000) and the wake classifier agrees on
identical features, while the shared embedding model diverges by 45.44.
Cross-feeding confirms it: tflite features scored through the *onnx*
classifier give 0.9948 vs 0.000009 for onnx features. A telling
secondary symptom is that scores fall as input gets louder (0.5x ->
0.00031, 8x -> 0.000066), which is garbage inference rather than a weak
detection.

Selecting tflite in config alone does not fix it. openWakeWord hardcodes
`import tflite_runtime.interpreter` but declares tflite-runtime for
`platform_system == "Linux"` only; on macOS the equivalent wheel is
ai-edge-litert, so that import always fails and model.py silently
downgrades back to onnx. The result is a detector that reports itself
listening and can never fire.

- default the backend per platform (tflite on macOS ARM64, onnx
  elsewhere) instead of hardcoding onnx, and pick the matching bundled
  model artifact
- bridge tflite_runtime -> ai_edge_litert through sys.modules, in-process,
  with no writes to site-packages
- refuse the silent onnx downgrade on macOS ARM64 and report the missing
  runtime through check_wake_word_requirements() so the GUI surfaces an
  actionable hint rather than arming a dead ear
- lazy-install ai-edge-litert via its own feature key, because lazy-dep
  specs cannot carry PEP 508 markers (_spec_is_safe rejects ";")

An explicit `inference_framework` in config still wins, so anyone pinning
a backend keeps it.

Verified on macOS 26.5.2 / M-series: "hey hermes" scores 0.0005 on onnx
and 0.9423 on tflite from the same clip, with cross-phrase controls at
0.0003. Live over-the-air through the real microphone fires 4/4
utterances (peak 0.9532).
2026-07-28 13:35:37 +10:00
..
_category_.json
acp.md
api-server.md
batch-processing.md
browser.md
built-in-plugins.md
code-execution.md
codex-app-server-runtime.md
computer-use.md
context-files.md
context-references.md
credential-pools.md
cron.md
curator.md
delegation.md
deliverable-mode.md
extending-the-dashboard.md
fallback-providers.md
goals.md
honcho.md
hooks.md
image-generation.md
kanban-tutorial.md
kanban-worker-lanes.md
kanban.md
lsp.md
mcp.md
memory-providers.md
memory.md
mixture-of-agents.md
overview.md
personality.md
pets.md
plugins.md
provider-routing.md
skills.md
skins.md
spotify.md
subscription-proxy.md
tool-gateway.md
tool-search.md
tools.md
tts.md
vision.md
voice-mode.md
wake-word.md fix(wake): run openWakeWord on tflite on macOS ARM64 2026-07-28 13:35:37 +10:00
web-dashboard.md
web-search.md
x-search.md