Skip to content

Voice Satellite

At the thick end of the spectrum, the device does the listening and the hearing. The voice satellite runs the whole speech stack itself — microphone, wake word, transcription, and speech synthesis — and hands hivemind-core nothing but the finished sentence: plain text, never audio. The reply comes back as text and the device speaks it aloud on its own. Point it at local speech plugins and your voice never leaves the room; the connection to the server carries only words. It's the most private and the most connection-tolerant option — a flaky network can't garble audio that was never sent — in exchange for needing a board with real CPU behind it (a Pi 4, a laptop, a mini PC).

In a nutshell

  • On the device: microphone, VAD, wake word, and STT + TTS.
  • On hivemind-core: skills, intents, reasoning — and no hivemind-audio-binary-protocol required.
  • It sends only text, so audio never reaches the server and you pick your own STT/TTS regardless of what the server runs.
  • Heads-up: the shipped defaults (ovos-stt-plugin-server / ovos-tts-plugin-server) are remote HTTP services, so out of the box audio still leaves the device for transcription. Swap in local plugins for a fully on-device, offline satellite.

Note: STT and TTS are chosen on the satellite, but the shipped defaults (ovos-stt-plugin-server / ovos-tts-plugin-server) are remote HTTP services pointed at *.openvoiceos.org. Audio stays off hivemind-core, but with the defaults it still leaves the device for transcription. For true on-device/offline operation, swap in local STT/TTS plugins (see Configuration).

What runs locally: Microphone + VAD + Wakeword (+ STT + TTS if local plugins are configured)

What hivemind-core provides: Skills, intents, reasoning


When to use it

  • Devices with sufficient CPU/GPU (laptop, desktop, Raspberry Pi 4B or better)
  • Maximum audio privacy — only if you swap in local STT/TTS plugins. The shipped defaults (ovos-stt-plugin-server / ovos-tts-plugin-server) send audio to a remote speech server (configured against *.openvoiceos.org).
  • Low-latency interaction (no round-trip for audio)
  • Fully offline operation after initial model downloads — again, only with local STT/TTS plugins in place of the remote-server defaults

Install

pip install HiveMind-voice-sat

# Linux (ALSA / SoundDevice microphone support)
pip install HiveMind-voice-sat[linux]

# macOS
pip install HiveMind-voice-sat[mac]

Quickstart

1. On hivemind-core — register a client:

hivemind-core add-client --name my-voice-sat
# note the Node ID, access_key and password printed

2. On hivemind-core — grant the client the utterance type:

hivemind-core allow-msg "recognizer_loop:utterance" <node_id>

A new client starts with an empty whitelist and is denied every message until you grant one. Without this the satellite connects and then stays silent.

3. On the satellite — run it:

hivemind-voice-sat --host <server_host> --key <access_key> --password <password>

Say your wakeword. The satellite transcribes locally and sends the utterance text to hivemind-core.

Pairing by sound (no --password)

If you start voice-sat without a --password (and none is stored in the identity file), it does not error out. Instead it launches hivemind-ggwave's GGWaveSlave and listens for the password to arrive over sound — a short audio "chirp" played near the device. Once it receives and stores the credentials, it connects automatically. This lets you pair a headless device by playing the pairing tone at it instead of typing a password.


CLI reference

Usage: hivemind-voice-sat [OPTIONS]

Options:
  --host TEXT      HiveMind host (ws:// or wss://)
  --key TEXT       Access key
  --password TEXT  Password for key derivation
  --port INTEGER   HiveMind port number (default: 5678)
  --selfsigned     Accept self-signed TLS certificates
  --siteid TEXT    Location identifier for message context

All flags fall back to the identity file written by hivemind-client set-identity.


Configuration

Because the whole speech stack runs here, this is where you get to choose every piece of it — which recogniser, which voice, which wake word. It's standard OVOS configuration in ~/.config/mycroft/mycroft.conf. The example below shows the shipped remote STT/TTS; to go fully offline, this is the block where you swap in local plugins.

Example:

{
  "listener": {
    "VAD": {
      "module": "ovos-vad-plugin-silero"
    },
    "wake_word": "hey_mycroft",
    "hey_mycroft": {
      "module": "ovos-ww-plugin-vosk"
    }
  },
  "stt": {
    "module": "ovos-stt-plugin-server",
    "ovos-stt-plugin-server": { "url": "https://stt.openvoiceos.org/stt" }
  },
  "tts": {
    "module": "ovos-tts-plugin-server",
    "ovos-tts-plugin-server": { "host": "https://tts.openvoiceos.org" }
  }
}

All plugin slots are swappable via ovos-plugin-manager.

Plugin type Config key Required
Microphone listener.microphone.module Yes
VAD listener.VAD.module Yes
Wakeword listener.wake_word Yes (can skip with continuous listening)
STT stt.module Yes
TTS tts.module Yes
G2P g2p.module No
Media playback various No
Audio/Dialog transformers various No
PHAL PHAL.ovos-phal-... No

How it differs from other satellites

Unlike mic-satellite and voice-relay, voice-sat sends text utterances to hivemind-core — no audio reaches hivemind-core. hivemind-core only needs to run skills and return text responses. It does not need hivemind-audio-binary-protocol. (With the default remote STT/TTS plugins, audio is still sent to the configured speech server for transcription; use local plugins to keep all audio on-device.)

You also choose your own STT and TTS plugins, independent of any hivemind-core configuration.


Next

Give hivemind-core something to answer with: set up an OVOS Skills backend.


Source

Validated against the HiveMind source: