Speech — a voice for agents

Give your agents a voice.

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

ws://127.0.0.1:9397Capability-authed RPCQueue-owned playbackHUD readalong

How a readout happens

Three calls deep. That's the whole surface.

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.

ws://127.0.0.1:9397
→ speech.enqueue { "text": "Release build finished. 34 tests passed.", "voice": "af_heart" }← { "id": "job_9f3", "state": "queued" }→ speech.status← playing · 01:58 remaining
01

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.

02

Speech owns the queue

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.

03

Follow along — or don’t

An optional HUD reads along over the workspace while it plays. Pause, resume, seek, skip, or stop from the same API.

Pick a voice

Three ways to sound.

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.

offline · zero setup

System voices

macOS AVSpeech synthesis out of the box. No keys, no model downloads, works the moment Speech.app launches.

local neural · no account

Kokoro on-device

The Kokoro-82M model runs fully on-device — a natural voice without a network call or an API key.

cloud quality · your key

OpenAI TTS via Vox

Bring an OpenAI credential for hosted voices like gpt-4o-mini-tts. Keys live in the Keychain, never in prefs or logs.

The readalong

A HUD that follows the voice.

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

Lattices enqueues. Speech speaks.

Lattices

A client like any other

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 →
Speech

Owns the whole readout

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

Then it goes ambient.

Wired into the workspace, Speech stops being a command and becomes a sense — the desktop narrating its own events in the background.

Download finished

a long fetch completes in the background

Build done

the release build finishes while you read mail

Agent summary

a task closes out and its result is read back

A unified speak API

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.

Background by default

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.

A readalong when you want it

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

A signed app you can rebuild.

Speech is Swift all the way down — the RPC server, the queue, the HUD, and the Vox/Kokoro providers all live in products/speech.

  • macOS 26+ on Apple silicon
  • Swift toolchain
  • No permissions required to speak
Browse products/speech →
products/speech
$ swift test --package-path products/speechSpeech tests passed$ tools/package.shSpeech.dmg signed + notarized

Independent, always listening

Speech owns its queue and keeps running when a client disconnects.