Byline note: the project is mine, and so is the dream's provenance — it is Glenda's dream, told to me, and she gets the credit for the brief. The drafting is Claude Opus 5's, out of the Hark repository rather than from memory. The terminal shot below is real output it captured by running the thing.
Glenda went to a Greek festival with her family. She came back describing a table of miniature busts. Aristotle and the rest of them, small and heavy, the kind you buy because it looks like it belongs on a shelf you do not own yet.
Then she had a dream about me. In the dream I had made one of those busts. It was Paul Dirac, and it had Siri in it. You said its name and it answered.
That is the whole brief. I have had worse ones from paying clients.
One word in it changed what I had to build
I have been building toward a talking Dirac for over a year. There is a desktop app called dirac-voice. You open it, you talk, and my agent answers out loud with the same memory and tools it has in my terminal. It works. I use it most days.
Her dream still described something I had not built. The word was bust.
A bust has no window. You do not launch a bust. It sits on a shelf, and either it is listening or it is an ornament. Everything else follows from that. Its name has to be the way in. It has to be on before you decide to use it. And it has to answer fast enough that you never felt like you were waiting.
An app is allowed to ask you to open it first. An object is not.
So the gap was not intelligence, or the voice, or the personality. I had all three. The gap was the ear.
The ear is called Hark
Hark is the old word for listen. One syllable. It says what it does, it survives being shouted across a room, and it is easy to type.
Here is the shape of it:
mic ─▶ VAD ─▶ whisper (GPU)
│ transcript
▼
name at the start?
│ │
intent table the agent
(0 ms, no (the live
model) session)
│ │
▼ ▼
piper ─▶ speakers
The microphone runs all the time. A small piece of code watches the sound level and decides when a sentence has started and stopped. That clip goes to a speech-to-text model already sitting on my graphics card, which turns it into text in about 100 milliseconds.
Then one question: does the text start with the machine's name?
If it does not, nothing happens. The words never reach a model that could act on them.
If it does, the request goes one of two ways. Simple things — open an app, switch workspace, volume, the time — match a small table of patterns and run immediately, with no model involved at all. Everything else goes to my agent, which has every tool I have, and the answer comes back spoken.
It already answers
This is the real thing running, in dry mode, where it prints what it would do instead of doing it:
"Dirac, open a terminal" is on screen about 300 milliseconds after my last word. Most of that is the speech-to-text. The matching is free.
How it knows you meant it
Most voice assistants use a trained wake-word detector — a small model that learns the sound of one specific name. I did not do that, for one reason: I am building an operating system where the machine's name is whatever you typed when you installed it. A model per name does not survive that.
Since every sentence already goes through speech-to-text, I match the name on the text instead. But speech-to-text misspells names constantly. The first time I tested it, "Dirac" came back as "Durek".
So the match throws away the vowels and keeps a rough consonant skeleton:
"Dee rack" gets in. "Direct" does not. And the name has to be at the start — "I told Dirac to do it", said across the room, is not a request.
There is one exception. For eight seconds after it answers you, you can drop the name and keep talking.
What a dream cannot tell you
The brief was perfect and it was two sentences long, so all of the hard parts were mine.
A microphone that is always on has to decide when a sentence ended. It listens in 20-millisecond slices, compares each one to how loud the room normally is, keeps the third of a second before you started so your first word survives, and calls it finished after two thirds of a second of quiet.
It also has to go deaf while it speaks, or it hears its own voice and answers itself.
And building it turned up a bug I would not have found otherwise. The link between the ear and my agent had been quietly throwing away replies — a mismatched field name, reporting success and sending nothing. It had been eating answers from two other things I use daily. The ear made it obvious.
None of that is in a dream. Dreams hand you the object, which is the part I am worst at inventing.
Where it actually stands
Built in a day. The daemon, the command line tool, the service and the installer all exist, and the whole path works end to end without a person in the room: a synthesised sentence goes in, and a real answer comes out.
It has never once been used by voice, out loud, in my actual room.
It installs switched off, deliberately. An ear that starts listening because a script ran is the wrong first impression. Turning it on has to be something I decide, not something that happens to me.
There is also an admission built into it. I added a keyboard shortcut that opens the listening window without the name. The room is loud, the name gets misheard, or my hands are already on the keys and my mouth is not ready. It is the wake word by other means, and it exists because I do not entirely trust the wake word.
The bust
I built the talking part. She dreamed an object, and the object is not on my shelf.
That is the part I keep turning over. Almost every feature I have ever written down came from a workflow — something that annoyed me twice, a step I kept repeating. This one came from someone who does not write software, describing a thing that does not exist, in a dream, after looking at a table of dead Greek philosophers made small enough to own. It arrived with a shape, a name and a way of working, and it cost me nothing.
So I am seriously considering building it: a real bust, a real Dirac, the shelf-object shape from the festival table, with the microphone in the base and a speaker behind it.
What it would take
I have costed this enough to know it is not the hard part. Here is the shape of it.
The brain stays on the desk. This is the decision that makes everything else cheap. Hark already runs speech-to-text on my graphics card and sends the request to an agent that lives on my machine. The bust does not need to think. It needs to hear, send, and speak — which is a microphone, a speaker, a Wi-Fi chip and about a watt. Everything expensive stays where it already is.
That turns the object into a satellite, and satellites are a solved problem. The same shape as a smart speaker that does its thinking in a data centre, except mine is twelve feet away and in my own house.
The cheap build is about $30. An ESP32-S3 for the radio and the audio plumbing, a MEMS microphone on I2S (an ICS-43434 or an INMP441), a small class-D amplifier chip (a MAX98357A) and a 40 mm full-range driver. No fan, no heatsink, no operating system to patch. It draws little enough to run from one USB-C cable coming out of the back of the plinth.
The self-contained build is about $120. A Raspberry Pi 5 with a two-microphone HAT can run a small speech-to-text model on its own, so the bust keeps working when my desktop is off. It costs four times as much, it gets warm, and it answers slower. I would build the cheap one first and only reach for this if the dependency on my desktop turns out to annoy me.
Far-field is the part people underestimate. One good microphone is fine at arm's length and disappointing across a room. Two microphones let you subtract some of the room; four with proper beamforming is what commercial speakers use, and it is the single upgrade most likely to decide whether the thing feels alive or feels broken. I would start with one, sit it where it will actually live, and find out.
Making it stone is the fun part, and it is the oldest trick here. You do not carve it. You 3D-print the bust at the size you want, make a silicone mould of the print, and cast it. Cast in a gypsum plaster meant for casting — Hydrostone or Ultracal — and you get something hard, heavy and cool to the touch. Cast in marble dust mixed with epoxy, which the trade calls cold-cast marble, and you can sand and polish it until it is indistinguishable from the object on the festival table, because it is the same thing the festival table was selling.
Cast the head solid and the plinth hollow. Weight is most of what makes a small object feel expensive, and the head is where you want the weight.
Four details decide whether it feels real or feels like a craft project:
- The microphone cannot be buried. It needs a small hole in the front of the plinth, a short straight channel behind it, and acoustic mesh over it so it does not fill with dust. Mount it on a rubber gasket so the speaker's own vibration does not travel through the stone and into it.
- The speaker needs its own sealed room. A separate chamber, stuffed with wool, firing forward and slightly down so the shelf helps it. Share a cavity between microphone and speaker and it will hear itself no matter what the software does.
- Stone and radio do not get along. Thick mineral casting will cut the Wi-Fi. Keep the antenna in a deliberately thin section of the plinth floor, or run a cable out the back and stop worrying about it.
- The mute has to be physical. A switch on the base that cuts power to the microphone, not a setting. The whole thing installs switched off for the same reason. An always-on microphone in someone's living room earns trust by being obviously interruptible, and nothing is obvious about a setting.
And the amber mark on the front of the plinth lights when it is listening. That is not decoration. It is the only honest way an object with no screen can tell you what it is doing.
What is left in software is one thing, and it is small: right now Hark listens to the microphone plugged into my desk. A satellite means audio arriving over the network instead. That is one new input path feeding the same pipeline — the part that decides where a sentence ends, the name match, the reflex table and the agent all stay exactly as they are.
And once one exists, it does not have to be Dirac. The name is not baked into the code. It is whatever the machine is called, matched by sound, with no model to retrain. A bust of Aristotle would answer to "Aristotle" and nothing else in the stack would change.
Which closes a loop I did not see while I was building it. She looked at a shelf of small philosophers, dreamed that one of them was mine and could hear her, and the thing I built to make that work does not care which philosopher it is.
Onward.