Projects / Aether -- Local Smart Speaker

Aether -- Local Smart Speaker

activeRust100% · local inference

Open-source distributed smart speaker in Rust where all AI processing runs on your own hardware. Edge nodes on ARM SBCs detect a trainable wake word on-device and stream to a Dockerised brain over mTLS gRPC for Whisper STT, Ollama LLM and Kokoro TTS. AI inference runs locally, with no accounts and no telemetry; the only outbound calls are weather lookups (Open-Meteo, self-hostable) and a monthly Ollama version check.

STATUSactive
LANGUAGERust
METRIC100% · local inference
STACKRust · Tokio · gRPC (tonic) · mTLS · rustpotter · Whisper · Ollama · Kokoro TTS · Qdrant · Axum · Docker · mDNS
OVERVIEW

Aether splits a voice assistant into two roles. Edge nodes (e.g. Raspberry Pi) listen for the wake word locally and stream audio only after activation. The brain node (Docker Compose) runs transcription, the language model, speech synthesis, retrieval and a self-hosted web UI. A June 2026 merge added async skills with live integrations.

ARCHITECTURE
  • Wake word: rustpotter runs on the edge node, so no audio leaves the device until activation.
  • Wake-word training runs in the browser. Recorded samples are silence-trimmed, augmented with TTS-generated references and built into a rustpotter model that is pushed to nodes with an active session and hot-reloaded after that interaction, without a restart.
  • Discovery and transport: edge nodes find the brain via mDNS, and all traffic is mutual TLS gRPC using a self-hosted CA issued in a one-time pairing ceremony.
  • Brain: Whisper STT (whisper-rs) re-runs a fallback model when confidence is low, Ollama serves the LLM (Llama 3.2 3B by default), and Kokoro-82M via ONNX Runtime handles TTS.
  • Memory: .txt/.md documents are embedded with nomic-embed-text into Qdrant for RAG, alongside persistent per-node conversation history.
  • Multi-node: each edge node has an independent session. Auxiliary nodes can mirror a primary node's LED state without a microphone.
SKILLS
  • Async Skill trait with an injected SkillContext (node ID, shared HTTP client, config, session registry), dispatched by action name.
  • Weather via Open-Meteo, including city search for location setup.
  • Timers whose spoken callback is queued and delivered on the node's next wake-word activation.
  • Volume control through ALSA amixer on the brain host.
  • Lights on/off through the Home Assistant REST API.
  • Music from a self-hosted Navidrome (Subsonic API), streamed as MP3 to the edge node, with play and stop.
WEB UI
  • Served by the brain on port 8080 (Axum + MiniJinja), with no separate service.
  • Setup wizard, paired-node registry with online/offline status, and a real-time dashboard over server-sent events.
  • Ollama model management (pull, configure, remove), plus a monthly update check that shows a dashboard banner.
  • Document management for RAG, a skill tester for inspecting routing decisions, and skill settings for location, Home Assistant, ALSA and Navidrome.
HARDWARE & DEPLOYMENT
  • Cargo workspace: aether-core, brain-node and edge-node, plus a patched vendored candle-core.
  • GPIO via rppal drives LED status indicators and a physical panic button that kills active audio.
  • Edge binary cross-compiled for ARM with cross-rs and deployed over SSH by script.
  • Brain runs on CPU by default, with GPU acceleration for Ollama via a compose.gpu.yml overlay. Qdrant telemetry and Navidrome scrobbling are disabled in compose.