- C 87.9%
- Makefile 12.1%
|
Andie Keller
756c979f3f
explicitly hand off array buf to thread for processing. |
||
|---|---|---|
| src | better audio thread management | |
| .gitignore | init commit - empty C project | |
| architecture.svg | diagram of system architecture | |
| config | support multiple keyboard manipulation tools | |
| LICENSE | daemon & toggle setup for Wayland | |
| Makefile | fix Makefile (lib linking for ggml) | |
| murmur.desktop | daemon & toggle setup for Wayland | |
| murmur.service | Improve systemd service Readme | |
| README.md | diagram of system architecture | |
Murmur - A private, local AI app for speech-to-text with Wayland integrations
Lightweight, privacy-focused, speech-to-text application for Linux using OpenAI's Whisper model. All processing happens locally on your machine, so no internet connection is required.
Features
- 100% Local Processing - Your voice never leaves your computer
- Wayland Native - Built for modern Linux desktop environments
- Simple Toggle Interface - One hotkey to start/stop recording
- Desktop Notifications - Visual feedback of recording status
- Automatic Clipboard - Transcribed text copied automatically
How to Use Murmur
- Press your configured Murmur toggle hotkey.
- A notification will confirm recording has started.
- Yap away.
- Press the toggle hotkey again to stop recording.
- Wait a moment while the audio is being transcribed.
- When finished, text is automatically copied to your clipboard.
- Paste anywhere with Ctrl+V.
System Architecture
Requirements
System Dependencies
TODO: Improve dependencies section
make, wl-clipboard, libnotify
Note: The
libnotifypackage (orlibnotify-binon Debian/Ubuntu) provides thenotify-sendcommand. If you're using a different notification daemon like mako, dunst, or tiramisu, make sure it's installed and running.
Whisper.cpp
You need to install whisper.cpp separately. Follow the official whisper.cpp installation instructions.
Set the environment variable
Important: Make sure to set the WHISPER_CPP_DIR environment variable to point to your whisper.cpp installation.
export WHISPER_CPP_DIR=~/whisper.cpp
Add the export to your shell profile file to make permanently available.
# For bash
echo 'export WHISPER_CPP_DIR=~/whisper.cpp' >> ~/.bashrc
# For zsh
echo 'export WHISPER_CPP_DIR=~/whisper.cpp' >> ~/.zshrc
Whisper Model
You need to download a GGML Whisper model file. We recommend the base.en model for a good balance of speed and accuracy.
Download and install model:
# Create model directory (if it doesn't exist already)
mkdir -p ~/.local/share/murmur
# Download base.en model (142 MB)
cd ~/.local/share/murmur
wget https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin
# Alternative models (optional):
# Tiny (fastest, less accurate): ggml-tiny.en.bin (75 MB)
# Small (balanced): ggml-small.en.bin (466 MB)
# Medium (slower, more accurate): ggml-medium.en.bin (1.5 GB)
Installing Murmur
- Clone this repository
git clone https://github.com/yourusername/murmur
cd murmur
- Make sure WHISPER_CPP_DIR is set
export WHISPER_CPP_DIR=~/whisper.cpp # Adjust path as needed
- Build and Install Murmur
make
make install # Installs to ~/.local paths
Note:
~/.local/binmust be in yourPATH. Most distros include it by default; if not, addexport PATH="$HOME/.local/bin:$PATH"to your shell profile.
Usage
Starting/Running the Murmur Daemon
Sway
Add the following to your ~/.config/sway/config:
# Starts the daemon server
exec murmur-daemon
# Set the Murmur recording toggle shortcut
# Replace the shortcut with whatever you like
bindsym $mod+Shift+y exec murmur-toggle
Save and then reload: swaymsg reload
systemd (as a user service)
If your session supports graphical-session.target (e.g. GNOME, KDE):
cp ./murmur.service ~/.config/systemd/user/ # destination folder should exist, but if not create it with mkdir
systemctl --user daemon-reload
systemctl --user enable --now murmur
Setup Configuration
A default config file is installed to ~/.config/murmur/config (respects XDG_CONFIG_HOME). Edit it to change the Whisper model, language, etc:
[general]
notification_timeout = 3000
[whisper]
model = ggml-base.en.bin
language = en
cpu_cores_use = 2
Using a Different Model
Download the desired GGML model to ~/.local/share/murmur/ and update the config:
[whisper]
model = ggml-small.en.bin
Set CPU Cores Use Limit
Changing the value of cpu_cores_use in config will set how many CPUs the Murmur Daemon Whisper model use in transcribing your audio inputs:
[whisper]
cpu_cores_use = 4
Changing Language
Set the language code in the config file:
[whisper]
language = es
Use auto for automatic language detection, or any language code supported by Whisper (e.g. en, es, fr, de, ja, zh).
Troubleshooting
"WHISPER_CPP_DIR not set" error
Set the environment variable to point to your whisper.cpp installation:
export WHISPER_CPP_DIR=~/whisper.cpp # Or wherever you installed it
"Model not found" error
Make sure the model file in ~/.local/share/murmur/ matches the model value in your config (ggml-base.en.bin by default).
"Failed to connect to D-Bus" when running toggle
The daemon isn't running. Start it with murmur-daemon
"Failed to copy to clipboard"
Install wl-clipboard: sudo apt install wl-clipboard
No audio being recorded
Check your PulseAudio/PipeWire default input device:
pactl list sources short
Poor transcription quality
Try a larger model (small or medium) for better accuracy, or ensure you're speaking clearly and close to the microphone.
High CPU usage during transcription
This is normal - Whisper is computationally intensive. Use a smaller model (tiny) if performance is an issue.
Acknowledgments
- whisper.cpp - High-performance inference of OpenAI's Whisper
- OpenAI Whisper - The original Whisper model
Contributing
Contributions are welcome! Please send in any patches with fixes and improvements.