Press a hotkey, speak, and drop the transcription straight into whatever field is focused
Glossa is a free, open source speech-to-text daemon for Ubuntu on GNOME Wayland. It records audio from your microphone, sends it to a speech-to-text provider, copies the result to the clipboard, and pastes it into the active window.
It works with Groq, OpenAI, and other OpenAI-compatible speech-to-text providers, including self-hosted ones.
I personally recommend using Groq as it offers the following benefits:
- Generous free limits (2,000 requests per day) and low prices (starting at $0.04 per hour) when you need more
- Amazingly fast LPU, capable of processing minutes of audio in seconds
- Whisper V3 Large and Whisper V3 Large Turbo, which support multilingual input out of the box
- Starts automatically with your system and works as a background daemon. Pastes transcribed text to the active input inside any window.
- Supports both toggle and push-to-talk modes.
- Works with Groq, OpenAI, and other OpenAI-compatible STT providers (including self-hosted setups).
- Can optionally run each transcription through an OpenAI-compatible LLM enhancer before pasting, to fix punctuation and obvious transcription mistakes.
- Easily configurable via
config.toml. - Manage the installed user service with
glossa service start,stop, andrestart. - Includes microphone keepalive controls for lower recording startup latency.
- Pastes using standard clipboard shortcuts such as
Ctrl+V,Ctrl+Shift+V, orShift+Insert, which helps with non-English input without switching keyboard layouts.
Run the interactive installer:
bash <(wget -qO- https://raw.githubusercontent.com/Glaicer/glossa/main/install.sh)
The script will automatically install runtime dependencies if missing and configure Glossa via terminal interface.
You may need to log out and back in before paste works if dotool was installed during the script run.
I started Glossa because speech-to-text on GNOME Wayland still feels more awkward than it should.
Here are the issues I kept running into with other tools:
- On Wayland, apps usually cannot register true global hotkeys directly, so you often end up depending on desktop portal support.
- A popular library
wtypefails in Wayland throwing: "Compositor does not support the virtual keyboard protocol". - Another popular library
ydotoolthrowsydotoold backend unavailable (may have latency+delay issues). - You can fix
ydotoolinstallation, but it still has issues: it doesn't support many non-English keyboard layouts and it has broken keybindings which prevents pasting from the clipboard via shortcuts. dotoolhas worked for me, however it is shipped as the source code and must be compiled manually.- There are some very decent apps with local (gguf) STT models support, however these models are slower and less accurate on laptops than cloud APIs.
Glossa is my attempt to make this whole workflow simpler and more reliable on Ubuntu GNOME Wayland.
Planned features:
- clipboard restore after paste
- direct input support
- FLAC recording
Glossa provides these CLI commands:
glossa daemonruns the daemon in the foreground. It requires--config <path>.glossa service startstarts the installedglossasystemd user service.glossa service stopstops the installedglossasystemd user service.glossa service restartrestarts the installedglossasystemd user service.glossa ctl togglesends a toggle-recording command to the running daemon over IPC.glossa ctl streamtoggles the warm microphone stream, like the trayMic streamitem.glossa ctl shutdownasks the running daemon to shut down over IPC.glossa doctorruns environment and configuration diagnostics.glossa statusprints the current daemon status reported over IPC.glossa updatedownloads and installs the latest release.
Most settings are available from the tray Settings menu, so you usually do not need to edit the config file by hand.
If you want to configure Glossa manually, edit ~/.config/glossa/config.toml. Use config.toml in this repository as the reference example.
The tray has an AI enhancer checkbox. When it is off, Glossa pastes the speech-to-text result directly. When it is on, Glossa sends the transcribed text to the OpenAI-compatible chat endpoint first, then pastes the corrected response. Configure enabled, base_url, model, and api_key in the tray Settings → LLM enhancer window or in the [LLM] section of config.toml.
Update an existing installation in any of these ways:
bash <(wget -qO- https://raw.githubusercontent.com/Glaicer/glossa/main/update.sh)glossa update- tray menu:
Update
The updater downloads the latest stable release, verifies its checksum, replaces the Glossa binary and bundled assets, and restarts glossa.service.
Run the interactive uninstaller:
bash <(wget -qO- https://raw.githubusercontent.com/Glaicer/glossa/main/uninstall.sh)
The script will:
- stop and remove the
glossaanddotooluser services - remove the Glossa binary and bundled assets
- remove the generated Glossa config, or restore the most recent config backup if one exists
- keep a non-installer-managed
~/.config/glossa/config.tomlin place - optionally remove
wl-clipboardanddotool
Glossa depends on:
wl-copydotool
The installer checks for both and installs them automatically.
If you do not want to use install.sh, you can install the release bundle manually on Ubuntu GNOME Wayland:
- Download
glossa-linux-x86_64.tar.gzandsha256sums.txtfrom the latest GitHub release. - Verify the archive:
sha256sum -c --ignore-missing sha256sums.txt- Extract it:
tar -xzf glossa-linux-x86_64.tar.gz- Install the runtime dependencies that
install.shnormally checks for:
sudo apt-get update
sudo apt-get install -y wl-clipboard libnotify-bin libxdo3- Install the bundled
dotoolpayload and udev rule:
sudo install -Dm755 dotool/dotool /usr/local/bin/dotool
sudo install -Dm755 dotool/dotoolc /usr/local/bin/dotoolc
sudo install -Dm755 dotool/dotoold /usr/local/bin/dotoold
sudo install -Dm644 dotool/80-dotool.rules /etc/udev/rules.d/80-dotool.rules
sudo groupadd -f input
sudo usermod -a -G input "$USER"
sudo udevadm control --reload
sudo udevadm trigger- Install Glossa itself under your user account:
mkdir -p ~/.local/share/glossa/assets/tray ~/.local/share/glossa/assets/sounds
install -Dm755 glossa ~/.local/bin/glossa
install -Dm755 update.sh ~/.local/bin/update.sh
install -Dm644 VERSION ~/.local/share/glossa/VERSION
install -m644 assets/tray/* ~/.local/share/glossa/assets/tray/
install -m644 assets/sounds/* ~/.local/share/glossa/assets/sounds/- Create
~/.config/glossa/config.toml. A good reference iscontrib/examples/config.tomlfrom this repository. Settype_command = "/usr/local/bin/dotoolc"so Glossa sends paste actions through the runningdotooldservice. If you useapi_key = "env:...", also provide the variable through~/.config/glossa/glossa.envor your user session environment. - Create the user services and enable them:
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/dotool.service <<'EOF'
[Unit]
Description=dotool daemon
PartOf=graphical-session.target
After=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/local/bin/dotoold
Restart=on-failure
RestartSec=2
[Install]
WantedBy=graphical-session.target
EOF
cat > ~/.config/systemd/user/glossa.service <<'EOF'
[Unit]
Description=glossa user-session daemon
PartOf=graphical-session.target
After=graphical-session.target dotool.service
Wants=dotool.service
[Service]
Type=simple
EnvironmentFile=-%h/.config/glossa/glossa.env
ExecStart=%h/.local/bin/glossa --config %h/.config/glossa/config.toml daemon
Restart=on-failure
RestartSec=2
[Install]
WantedBy=graphical-session.target
EOF
systemctl --user daemon-reload
systemctl --user enable --now dotool.service
systemctl --user enable --now glossa.serviceIf dotool was installed for the first time, log out and back in before expecting paste to work.
For local development, use the example config and standard Cargo commands:
cargo build
cargo test --workspace
cargo clippy --workspace
cargo run --package glossa-bin -- --config contrib/examples/config.toml daemonThe example config already points at the checked-out contrib/assets/... files, so it is meant for running from the repository rather than from an installed release.
