Enqueue the words
Agents and scripts call the local RPC with the text to say — no synthesis code, no audio handling, no process babysitting on their side.
Speech — a voice for agents
Speech is a standalone player from Lattices: one local API for agents and scripts to queue spoken readouts, with an optional HUD readalong. Powered by Lattices, it can go ambient — a download finished, a build done — spoken in the background.
macOS 26+ · Apple silicon · signed + notarized
How a readout happens
Every spoken readout travels one short path: a client enqueues text, Speech plays it, and anyone listening hears the result. The RPC set stays tiny on purpose — enqueue, status, pause, resume, seek, stop, next, voices.
→ speech.enqueue { "text": "Release build finished. 34 tests passed.", "voice": "af_heart" }← { "id": "job_9f3", "state": "queued" }→ speech.status← playing · 01:58 remainingAgents and scripts call the local RPC with the text to say — no synthesis code, no audio handling, no process babysitting on their side.
Speech.app holds the queue, picks the voice, and plays in the background. The job is safe even if the client that queued it exits.
An optional HUD reads along over the workspace while it plays. Pause, resume, seek, skip, or stop from the same API.
Pick a voice
Every provider shares the same queue and the same calls — a preferred voice per provider is remembered locally, and an explicit voice on enqueue always wins.
macOS AVSpeech synthesis out of the box. No keys, no model downloads, works the moment Speech.app launches.
The Kokoro-82M model runs fully on-device — a natural voice without a network call or an API key.
Bring an OpenAI credential for hosted voices like gpt-4o-mini-tts. Keys live in the Keychain, never in prefs or logs.
The readalong
While Speech plays, a small overlay can float over the workspace and read along — enough to glance at what's being said without interrupting the task at hand. Turn it off and the queue still runs; Speech is a player first, a window second.
One family, clear ownership
The workspace daemon, your agents, and your scripts all call the same RPC. Nobody owns the queue but Speech — clients hand over text and get a job id back.
Explore Lattices →Synthesis requests, queue state, audio playback, the HUD, and voice preferences all live in Speech.app — a signed, separate process that keeps playing when clients disconnect.
Read the source →Powered by Lattices
Wired into the workspace, Speech stops being a command and becomes a sense — the desktop narrating its own events in the background.
a long fetch completes in the background
the release build finishes while you read mail
a task closes out and its result is read back
Any agent can say things out loud through one local interface — queue text, pick a voice, and playback keeps running even if the client disconnects.
A task finishes and its summary is queued and spoken while you keep working. Define it once and every agent you run gets a voice.
Speech shows a lightweight HUD over the workspace while it reads — follow along, or let it run quietly and check the queue later.
From source
Speech is Swift all the way down — the RPC server, the queue, the HUD, and the Vox/Kokoro providers all live in products/speech.
$ swift test --package-path products/speechSpeech tests passed$ tools/package.shSpeech.dmg signed + notarizedIndependent, always listening