DEV Community

Gabriel Hidalgo
Gabriel Hidalgo

Posted on Originally published at gabrielhruiz1.gitlab.io

Introducing Nova: an open-source voice assistant for the Raspberry Pi 4

Introducing Nova

Nova is an open-source voice assistant that runs entirely on a Raspberry Pi 4. You wake it
with a keyword, speak to it in plain language, and it answers out loud. It stays quiet and local
until you actually talk to it — only then does anything leave the device.

This post is a tour of what Nova is and the handful of decisions that shaped it.

The pipeline

Everything hangs off one simple loop, governed by a small state machine
(IDLE → LISTENING → THINKING → SPEAKING → IDLE):

  1. Wake word. In its resting state Nova only listens locally for the word "Nova", using a small on-device model. Nothing is sent anywhere.
  2. Listening. Once woken, it records until you stop speaking, detected locally with voice activity detection (VAD).
  3. Thinking. It transcribes your speech to text (STT) and sends that text to a language model (LLM) to produce an answer.
  4. Speaking. It turns the answer into speech and plays it back. Then it goes back to sleep.

Each stage sits behind an interface, so any one engine can be swapped without touching the rest.

The choices that matter

Local where it counts, cloud where it helps. Wake word, VAD, speech-to-text and the voice all
run on the Pi. The language model runs in the cloud by default, simply because a 2 GB Pi can't host
a strong LLM well. The LLM lives behind a provider interface, so you can point Nova at a hosted
Claude, at AWS Bedrock, or at a local Ollama server on your LAN. A fully local setup on a more
powerful node is on the roadmap.

Privacy by construction. Because the wake word runs on-device, Nova isn't streaming your room
to the internet. Audio is transcribed and sent only when you are inside an active turn — never at
rest. A short beep tells you when it is actually listening.

Spanish-first, but configurable. Nova was built and tuned for Spanish voice interaction,
including a custom wake-word model trained on Spanish pronunciations (the English generators simply
didn't match). Language and voices are configuration, not code.

Robustness is sacred. Nova is meant to run unattended for weeks. That pushed a lot of
unglamorous work: recovering a USB mic that gets unplugged, a systemd watchdog that can tell a hung
turn from a slow one, clean startup, and per-turn metrics so you can see what the box is doing —
right down to reading the Pi's thermal throttling state.

Why open source

The whole stack is free and open. The only running cost of the first version is the LLM usage from
whichever provider you choose. Everything else — the wake-word trainer, the installer, the design
docs — is in the repository, and the design documentation is treated as the source of truth and
kept in step with the code.

Where it's going

Nova already works end to end and installs as a service. Next up: better documentation and a
presentation site, a more natural voice, a performance benchmark with regression thresholds, and a
fully local node so the whole pipeline can run without the cloud.

If any of that sounds fun, come along for the ride.


Want more context, or to see how we did it?
Nova isn't fully public yet, but you can get early access to the repository — all the
documentation and the complete source code — at https://gitlab.com/gabrielhruiz1/nova.
Leave us a message and we'll try to grant you access ASAP, until we publish everything
officially (we're still working on a few parts).

Top comments (0)