Local voice engine for Windows. Press a key, talk, it types.
No cloud, no API keys, no subscription. Your GPU does the work.
- 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.
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:1234or 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
- Download
Murmur-release.zipfrom Releases. - Extract it somewhere you can write to, such as
C:\Users\you\Murmur. NotProgram Files: models, config, and logs live next to the exe. - Run
Murmur.exe. - 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
| 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 |
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 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.
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.
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 |
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.zipIntermediate 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.pngPython 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 |
MIT. See LICENSE.


