Send the text
An agent or script sends the words to Voice over a local socket. It needs no speech code and no audio library.
Voice, for agents
Voice is a standalone app in the Lattices family. Agents and scripts send it text over one local API, and it reads the text aloud in order, showing what it reads in a small panel. With Lattices running, it also tells you when things happen: a download finishes, a build is done.
macOS 26+ · Apple silicon · signed + notarized
Speech 0.3.0 downloads as Speech.app and appears as Voice in the menu bar. Use matching Lattices app and CLI versions, 0.15.1 or later.
How it works
An agent sends text and Voice reads it aloud. Seven more calls cover the rest: status, pause, resume, seek, stop, next and voices.
→ speech.enqueue { "text": "Release build finished. 34 tests passed.", "voice": "af_heart" }← { "id": "job_9f3", "state": "queued" }→ speech.status← playing · 01:58 remainingAn agent or script sends the words to Voice over a local socket. It needs no speech code and no audio library.
Voice holds the queue, picks the voice and plays each job in order. A job keeps playing if the sender exits.
Pause, resume, seek, skip or stop with the same calls. A small panel shows what is playing.
Voices
Every provider uses the same queue and the same calls. Voice remembers a preferred voice for each provider, and a voice named in the request always wins.
The voices built into macOS. No keys and no downloads; they work as soon as Voice opens.
Kokoro downloads its model and voice assets on first use, then speaks on your Mac without a network connection or an API key.
Add an OpenAI key to use hosted voices such as gpt-4o-mini-tts. The key stays in the Keychain, never in settings files or logs.
Playback panel
While Voice plays, a small panel shows the text being read, its progress and what's queued next, without taking focus from what you're doing. It hides when the queue is empty, and the menu bar brings it back.
Who does what
The Lattices app, your agents and your scripts all use the same calls. They send text and get a job id back; only Voice manages the queue.
Explore Lattices →Voice.app does the synthesis, the queue, the audio, the panel and the voice settings. It is a separate signed app, so playback continues when a client disconnects.
Read the source →With Lattices
With Lattices running, Voice can announce events as they happen, so you don't have to keep checking.
a long fetch completes in the background
a release build finishes while you read email
an agent finishes a task and Voice reads its result
Any agent or script sends text to one local socket. Voice queues it and reads it aloud, and the readout finishes even if the sender quits.
When a task ends, its summary is read out while you keep working. Set it up once and every agent you run can use it.
A small panel shows the text being read, its progress and how many readouts are queued. It hides when the queue is empty.
From source
Voice is written in Swift. The API server, the queue, the panel and speech providers are all in products/voice.
Upcoming source builds replace Kokoro with Phonon on the Neural Engine. The first use downloads a 137 MB model; speech then runs locally. Phonon uses a fixed speaking rate. This change is not included in the Speech 0.3.0 download above.
$ HUDSONKIT_WITH_VOICE=0 swift test --package-path products/voiceVoice tests passed$ products/voice/tools/package.shLocal Voice.app artifactRuns on its own