Shaurya Singh

← work

A private voice agent

There’s a real phone number, and when it rings, this picks up — holds the conversation, yields the moment you cut it off mid-sentence, all on a 2013 Mac Pro with 12GB of RAM most people would recycle. It works when I call it. But I’m its author and the friendliest caller it will ever get, so until a dated check exists the stamp stays Unverified — the only word that sentence has earned.

real phone number · interruptible mid-sentence · 2013 Mac Pro, 12GB RAM · unverified — no dated check yet

unverified · no dated check

It answers an actual phone.

This is not a demo harness or a synthetic world — there is a real number, and when it rings, the agent picks up. It carries a conversation, and the part I cared most about getting right is that you can cut it off mid-sentence and it yields, the way a person does. An assistant you cannot interrupt is not an assistant; it is a recording with opinions.

The number is not printed here, and won’t be. If you want to reach me, the front door is spsjadon9@gmail.com — the agent’s line stays private, which is also what the “private” in the title means.

A 2013 Mac Pro, 12GB of RAM.

The hardware is a constraint I chose. Most of what makes voice agents feel impossible is rented — someone else’s inference, someone else’s uptime. Running this on a machine most people would recycle keeps me honest about what the system actually needs, and it means the whole thing sits under my desk where I can watch it, unplug it, and owe nobody an invoice for it.

The interesting constraint in a voice agent is not what it says. It is when. Text buys you unlimited thinking time; a phone call does not. Silence on a call is not neutral — past roughly a beat, the human assumes the line dropped and starts talking over you. So the entire system is built against a latency budget it does not control, and every component spends from the same account: hearing the end of the sentence, deciding what to say, and starting to say it.

That budget is why the pipeline has to stream rather than take turns. A system that waits for a complete utterance, then a complete response, then complete audio has already lost — those waits are sequential and they add. Recognition has to emit partial text while the person is still speaking, generation has to start before recognition is finished, and speech has to start playing on the first clause rather than the last. The user hears the first syllable, not the total.

Interruption — barge-in — is the part that makes it feel like a conversation rather than a kiosk, and it is a genuinely hard problem for a dull reason: the machine is talking while it is listening, so it hears itself. Something has to decide that incoming audio is a person and not the agent's own output leaking back, and decide it fast enough to stop mid-word. Cut too eagerly and the agent flinches at every cough; cut too late and you have built the thing everyone hates about phone systems. Yielding instantly is the whole feature, and it costs more engineering than the conversation does.

Which is the real reason the machine matters. On a 2013 Mac Pro with 12GB of RAM, every one of those choices is forced — there is no headroom to hide a slow component behind. The constraint is the teacher.

An anecdote is not a measurement.

“It works when I call it” is a true sentence and a useless status. It is an anecdote — undated, unrepeated, measured on the friendliest possible path: its own author, calling on purpose, ready to forgive. On this site a status is measured or it reads unknown, and what this project is missing is specific: a dated dependency check I am willing to stand behind. Until that exists, Unverified is the honest word for “probably fine, not proven today” — so that is the word it wears.

Keeping an Unverified project on the site is the point, not an oversight. A portfolio where every stamp is green is not a portfolio; it is a mood. The discipline only means something if it sometimes costs me a color.

← back to work or ask me about it →