WebSpeech Browser Satellite¶
No install, no hardware, no app store — just open a web page. The WebSpeech satellite is a satellite that lives entirely in a browser tab: it grabs the microphone right there in the page and streams what it hears to hivemind-core. Anyone you can hand a URL to can talk to your hive from their phone, their laptop, a borrowed computer — whatever has a browser. And it's no toy in the security department: the browser runs the same modern Noise handshake as a native client, deriving its key from the password in-page, so a password alone is all it takes.
In a nutshell
- On the device (the browser): microphone capture and VAD (JavaScript — Silero via onnxruntime-web), with three independently configurable options: wake word, audio transport, and text-to-speech.
- On hivemind-core: STT, skills, and intents. TTS synthesis never happens server-side for
this satellite: the default
server-textsetting renders the reply as text only, andphoonnx-jssynthesizes it in-browser instead. - By default it ships audio as base64 over the bus (
recognizer_loop:b64_audio) — the server needsovos-dinkum-listener >= 0.0.3a19and a one-timehivemind-core allow-msg "recognizer_loop:b64_audio". Switching the audio transport tobinaryinstead sends a WIRE-1STT_AUDIO_HANDLEframe, admitted through hivemind-core's binary policy rather than the bus allow-list. - Encryption defaults to the Noise v3 handshake with full parity to hivemind-core, deriving the key from the password in-browser. A password is enough — nothing to provision.
| Setting | Options | Default |
|---|---|---|
| Wake word | off, precise-onnx-js |
off — every VAD-segmented utterance streams; precise-onnx-js loads a Precise .onnx model in-browser and gates capture until the wake word fires |
| Audio transport | base64, binary |
base64 |
| Text to speech | server-text, phoonnx-js |
server-text — the reply is only rendered as text; phoonnx-js also synthesizes and plays it in-browser |
When to use it¶
- Web applications or chat interfaces
- Temporary client access from any device with a browser
- Users already in a browser context
Requirements¶
By default this browser client ships its captured audio as base64 over the bus (the
recognizer_loop:b64_audio message). hivemind-core must:
- Run a listener new enough to decode that message —
ovos-dinkum-listener >= 0.0.3a19. - Be told to accept the message:
Without both, the WebSocket connects but no audio ever reaches hivemind-core. The hub
does send an explicit hive.policy.denied error over the connection, but the page
doesn't currently surface that error, so it looks silent.
Switching the page's Audio transport setting to binary instead sends each utterance
as a WIRE-1 STT_AUDIO_HANDLE raw-PCM binary frame, smaller on the wire with no base64
inflation. That path needs hivemind-audio-binary-protocol on hivemind-core and is
admitted through its binary policy, not the allow-msg whitelist.
The TLS / mixed-content rule (read this first)
Browsers refuse to open an insecure WebSocket from a secure page. In practice:
- A page served over
https://may only open awss://(TLS) WebSocket — a plainws://target is blocked. - A plain
ws://WebSocket is only allowed to127.0.0.1/localhost.
So for local testing, serve the page on http://localhost and connect to a
hivemind-core instance on ws://127.0.0.1. To reach a remote hivemind-core from
an https:// page (such as the hosted demo), its WebSocket must terminate TLS — use
wss://. Microphone
access (getUserMedia) also requires a secure context (https:// or
http://localhost).
Advanced: crypto and VAD details
- Encryption defaults to the Protocol v3 Noise handshake with full parity
to hivemind-core: the browser negotiates the default
Noise_XXpsk2_25519_ChaChaPoly_SHA256suite and derives the PSK asargon2id(password, SHA-256(node_id))in-browser, pairing the native Web Crypto API with the pure-JS@noble/ciphers+@noble/hashesbundle. The Password field in the form is the password fromhivemind-core add-client— a password alone is enough, with no server-side configuration and no provisioned key. It falls back to the legacy V1 handshake (PBKDF2-HMAC-SHA256 + AES-GCM) against older hivemind-core versions, or when a minimal bundle ships without@noble. - Wake word is off by default, so capture is push-to-talk, gated by a Start
VAD / Stop VAD toggle. Setting Wake word to
precise-onnx-jsloads a Precise.onnxmodel in-browser and gates capture on it instead — nothing streams until the wake word fires. Voice activity detection uses the Silero VAD model run in the browser via onnxruntime-web (@ricky0123/vad-web), loaded from a CDN — so the page needs network access on first load.
Installation¶
No installation required on the client side. Include the HiveMind.js library in your HTML.
Resources¶
- hivemind-webspeech — reference implementation
- HiveMind-js — JavaScript client library
- hivemind-flask-chatroom — Flask template for a browser-based chatroom
Limitations¶
- Browser VAD capabilities vary by browser and platform
- Requires JavaScript support
- Microphone access requires user permission (browser security model)
- Wake word off by default — capture is VAD-gated push-to-talk via a VAD toggle button, unless
precise-onnx-jswake word is enabled in the page's settings
See also¶
For a text-only browser experience, hivemind-flask-chatroom
is a Flask web app (default port 8985, no audio) that fans one server-side credential
out to many browser visitors as a shared chatroom.
Next¶
New to HiveMind? Start with the Quick Start, then prepare the server side per the requirements above.
Source¶
Validated against the HiveMind source:
docs/configuration.md— server requirements, the TLS/mixed-content rule, the credential formREADME.md— v3 Noise crypto (ChaChaPoly + in-browser argon2id PSK) with V1 (PBKDF2 + AES-GCM) fallback, Silero VAD via onnxruntime-web,recognizer_loop:b64_audiotransportreadme.md— the JavaScript client library this page is built on