Skip to content

Repository files navigation

Murmur

Murmur

Local voice engine for Windows. Press a key, talk, it types.
No cloud, no API keys, no subscription. Your GPU does the work.

Download the latest release

Murmur desktop UI


What it does

  • Dictation into any window. Whisper runs on your GPU. Text goes straight into the focused app through SendInput, no clipboard.
  • File transcription. Drop a WAV, MP3, FLAC, or M4A onto the window and get text back, as plain text or markdown, optionally cleaned or summarized by your local LLM.
  • Optional cleanup through a local LLM. Filler removed, punctuation fixed, or your speech restructured into prompts, task lists, or paragraphs. LM Studio or llama.cpp, your choice.
  • Real-time DSP. Noise gate with guided calibration, optional compressor, live spectrum and level meters.
  • A native desktop UI. C++ and DirectX 11. HDR output on HDR displays.

Everything runs on your machine. Nothing leaves it.

Quick start

Requirements

  • Windows 10 or 11
  • NVIDIA GPU with 4 GB or more of VRAM. Without one, Murmur runs a smaller Whisper model on the CPU. It works, just slower.
  • For cleanup modes only: LM Studio at localhost:1234 or a llama.cpp server, with a model loaded. Qwen3-4B Instruct is a good fit. Raw mode needs no LLM at all.
  • Optional: ffmpeg on PATH for MP3 export.

Install

  1. Download Murmur-release.zip from Releases.
  2. Extract it somewhere you can write to, such as C:\Users\you\Murmur. Not Program Files: models, config, and logs live next to the exe.
  3. Run Murmur.exe.
  4. Press F1 or click the banner. Talk. Pause. It types.

The UI starts the engine in the background. The first run downloads the Whisper model (about 1.5 GB) into models\; the banner says so until it's ready.

Updates are one click. When a new version is out, an update button appears in the menu bar. Your config, models, and recordings are kept, and most updates are a 30 MB download.

Note

The release is not code-signed, so the first launch shows a SmartScreen prompt. Click More info, then Run anyway. Some antivirus tools flag the keyboard hook Murmur uses to type for you. That hook is the product; add an exclusion if you need to.

LM Studio settings for Qwen3-4B

LM Studio settings

Setting Value Why
Context length 2048 Dictation chunks are short
GPU offload Max The model is 2.7 GB; keep it all on the GPU
Eval batch size 2048 Whole prompt in one pass
Max concurrent predictions 1 One user
Flash attention On Faster
Keep model in memory On No reload between chunks

How it works

Speech is split on silence, transcribed by Whisper, optionally cleaned by your LLM, then typed. Five modes decide the cleanup:

Mode LLM Result
Raw off Exactly what Whisper heard. The default.
Clean on Filler removed, punctuation fixed, your words kept.
Prompt on Restructured into a clear prompt for an AI tool.
Dev on Numbered tasks and checklists.
Detailed on Expanded into structured paragraphs.

Profiles bundle a mode with voice commands and hotkey settings, and switch on their own when a matching window comes to the front:

Profile Mode Trigger
Default Raw Everything else
Terminal Raw Shells, where commands need exact text
LM Studio Prompt "command send" presses Ctrl+Enter
VS Code Dev Structured task output
Meeting Clean Notes during calls

Voice commands start with the word "command":

Say Result
command new line Shift+Enter
command send Enter, or Ctrl+Enter in the LM Studio profile
command copy / paste Ctrl+C / Ctrl+V
command clear Select all, delete
command stop dictation Stops recording

Approval mode holds each chunk for review before it's typed. Push to talk records only while the hotkey is held. Both are switches on the main screen.

The UI

The desktop app is the Obsidian Signal theme: cool black surfaces, one teal accent, and the engine phase owning the light on screen.

  • The banner shows the phase (listening, recording, transcribing, cleaning, typing, review) and a stopwatch while recording. Click it to start or stop.
  • The rail under it tracks each stage of the current chunk with its latency.
  • Spectrum card with pre/post-DSP toggle, level meter, and gate state.
  • Noise gate card with open and close thresholds, floor, guided auto-calibration, and a slider lock.
  • Heard and Typed cards so you can see what Whisper got and what went out.
  • HDR. On an HDR display Murmur switches to a 16-bit scRGB swapchain and the glow goes above paper white. View, HDR Output has Auto, Always on, Off, plus paper white and glow sliders. SDR displays are unaffected.
  • Reduce Motion in the View menu turns off the idle loop, the sweep, and the breathing glow.
  • Studio and Classic themes remain under View, Theme.

