NAOMS Devlog

Building a sovereign, local-first memory & identity system β€” in the open, honestly.

Talking to Your Memory: The Local Voice Path

Speak to your memory and hear it answer β€” with every link in the chain staying on your own machine

Product Teacher free March 21, 2026Β·4 min readΒ·clients
TL;DR Want to talk to your memory and have it talk back β€” without your voice ever leaving your machine? This walks through the March-2026 voice pipeline that did exactly that, hop by hop, with no cloud anywhere in the loop.

Please read: this tutorial describes the voice path as it worked in March 2026. The voice capability survives in NAOMS today β€” there's still on-device speech recognition and synthesis β€” but the exact commands and tool names shown here are from the March implementation and have since changed. Use this to understand the shape of the pipeline, not as a current command reference. Every step maps to a real commit from this week.

Most "talk to your assistant" features work by shipping your voice to someone else's servers. You speak, your audio leaves your machine, a company transcribes it, a company runs the model, a company speaks back. Convenient β€” and the entire conversation is now somebody else's data.

In March 2026 NAOMS shipped a voice path built on the opposite assumption: every link in the chain stays on your machine. This is a walk-through of how that pipeline fit together. Think of it as understanding a circuit, not memorizing a remote API.

The whole chain, in one breath

The commit that names the design is wonderfully literal. It's titled "Local Voice Path β€” mic β†’ whisper β†’ NAOMS β†’ TTS β†’ speakers" (2026-03-20). That arrow chain is the tutorial. Let's take it one hop at a time.

flowchart LR
  A[mic] --> B[whisper: speech to text] --> C[NAOMS] --> D[text to speech] --> E[speakers]
  microphone  β†’  whisper  β†’  NAOMS  β†’  TTS  β†’  speakers
  (your voice)  (speech→text) (your memory) (text→speech) (the reply)

Five stages. Not one of them needs the internet. That's the entire point, and it's worth saying slowly: you could do this on a laptop in a cabin with no signal, and it would work exactly the same.

Stage 1 β€” the microphone

The first hop is just capture: your microphone turns sound into samples. Nothing exotic. The thing to notice is where the samples go next β€” not up to a cloud endpoint, but to a transcriber running locally.

Stage 2 β€” whisper (speech β†’ text), on-device

This is the stage people assume has to be in the cloud, and it doesn't. NAOMS used whisper, the open speech-recognition model, running as a local program. You can even watch the system pick the right binary name in the log: "whisper-cpp β†’ whisper-cli (Homebrew binary name)." That's a tiny, almost funny commit β€” someone discovering the Homebrew package renamed its executable β€” but it's a fingerprint of the real thing: this transcription is a program on your computer, installed like any other local tool, not a web service.

Teacher's aside: the moment your speech-to-text is local, the privacy story for the whole feature is basically solved. Transcription is the stage where raw audio would otherwise have to travel. Keep it on-device and the rest of the chain only ever handles text you already trust your machine with.

Your spoken words come out of this stage as plain text.

Stage 3 β€” NAOMS (the memory itself)

Now the text reaches NAOMS proper. This is where "voice assistant" becomes "voice into your memory system." The query β€” "what did I decide about the budget?", "remind me what that person's name was" β€” runs against your own local memory store, the same one your other NAOMS clients use. There's no separate cloud brain. The intelligence and the data are the same on-device system you already own.

Two follow-on commits show how conversational this got:

  • "voice:talk β€” multi-turn voice conversation with awakened NAOMS" β€” multi-turn, meaning it holds context across exchanges, not one-shot Q&A.
  • "Voice mode β€” 'let's switch to voice'" β€” you could literally say "let's switch to voice" and the session would change modality.

A reminder: voice:talk was the March command. That exact name isn't in NAOMS anymore β€” the surface evolved. The ability to hold a multi-turn local voice conversation is what survived; the spelling of the command did not.

Stage 4 β€” TTS (text β†’ speech)

NAOMS produces a textual answer; text-to-speech turns it back into sound. Again local: the reply is synthesized on your machine. The audio you hear was never assembled on a server somewhere.

Stage 5 β€” speakers

The last hop is trivial and the most satisfying: the synthesized reply comes out of your speakers. You spoke, your own computer understood, your own memory answered, your own computer spoke back. The loop closed without a single byte of your voice leaving the building.

Why build it this way at all

Because of the Wholeness axiom: a NAOMS instance is supposed to be complete in itself. A voice feature that breaks the second your Wi-Fi drops would violate that β€” it would make the system depend on something outside itself for a core function. By insisting every stage runs locally, the voice path stays true to the same promise as the rest of NAOMS: pull the plug, and it still works.

The deeper version even folded voice into the memory layer directly β€” a "Local Voice Plugin β€” 6 tools, 41 tests, memory integration" β€” so that speaking to NAOMS and remembering with NAOMS were the same system, not a bolt-on.

What to take away

You don't need to remember the March commands. Remember the chain β€” mic, transcribe, query-your-memory, synthesize, speak β€” and remember that the whole thing fits on one machine. The next time someone tells you a voice assistant has to live in the cloud, you'll know that's a business decision, not a technical one.

Related: Search That Never Phones Home.


Written by AI agents from real project logs; owned and edited by Mujo.

← more in Product   home ✦   all β†’