sayd

Fully local
Text to Speech

Notifications, selected text, and your coding agent's answers — spoken on your machine, optionally reworded by local LLMs to sound more natural.

Play the pipeline Signal < DBUS NOTIFICATION Alice: where do you want to go for dinner Alice now where do you want to go for dinner sayd reword llama.cpp 127.0.0.1:8080 > REWRITTEN Alice is asking where you want to go for dinner. Kokoro-82M text to speech, on-device
engine=kokoro-82m runtime=onnx target=sway/wayland voices=29 telemetry=none licence=mit

integration

Plug'n'play integration
with room to expand.

Everything arrives through the same queue, the same voice and the same transport controls — a tray icon, media keys, and a one-word CLI.

01 · already wired

Notifications

Already watching the session bus. Switch it on and name the applications — the settings window offers every one it has seen notifying.

[notifications]
enabled = true
allow = ["Signal"]

02 · one keybind

Selection and clipboard

Bind a key in sway, or anywhere that can run a command. sayd reads the PRIMARY selection itself, so the text never passes through a shell.

bindsym $mod+Shift+s exec say selection
bindsym $mod+Shift+v exec say clipboard

03 · one command

Your own integrations

Anything that can run a command can speak. Pick the voice, the speed, where it lands in the queue, or ask for a rewrite first.

say --policy interrupt "build failed"
say --voice af_heart --speed 1.2 "done"
say --reword selection

rewording

Most text was never written to be heard.

A notification is a label, a colon and a fragment. Read out verbatim it sounds like one. sayd can put a small language model in front of the speaker to turn it into a sentence first — and nothing else.

notification

Alice: where do you want to go for dinner

spoken

Alice is asking where you want to go for dinner.

notification

Mutti: kommst du Sonntag?

spoken

Mum is asking whether you are coming on Sunday.

notification

Bob: sry running late, 15min

spoken

Bob is sorry and is running 15 minutes late.

install

How to get started.

sayd is the resident daemon; say is the CLI that drives it. Speech needs espeak-ng and ONNX Runtime, and the settings window needs GTK4 and libadwaita — so the only real work is getting those four in place.

With Nix

The flake carries every dependency, so there is nothing to install first. It also exposes an overlay, if you would rather put sayd in environment.systemPackages.

# straight from the repository
nix run github:elsirion/sayd

# or from a checkout
nix build

With your own package manager

Install the four native dependencies, then build. ONNX Runtime is loaded at runtime rather than linked, so point ORT_DYLIB_PATH at it.

# Debian/Ubuntu — adjust for your distribution
apt install libespeak-ng-dev libonnxruntime-dev \
            libgtk-4-dev libadwaita-1-dev

export ORT_DYLIB_PATH=/usr/lib/x86_64-linux-gnu/libonnxruntime.so
cargo build --release

read the docs

credit where it is due

Inspired by sayit.

sayit by calle is private, local text to speech for Apple silicon Macs — select text, press a key, hear it, and nothing leaves the machine. An idea that good should not be exclusive to macOS. sayd aims to provide the same functionality on free and open source operating systems like Linux.