Two cards under Heard and Typed cover the other half of the app. Transcribe a file: drop a WAV, MP3, FLAC, or M4A anywhere on the window (or press Ctrl+O), watch the banner count it up, pick Raw, Clean, Detailed, or Summarize and TXT or MD, and it lands in Transcriptions\. Record the mic: one button, pre or post DSP, saved to Recordings\, with MP3 export and a one-click Transcribe it.

Configuration

config.json next to the exe holds everything. Missing keys fall back to defaults, so older configs keep working.

{
  "whisper_model": "Purfview/faster-distil-whisper-large-v3.5",
  "mic_device_index": 0,
  "hotkey": "f1",
  "energy_threshold": 0.01,
  "silence_timeout": 1.5,
  "llm_mode": "raw",
  "llm_backend": {
    "type": "lmstudio",
    "lmstudio": { "url": "http://localhost:1234/v1/chat/completions" },
    "llamacpp": { "url": "http://localhost:8080" }
  },
  "command_prefix": "command",
  "voice_commands": { },
  "llm_modes": { },
  "profiles": { },
  "auto_detect": { },
  "dsp": { },
  "vad": { "enabled": false, "threshold": 0.5, "min_silence_ms": 300 },
  "recording": { "default_source": "post", "save_dir": "Recordings" }
}

Slider changes in the UI save on their own. UI choices (theme, HDR, reduce motion) live in ui_settings.json.

Murmur picks a Whisper model for your hardware: distil-large-v3.5 on an NVIDIA GPU, small.en on CPU. Change it any time from the Model dropdown; the choice is remembered. Silero VAD (neural speech detection) is available when running from source with torch installed; the packaged build uses energy-threshold detection to keep the download small.

Running from source

Python 3.11 or newer and an NVIDIA GPU with the CUDA toolkit.

git clone https://github.com/Roach9223/Murmur.git
cd Murmur
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt

python app.py --server        # engine plus the HTTP API the desktop UI connects to
python app.py                 # headless: tray icon and hotkey only
python app.py --no-cleanup    # force Raw mode
Flag Default Effect
--server off HTTP API on 127.0.0.1:8899, required by Murmur.exe
--port N 8899 API port
--no-cleanup off Raw mode, no LLM
--base-dir PATH script dir Where config, prompts, models, and logs live

Building the release

build.bat bundles the engine with PyInstaller, builds the C++ UI with CMake, and assembles the Murmur\ folder.

Prerequisites: Python 3.11+, CUDA Toolkit 12.1+, Visual Studio 2022 with the C++ desktop workload, CMake 3.21+, vcpkg with VCPKG_ROOT set, and pip install pyinstaller.

build.bat                  # full build
build.bat --ui-only        # C++ UI only
build.bat --release        # also package Murmur-release.zip and the slim Murmur-update.zip

Intermediate files go to F:\tmp if it exists, otherwise %TEMP%.

The idle loop behind the banner is rendered headless in Blender 5.2 and tiled into a sprite sheet:

"C:\Program Files\Blender Foundation\Blender 5.2\blender.exe" -b --python assets\anim\render_idle_band.py -- --out <tmp>\frames
python assets\anim\make_sheet.py <tmp>\frames assets\anim\idle_band.png

Under the hood

Python engine   audio capture, DSP, Whisper, LLM cleanup, text injection
      ↕  HTTP on 127.0.0.1:8899
C++ UI          Dear ImGui + DirectX 11, HDR composite, spectrum, controls

The engine is fourteen small services wired together by app.py. An eight-phase state machine drives the pipeline: idle, listening, recording, transcribing, cleaning, typing, pending approval, error. Failures log and the loop continues.

The HTTP API has around thirty endpoints: recording control, mode and profile switching, approval, file transcription, WAV recording, DSP calibration, config, logs, shutdown. CORS is on. The full reference is in CLAUDE.md.

Layer Built with
Transcription faster-whisper, CUDA float16, CPU int8 fallback
Cleanup LM Studio (OpenAI-compatible) or llama.cpp server
Audio sounddevice / PortAudio over WASAPI at 48 kHz, numpy and scipy for DSP and resampling
API FastAPI and uvicorn
Typing keyboard, SendInput with KEYEVENTF_UNICODE
UI Dear ImGui, DirectX 11, cpp-httplib, Space Grotesk and JetBrains Mono
Motion Blender for the idle loop

License

MIT. See LICENSE.

About

Local voice-to-text engine for Windows | Whisper + optional LLM cleanup, real-time DSP, C++ UI. Press a key, talk, it types. No cloud, no API keys.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages