mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-30 19:09:28 +00:00
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). |
||
|---|---|---|
| .. | ||
| docs | ||
| i18n/zh-Hans/docusaurus-plugin-content-docs/current | ||
| scripts | ||
| src | ||
| static | ||
| .gitignore | ||
| docusaurus.config.ts | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| sidebars.ts | ||
| tsconfig.json | ||
Website
This website is built using Docusaurus, a modern static website generator.
Installation
yarn
Local Development
yarn start
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
Build
yarn build
This command generates static content into the build directory and can be served using any static contents hosting service.
Deployment
Using SSH:
USE_SSH=true yarn deploy
Not using SSH:
GIT_USER=<Your GitHub username> yarn deploy
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the gh-pages branch.
Diagram Linting
CI runs ascii-guard to lint docs for ASCII box diagrams. Use Mermaid (````mermaid`) or plain lists/tables instead of ASCII boxes to avoid CI failures.