DSH Have Voice
Your agent works for twenty minutes. You are in another window. It tells you what happened — in its own words, in eight seconds. The first time it happened I was reading something else. The machine had been quiet for a
Your agent works for twenty minutes. You are in another window. It tells you what happened — in its own words, in eight seconds.
The first time it happened I was reading something else. The machine had been quiet for a while, then it said: "Tests are green, forty two of forty two. Next I'm taking the API layer." I stopped and listened. Then I went back to what I was doing, and for the first time in a long session I was not refreshing a tab every two minutes.
That is the whole product. The rest is plumbing.
The wrong unit
Agent voice usually means one of two things. Either the final answer gets read aloud, which is useless while you are away, or a chime plays when the run ends, which tells you that something happened but not what. Both treat speech as a notification channel for text.
When I am not looking, I do not want the answer. I want to know what changed. Three things, in this order: what just happened, how it went, what comes next.
The rule
What I did, how it went, what comes next. Two sentences, under eight seconds.
Milestones only — a batch finished, tests came back, something broke, I am blocked.
Written fresh every time, by the model that did the work. No canned status lines, no todo list read aloud.
Quiet when nothing changed. Frequent speech is the point; noise is the failure.
The third rule matters more than it sounds. A template says "task completed successfully". A model that just fixed the bug says "that type error was mine, the retry path returned the wrong shape". The second one is why you keep listening: it knows which detail you would have asked about.
Three updates from a real run:
Tests are green, forty two of forty two. Next I'm taking the API layer.
That type error was mine, the retry path returned the wrong shape. Fixed it, build is clean.
Deploy is live. Nothing is on fire, and the last thing left is the changelog.
Under the hood
The voice is Kokoro-82M: 311 MB of fp32 ONNX weights, 27 MB of voices, running on the CPU. On a 2013 Xeon it synthesizes at about 2.2× real time, so a four-second sentence costs 1.8 seconds of compute. That is not fast enough to read a novel, and it is fine for an update.
Two details make it feel immediate. The text is split into sentences, and each one goes to the player the moment it is synthesized, so the first sound arrives after 0.93 seconds while the rest still render. And every sentence is cached by its own text, so a repeated line — "tests are green" appears in every third update — costs nothing and always sounds identical.
No cloud, no API key, no per-character billing. The daemon listens on 127.0.0.1 and plays through PipeWire.
Why a tool and not a plugin
The interface is one MCP tool, narrate(text). The model calls it when something is worth saying. That is the whole integration.
It also means the words are the model's, not the plugin's. A plugin that watches events can only react with rules; a tool lets the model decide that this failure is worth a sentence and the three before it were not. And because it is MCP, it works wherever the agent runs: DSH, Claude Desktop, Cursor, anything that speaks the protocol.
What it does not do
English voices only. It needs a Linux desktop with PipeWire for playback (VOX_PLAY covers the rest). There are no ears yet — the listening half needs a speech recognizer and is not installed by default. And 2.2× real time is comfortable for narration, slow for audiobooks.
Detailed readme and installation process - https://github.com/retampweb/dsh-have-voice
The point
The point is not that the agent talks. Voice assistants have talked for a decade. The point is that you can stop watching it. A long run becomes a colleague in the next room: occasionally it says something, and every time it does, it is worth turning your head.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.