voxctrl is a programmable voice broker for Linux and Windows that runs 100% on your device. Whisper transcribes locally, your own models do the processing, and not a single byte of audio leaves your machine. Your words. Your hardware. Your control.
Every modern editor speaks MCP. Every shell speaks pipes. Every desktop speaks DBus. voxctrl is the part you've been writing yourself — the bit that turns vibrations into bytes and routes them to the right place.
voxctrl is built for people who don't want their voice on someone else's server. Audio is captured, transcribed, and processed entirely on your hardware — no telemetry, no cloud round-trip, no API key required.
Press a key. Speech becomes text. Text gets shaped. Shaped text goes wherever you tell it. Each leg is configurable per binding.
super+spacectrl+super+spacealtsuperctrl+super → z16kHz monosilence ⟶ stopwhisper.cpp + cudawhisper.cpp + vulkanwhisper.cpp int8moonshineat-spi2 → 300ch"my email" ⟶ …"period" ⟶ .get_user.nameOpenAI-compatible APIat-spi2wl-copyshell=falseFIFOtcp / unixappendsignalPOSTPOST + headersresponse_pipepiper / pocket-tts / espeak-ngEach subsystem composes with the others. Pick what you need, ignore the rest.
evdev-based input listener on Linux (Wayland + X11) and Win32 hooks on Windows. Five gesture types — hold, toggle, double-tap, double-tap & hold, and chord — each mapped to a different output.
whisper.cpp runs on CUDA (NVIDIA), Vulkan (AMD/Intel), and CPU. Moonshine (ONNX) is available for streaming and edge devices. The right backend is selected by GPU probe at startup.
Reads the surrounding text from the focused widget via the accessibility bus and feeds it to Whisper as an initial prompt — improving continuity with what's already on screen.
voxctrl ships a Model Context Protocol server. Any MCP-capable agent can drive your mic and speak through your speakers.
transcribe_voice · speak_text · get_statusPiper (ONNX neural voices) or Pocket-TTS (Rust voice-cloning) for high-quality on-device speech, with espeak-ng as a lightweight fallback. Per-target response_pipe FIFOs let agents stream answers back as audio.
Ocean Wave, Voice Card, Waveform, Pulse Ring, Mono Bars, Neon Spectrum, Retro Terminal, and Analog VU — rendered by a native Slint helper process. Select in Settings → Visual tab. Active-target indicator included on every style.
Bind a different gesture to each. Switch destinations without switching focus.
voxctrl detects when VS Code, Neovim, or any terminal is focused via AT-SPI2 and switches to Code Mode automatically — reformatting speech into valid syntax without touching your global Settings.
handleUserLogin()
MAX_RETRIES
# IDE target — code mode + AT-SPI2 context [[target]] id = "editor" label = "Code Editor" delivery = "inject" [editor.processing] code_mode = true atspi_context = true remove_fillers = true spoken_punctuation = false
Pipe your voice into any CLI agent through a named FIFO.
The agent's response can stream back through response_pipe
and be spoken
aloud automatically.
.in,
writes to .out
response_pipe
= one TTS utterance# bidirectional voice ⇄ agent [[target]] id = "hermes" label = "Hermes Agent" delivery = "pipe" pipe_path = "/tmp/hermes.in" response_pipe = "/tmp/hermes.out" append_newline = true [hermes.processing] remove_fillers = true spoken_punctuation = false # shell-side # mkfifo /tmp/hermes.in /tmp/hermes.out # cat /tmp/hermes.in | hermes > /tmp/hermes.out
Three different gestures, three different destinations. Hold to dictate. Double-tap to fire commands at an agent. Press a meta-binding to append to your daily journal. All without touching the mouse.
[[binding]] id = "dictate_hold" label = "Dictate (Hold)" keys = ["KEY_LEFTMETA", "KEY_SPACE"] gesture = "hold" target_ids = ["default"] [[binding]] id = "agent_command" label = "Agent (Double-tap)" keys = ["KEY_LEFTCTRL"] gesture = "double_tap" target_ids = ["hermes"] tap_ms = 250 [[binding]] id = "journal_capture" label = "Journal (Hold)" keys = ["KEY_LEFTMETA", "KEY_J"] gesture = "hold" target_ids = ["journal"]
Each target gets its own post-processing pipeline. The agent gets raw text. Your editor gets polished prose. Your journal gets bullets. From the same utterance.
voxctrl exposes its full pipeline as JSON-RPC 2.0 tools. Claude Desktop, Cursor, Zed — anything that speaks MCP — can open your mic, get a transcript, and queue a spoken response.
transcribe_voicetoolOpens the microphone, returns a transcript when speech ends.
speak_texttoolQueues text for playback through the configured TTS voice.
get_statustoolReturns whether the mic is open and TTS is playing.
{
"mcpServers": {
"voxctrl": {
"command": "socat",
"args": [
"STDIO",
"UNIX-CONNECT:/tmp/voxctrl-mcp.sock"
]
}
}
}
Every overlay shows an active-target indicator — so you always know where your speech is going, before you say a word.
On startup voxctrl probes nvidia-smi, /dev/nvidia0, and vulkaninfo to select the fastest Whisper engine for your hardware. Override anytime in Settings → Engine.
| Hardware | Backend | Compute | Latency | Notes |
|---|---|---|---|---|
| NVIDIA
CUDA 11+
|
whisper.cpp | CUDA fp16 | near-instant | Requires a CUDA-enabled build (--features cuda);
auto-detected via nvidia-smi
|
| AMD RDNA / GCN
vulkan
|
whisper.cpp | Vulkan | high-speed | Auto-detected via vulkaninfo
|
| Intel Arc / Iris Xe
vulkan
|
whisper.cpp | Vulkan | fast | Requires Vulkan ICD drivers |
| CPU only
x86_64 / arm
|
whisper.cpp | CPU int8 | reliable | Out of the box, no extra steps |
| Raspberry Pi / Edge
arm · onnxruntime
|
Moonshine | ONNX int8 | streaming | Select in Settings → Engine
|
whisper.cpp handles most hardware. Moonshine shines on edge devices and streaming. voxctrl selects automatically — or you can lock one in Settings → Engine.
C++ Whisper port with GGUF model support. Runs on CUDA (NVIDIA), Vulkan (AMD/Intel), and CPU. The default engine — selected automatically at startup by GPU probe.
Streaming-first ASR using ONNX runtime. Designed for edge and low-latency use cases. Caches encoder state during live speech for near-instant responses.
engine.backend = "moonshine"
| Feature | whisper.cpp | Moonshine ✦ |
|---|---|---|
| Inference style | batch / offline | streaming / live |
| GPU acceleration | CUDA + Vulkan | none (CPU-first) |
| Model format | GGUF | ONNX (.ort) |
| Edge / RPi | impractical | excellent ✓ |
| Model sizes | tiny → large-v3-turbo | base · tiny |
| Default model | large-v3 | base |
Install in five minutes. Forks and contributions welcome.