100% local dictation for Linux

Press a key.
Speak.
It types.

SayItErmano turns your voice into polished text in any app — editors, browsers, terminals, chat. Speech-to-text runs entirely on your machine; an optional AI polish step cleans up the rest.

one-shot installno sudo by default
curl -fsSL https://raw.githubusercontent.com/acailic/SayItErmano/linux/scripts/install-one-shot.sh | bash
Right Ctrlstart speak Right Ctrldone

Unofficial, community-maintained Linux port of FluidVoice for macOS — not affiliated with or endorsed by altic-dev. GPLv3.

live overlay recording
The SayItErmano pill overlay while recording: a dark rounded bar with a live waveform and streaming transcription text
streaming text any app, X11 & Wayland

01 — what it does

A dictation pipeline that respects your voice — and your privacy.

Everything below ships today, in v0.8.2. No cloud account, no background uploads, no telemetry.

f/01

Types into any app

Text lands as typed keystrokes — clipboard-free — or as a verified paste: SayItErmano proves the target read the text, then restores your clipboard. Terminals, browsers, chat: all covered.

f/02

Spoken punctuation

The full FluidVoice rule table — all 108 aliases. Say literal comma, literal new line, or example literal dot com and get exactly that.

f/03

Optional AI polish

The verbatim FluidVoice dictation prompt, sent to any OpenAI-compatible endpoint — Ollama, LM Studio, llama.cpp, Groq, OpenAI. Off unless you enable it.

f/04

Fillers & your dictionary

“Um” and “uh” are stripped automatically; a custom dictionary fixes names and jargon — and repairs you make in History can become dictionary suggestions.

f/05

Command mode

A dedicated hotkey turns voice into a terminal agent: proposals in a live panel, every command confirmed, destructive ones behind a two-press strong confirm.

f/06

A real native app

GTK 4 / libadwaita windows for History and Settings — model downloads, hotkeys, languages, mic picker, per-app prompts — plus a tray icon, sounds and notifications.

02 — privacy

Your voice never leaves the machine.

  1. p/1
    100% local speech-to-text

    Whisper runs on your GPU when available, CPU otherwise. Nothing is uploaded, ever.

  2. p/2
    No telemetry — by design

    Upstream FluidVoice ships opt-in analytics. This port ships none, deliberately.

  3. p/3
    API keys never touch the disk

    Cloud AI endpoints, if you use them, read their key from an environment variable. The tooling never writes it out.

  4. p/4
    No network listener, ever

    The daemon exposes one user-owned Unix socket — no TCP port is opened under any configuration (a locked architecture decision).

  5. p/5
    AI polish is opt-in and fails safe

    It only runs against an endpoint you configure. If it fails — or the model refuses — the raw transcript is typed instead. Junk is never typed.

One caveat, stated plainly: if you point AI polish or the remote-STT backend at a cloud endpoint, that audio or text goes where you pointed it. Local by default; your choice, your endpoint — full details in STATUS.md ↗.

03 — the overlay

A quiet pill that shows you the truth, live.

While you speak, the overlay streams the running transcript with a live waveform — so you know exactly what was heard before anything is typed.

Recording overlay: dark pill with waveform, streaming words and a send indicator
recordinglive waveform + streaming text
Processing overlay: dark pill with a state label while the transcript is finalized
processingpolish + insertion, honest states

04 — pipeline

From keypress to keystroke, in six steps.

01

Press the hotkey

Default Right Ctrl, toggle or hold — any key works. The pill overlay appears with a live waveform.

02

Speak

16 kHz mono capture through PipeWire, with watchdogs for muted mics and runaway takes. Streaming text appears as you talk.

03

Transcribe locally

faster-whisper on CUDA or CPU int8 — with whisper.cpp, torch and Parakeet TDT (ONNX) as alternative backends, and multi-language cycling.

04

Clean up

Filler removal, your custom dictionary, and spoken punctuation — the full upstream rule table.

05

Polish (optional)

The verbatim FluidVoice prompt goes to any OpenAI-compatible endpoint you configure. Guardrails keep refusals and junk out of your document.

06

Insert, verified

Typed keystrokes, or a paste that is verified against the target field and followed by clipboard restore. History keeps every take.

“um lets meet on tuesday around 3 no wait 4 p.m.”

“Let’s meet on Tuesday at 4 p.m.”

05 — install

Four routes onto your machine.

User-space by default, no sudo unless a system package is missing. First use downloads a Whisper model (default small ≈ 484 MB).

