CLI
The lats voice commands that reach Voice, how the Lattices daemon forwards them to Voice.app, and what each playback command does.
Voice has no CLI of its own. The Lattices CLI sends speech output commands
through the Lattices core daemon. This page describes the commands that reach
Voice and their playback behavior. For the full lats voice reference,
including listening and spoken commands, see
Lattices voice.
Request path
lats voice say "…"
→ Lattices core daemon lattices.sock voice.say
→ Voice.app speech.sock speech.enqueueThe CLI reads the capability token from
~/Library/Application Support/Speech/RPC/capability and sends it in the
WebSocket handshake to the daemon. The daemon forwards output verbs only for
clients that present the token.
In Voice 0.3.0 and Lattices 0.15.1, both hops use private Unix sockets,
~/.lattices/run/lattices.sock and ~/.lattices/run/speech.sock. The CLI finds
them and their tokens for you. The command set does not change.
The CLI binary is also installed as
lattices. Both names run the same commands.
Commands that reach Voice
| Command | Daemon verb | Voice.app method | Result |
|---|---|---|---|
lats voice say <text> [--voice <id>] [--provider <id>] [--rate <n>] |
voice.say |
speech.enqueue |
The new job, with its id and state |
lats voice stop |
voice.stop |
speech.stop |
Queue status |
lats voice pause |
voice.pause |
speech.pause |
Queue status |
lats voice resume |
voice.resume |
speech.resume |
Queue status |
lats voice seek <seconds> |
voice.seek |
speech.seek |
Queue status |
lats voice skip |
voice.skip |
speech.next |
Queue status |
lats voice list |
voice.list |
speech.voices |
Voices, with availability |
lats voice select <voice> [--provider <id>] |
voice.select |
speech.preferredVoice.set |
The saved preference |
lats voice status |
voice.status |
speech.status |
Lattices listening state, plus a helper section with the Voice.app queue |
Add --json to any command for machine-readable output.
lats voice listen, stopListening, simulate, and intents do not reach
Voice. Lattices serves those commands itself.
Playback semantics
sayqueues.sayreturns when Voice.app accepts the job. The returned state reflects the job at that moment and is nevercompleted. Jobs play in order.- The queue outlives the caller. A job keeps playing after the CLI process exits.
stopclears the queue.stopstops the active job and cancels every queued job.skipkeeps the queue.skipends the active job and starts the next queued job.pause,resume, andseekact on the active job only.pausefails withNothing is playingwhen no job plays.resumefails withNothing is pausedwhen no job is paused.seektakes a position in seconds from the start of the job.selectsets a per-provider default. The voice applies to latersayrequests for that provider that name no voice.--ratemust be between 0.25 and 4.0. The default is 1.0.
lats voice stop stops speech output. lats voice stop does not stop voice
capture. To stop capture, use lats voice stopListening.
Limits
| Limit | Value |
|---|---|
| Text per job | 8,000 characters |
| Jobs in the queue | 32 |
| Recent finished jobs kept in status | 8 |
Errors
If Lattices cannot reach Voice.app, output commands fail with one of these codes. Lattices does not fall back to another voice.
| Error code | Meaning | Recovery |
|---|---|---|
helper_not_installed |
Voice.app is not on this Mac. | In the Lattices menu, choose Apps › Voice › Install. |
helper_unreachable |
Voice.app is installed but not running. | Choose Apps › Voice › Open. |
helper_unauthorized |
Voice.app is running, but the client did not send the capability token. | Use lats, or send the token from your client. See API. |
voice_stop_changed |
voice.stop was called while Lattices was listening and nothing was speaking. |
Use lats voice stopListening to stop capture. |