Skip to content

Repository files navigation

Murmur

Push-to-talk voice dictation for GNOME. A centered overlay records your speech, streams it to Mistral Voxtral for realtime transcription, and inserts the result into the focused field.

Murmur's overlay showing a live transcription over a document

Contents

Features

  • Push-to-talk: one shortcut to start, the same shortcut (or Enter) to stop and insert.
  • Live transcription in a centered overlay with a countdown, plus an optional hands-free stop after silence.
  • Realtime streaming to Mistral Voxtral over a WebSocket.
  • Written in TypeScript, type-checked against the GNOME Shell APIs and compiled to plain GJS modules.
  • Types via dotool for full Unicode in any app including terminals, with a virtual-keyboard fallback.

Requirements

  • GNOME Shell 47-50 on a Wayland session.
  • PipeWire pw-record - captures the microphone; ships with PipeWire, standard on modern GNOME. Murmur notifies you if it is missing.
  • dotool (recommended) - types arbitrary Unicode into any app, including terminals. Needs access to /dev/uinput (typically the input group plus dotool's udev rule). Without it, Murmur falls back to the virtual keyboard, which can only type characters from your current keyboard layout. See Text insertion.

Install

From extensions.gnome.org (recommended)

Install Murmur from its page on extensions.gnome.org.

Manual

git clone https://github.com/roman-16/murmur.git
cd murmur
just install   # compiles src/ into dist/, symlinks it into ~/.local/share/gnome-shell/extensions

This needs the toolchain below. To install without one, use the zip attached to a release.

On Wayland, log out and back in so GNOME Shell picks up the extension, then enable it (the Extensions app, or gnome-extensions enable murmur@roman-16.github.io).

Configuration

Open Murmur's preferences (Extensions app, or gnome-extensions prefs murmur@roman-16.github.io):

  • Mistral API key - your key for the Mistral Voxtral endpoint.
  • Transcription delay (1 s) - more buffered audio is more accurate, less is faster.
  • Recording shortcut (Super+Space).
  • Maximum recording time (120 s) - recording then stops and inserts on its own.
  • Stop after silence (off) - seconds of silence that end the recording.
  • Typing speed (500 characters/second) - lower it if characters get dropped.

Settings apply to the next dictation.

How it works

  1. Press the shortcut. A centered overlay opens and starts recording.
  2. Audio streams to Mistral Voxtral; partial transcriptions appear live.
  3. Press Enter or the shortcut again to stop. The microphone is released, the final transcription is collected, the overlay closes, and the text is inserted into the previously focused field.
  4. Esc cancels without inserting.

Text insertion

Murmur inserts text with the best available method, decided at runtime:

  • dotool (recommended). If dotool is installed and reachable, Murmur uses it to type arbitrary Unicode into any application, including terminals. This is the recommended setup - see below.
  • Virtual keyboard (fallback). Without dotool, Murmur types with a built-in virtual keyboard that can only produce characters from your current keyboard layout; characters not on your layout (emoji, other scripts, some punctuation) may be dropped.

To set up the recommended dotool path on any distribution:

  1. Install dotool.
  2. Grant your user access to /dev/uinput (dotool ships a udev rule; typically this means adding yourself to the input group).
  3. Optionally run the dotoold daemon for faster typing. Start it with DOTOOL_XKB_LAYOUT (and DOTOOL_XKB_VARIANT) set to match your layout: in daemon mode dotool reads the layout from the daemon's own environment, not from Murmur.

Development

Copy .env.example to .env and set MISTRAL_API_KEY (and optionally RECORDING_SHORTCUT).

The sources live in src/ and are compiled into dist/, which is what GNOME Shell loads. System tools are pinned with devbox, the JavaScript toolchain (TypeScript, GNOME type definitions, oxlint) with bun.lock:

devbox shell        # or: direnv allow
just build          # compile src/ into dist/ (installs npm dependencies when stale)
just check          # type-check only
just lint           # oxlint + type-check (quality gate)
just dev            # run in a throwaway, isolated nested GNOME Shell
just install        # symlink dist/ into your real extensions dir (log out/in on Wayland)
just prefs          # open the preferences dialog (after the shell knows it)
just pack           # build a .shell-extension.zip
just clean          # drop dist/ and node_modules/

After editing anything in src/, rerun just build (or just install) so the shell picks up the change.

About

Push-to-talk voice dictation for GNOME. A centered overlay records your speech, streams it to Mistral Voxtral for realtime transcription, and inserts the result into the focused field.

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages