omatalk
the reverse of dictation

Select text.
Press a key.
It talks.

Omatalk reads your selection out loud through a local neural voice, streamed in sentence-first chunks as it's synthesized. No network call, no API key, no cloud round-trip. The model stays warm on your own CPU.

~/docs/roadmap.md · primary selection
The reverse of dictation: instead of you talking to the machine, the machine reads back to you.
state: idle kokoro-82m · 24kHz · af_heart
install

Get it running

Models are about 185MB.

Marketplace: add the plugin, then click Install Omatalk in the panel.

marketplace
omarchy plugin add https://github.com/zerobearing2/omarchy-omatalk-plugin.git --enable

CLI: same installer from a terminal.

cli
curl -fsSL https://omatalk.zerobearing.com/install.sh | bash

Uninstall: Daemon, launcher, and plugin. Asks before deleting models and config.

uninstall
curl -fsSL https://omatalk.zerobearing.com/uninstall.sh | bash
why

Reading isn't always the shape you want text in

Some text is meant to be listened to, not stared at: a long changelog, a doc someone dropped in a channel, an email that can wait until you're not looking at a screen. Dictation tools like voxtype went one direction: voice into text. Nothing closed the loop back the other way for people living in Hyprland.

Cloud TTS solves the "read it to me" problem by shipping your clipboard to someone else's server. That's a real cost for a genuinely small task. Omatalk keeps the whole loop on the machine you're already sitting at: capture, synthesis, playback.

"instead of you talking to the machine, the machine reads back to you."
what it does

One hotkey, four moves

  1. Highlight text anywhere in Hyprland: a browser tab, a terminal, a GTK app, an editor buffer.
  2. Press the Speak Key. Omatalk resolves the Source: the Wayland primary selection first (wl-paste --primary), the clipboard if nothing's selected.
  3. The daemon streams it. Text is packed into sentence-first chunks and synthesized through Kokoro-82M. First audio lands before the rest has finished rendering.
  4. Press it again to interrupt. The playing Utterance cuts off immediately. Unchanged or empty Selection just stops; a new Selection starts speaking. No queue.
config

The whole configuration surface

Click the bar icon for voice and speed — it auto-saves, and the next utterance picks it up, no restart needed. omatalk config get/set/voices does the same from a terminal or a script. Everything else is two files, edited by hand.

Omatalk's voice and speed config panel, opened from the bar icon
Voice picker + speed slider. Selecting a voice or releasing the slider saves immediately.

~/.config/omatalk/config.toml is entirely optional. Missing the file, Omatalk just runs on defaults. Point voice at any name from the list above, tune speed, save.

~/.config/omatalk/config.toml
voice = "af_heart"
speed = 1.0

F8 answers F9: voxtype's dictation key speaks to the machine, F8 speaks back. The installer only prints this line; paste it into ~/.config/hypr/bindings.lua yourself.

~/.config/hypr/bindings.lua
o.bind("F8", "Omatalk", "omatalk speak")
voices

Twenty-eight voices, one config line

Kokoro-82M ships packs across nine languages; Omatalk speaks English only for now: American and British, eleven female and nine male US voices, four and four UK. Set voice = "…" in config.toml to any name below. af_heart is the default. Every clip is the same line, rendered through the pipeline Omatalk actually runs: Kokoro-82M, ONNX Runtime, CPU.

American English · Female
American English · Male
British English · Female
British English · Male
bar widget

One icon, three signals

The megaphone stays in the same place on the Omarchy bar. Its color tells you whether Omatalk is ready, reading your selection, or disconnected. If the Daemon is not installed yet, the same icon stays in the normal bar color and the panel offers Install Omatalk.

Omatalk bar widget
One megaphone glyph. Three useful states.

Idle

Omatalk megaphone in its idle state
Daemon readyNormal bar color

Speaking

Omatalk megaphone while speaking
Reading selectionTheme accent

Unavailable

Omatalk megaphone when the daemon is unavailable
Daemon disconnectedUrgent color
Live bar context, softened around the Omatalk glyph so the state color stays clear.
how it's built

No cloud in the loop

Kokoro-82M
ONNX Runtime, CPU, via kokoro-onnx by thewh1teagle. Model and original inference by hexgrad. Chosen over Piper (fast but audibly robotic) and XTTS/Chatterbox (GPU-sized, restrictive licenses). Near top-of-class naturalness with a ~185MB fp16 download, faster than real time on a mid-range laptop CPU.
Python daemon (uv)
Keeps the model warm in memory so a hotkey press never pays a 10–30s cold-load tax. Talks over a Unix socket: speak / stop / status, plus follow so the bar can track state.
wl-paste --primary
Reads the Wayland primary selection directly: no synthetic keystrokes, no clipboard mutation, no keyboard-injection daemon.
PipeWire
pw-cat streams raw PCM straight over stdin as each chunk is synthesized — no staged WAV files, layering over whatever else is playing. One player process per Utterance.
systemd --user
Starts the daemon at login and keeps it resident across the session; state and models live under ~/.local/share/omatalk/.
Hyprland bindings.lua
Hotkeys are user-owned config, never touched by the installer. F8 sits next to voxtype's F9 dictation key on purpose: F9 speaks you, F8 speaks back.
architecture

A warm daemon behind a socket

One hotkey press is a one-shot client; the daemon holds the model warm from login so nothing pays a cold-load tax mid-sentence.

┌───────────────────┐   ┌─────────────────┐
│ bindings.lua (F8) │──▶│ one-shot client │
└───────────────────┘   └─────────────────┘
                                 │
                                 ▼
                    Unix socket (omatalk.sock)
                                 │
                                 ▼
┌───────────────────────────────────────────┐
│      omatalk daemon · systemd --user      │
│ capture:  wl-paste --primary → wl-paste   │
│ chunker:  text → sentence-first chunks    │
│ engine:   Kokoro-82M · ONNX Runtime · CPU │
│ player:   pw-cat → PipeWire (streamed)    │
└───────────────────────────────────────────┘
roadmap

Shipped and next

The MVP scope stayed narrow on purpose. Three pieces have shipped; the remaining work is next, in roughly the order it will land.

Quickshell widget shipped
A megaphone status indicator in Omarchy's own shell. It follows the daemon over a Unix socket, uses the theme accent while speaking, and shows the shell urgent color after a 3-second disconnect grace period.
Half-size model shipped
The installer now ships the fp16 export (~185MB download, spectral correlation 0.999 against fp32 — audibly identical). Measured honestly: resident memory is a wash (~equal on short utterances, slightly higher under sustained long synthesis) — the win is the halved download, not RAM. A low-resource engine choice (Piper, int8) for potato-class machines remains open.
Voice + speed panel shipped
Click the bar icon for a voice picker and speed slider, both auto-saving to config.toml — the next utterance binds the change, no restart. The same surface is scriptable: omatalk config get/set/voices.
Media ducking
Automatically lower other audio while Omatalk is speaking, opt-in via config.
More languages
Kokoro-82M ships packs for nine languages. Omatalk speaks English only for now.
credits

The voice and the OS

The neural voice is Kokoro-82M by hexgrad. Omatalk runs it through kokoro-onnx by thewh1teagle, the Python ONNX package the daemon imports.

Omatalk is built for Omarchy by DHH. The bar plugin, the F8/F9 pairing, and the installer all sit on that desktop. Source: github.com/omacom/omarchy.