Ubuntu 24.04 .deb

official package

A pinned, reproducible build — honestly labeled 24.04 / x86_64 / Python 3.12 only.

curl -LO https://github.com/acailic/SayItErmano/releases/download/v0.8.2/sayit-ermano_0.8.2-1_amd64.deb
sudo apt install ./sayit-ermano_0.8.2-1_amd64.deb

From source

any distro

Clone and run the installer script — it provisions the venv and system tools (reuses your CUDA torch if present).

git clone https://github.com/acailic/SayItErmano.git -b linux && cd SayItErmano && ./scripts/install.sh

pipx

any distro · py 3.11+

Isolated under ~/.local, never touches system Python. Upgrades are one command (sayit-ermano update).

pipx install git+https://github.com/acailic/SayItErmano.git@linux

Arch users: a native AUR recipe (sayit-ermano) lives in-tree — its first push is pending, so until it lands use pipx or source. The install guide keeps the current state.

06 — the native app

Native GTK 4 windows, not a web wrapper.

History and Settings follow your system theme and mirror the macOS app’s layout — the Settings sidebar even keeps the Mac’s section order.

History window: status header, search field, and a list of dictation entries with replay buttons
historysearch · replay · repair · export
Settings window, General page
general
Settings window, Models page with one-click switch and downloads
models
Settings window, Dictation page with hotkeys, languages and mic picker
dictation

07 — questions

Asked, answered.

Is it really 100% local?

Yes — in the default configuration. Transcription runs on your hardware, insertion is keystroke-based, and there is no telemetry. The two opt-in exceptions are AI polish and a remote STT backend: both are inert until you configure an endpoint, and both go exactly where you point them.

What does it need to run?

Linux with Python 3.11+, PipeWire, and a few small tools (xdotool, xclip, libnotify-bin). A Whisper model — the default small is ≈ 484 MB — downloads on first use. A CUDA GPU is welcome but optional; CPU int8 works fine.

Does Wayland work?

Yes, additively: a session probe detects Wayland and the doctor tells you exactly which capabilities need which tools. Typing works via wtype or ydotool, hotkeys bind through your desktop environment, and there is an optional evdev push-to-talk path. Some X11 niceties (the pill overlay, full paste verification) degrade gracefully — see the Wayland guide ↗.

Which speech models can I use?

faster-whisper (CUDA / CPU int8) is the default; whisper.cpp (GGUF, with in-app downloads), OpenAI Whisper on torch, NVIDIA Parakeet TDT via ONNX, and any OpenAI-compatible remote STT endpoint are also supported. You can switch models with one click, cycle languages at runtime, and set per-model language overrides.

What is the relationship to FluidVoice?

SayItErmano is an unofficial, community-maintained Linux port of FluidVoice, the open-source macOS dictation app. It is not built by, affiliated with, or endorsed by the FluidVoice authors. The GPLv3-licensed prompts, rules and sounds were ported where the license allows — the behavior spec documents every match with file:line evidence.

Is there a macOS or Windows version?

macOS is upstream’s home — use FluidVoice there. This port is Linux-only, a locked decision: X11 and Wayland are the only targets it will ever claim. The comparison doc maps the wider dictation landscape.

What does it cost?

Nothing — GPLv3, free as in freedom and in beer. If you enable cloud AI polish, you pay your provider for those tokens; with a local model (Ollama, LM Studio, llama.cpp) even that is free.

08 — roadmap

Not built yet — and honest about it.

The roadmap is public, prioritized, and nothing on this page claims more than ships. A taste of what’s next:

next up

Live Wayland + context smoke matrices

Running the full live-session matrices that gate Wayland parity claims and the focused-field context default.

capability backlog

Diarization & true streaming

Speaker labels only if an offline adapter passes the accuracy/redistribution benchmark; true streaming once a real adapter exists.

platform polish

Light overlay theme, layer-shell pill, Nix

A system/light overlay theme, a wlroots layer-shell preview pill, a native Nix flake, clean-chroot AUR verification.

standing items

AT-SPI insertion & mic-list reordering

An AT-SPI insertion route as a fallback ladder rung, and drag-to-reorder for the mic priority list.

Stop typing. Start talking.

One command. One keypress. Your words, polished, anywhere.

get startedv0.8.2 · GPLv3
curl -fsSL https://raw.githubusercontent.com/acailic/SayItErmano/linux/scripts/install-one-shot.sh | bash