banshee
Health Warn
- License — License: Apache-2.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Fail
- os.homedir — User home directory access in integrations/pi/banshee.ts
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Give your AI coding agent a voice. Speak to it, hear it back, fully on-device.
Banshee
Banshee gives your AI coding agent a voice. Your agent - Claude Code, Cursor,
or any MCP host - speaks its decisions and questions out loud, and you answer
back by talking, hands-free, while it works. It runs entirely on your machine:
local Whisper for listening, a local neural voice for speaking, no cloud, no
API keys, no audio ever leaving your laptop.
It's also a straight-up local dictation tool: hold a hotkey, speak, and the
text lands in whatever app you're focused on. Pure Rust, offline, always on.
Demo
https://github.com/user-attachments/assets/006132bd-9710-4322-a35a-4a5e5004371c
The daemon running with the Pi coding agent. It asks which language to use,
hears "let's go with python", and writes the file. Nothing was typed.
Why Banshee
Plenty of tools will transcribe your voice into an editor. Banshee is built for
the other half of the conversation.
- Your agent asks, you answer.
ask_userspeaks a question, waits for
playback to finish, opens the microphone, and returns what you said, all in
one call. Most voice tooling is one-directional dictation; this is a loop. - It never hears itself. The microphone opens only after the question has
finished playing, so the daemon can't transcribe its own voice. That's why
Banshee works on laptop speakers without a headset. - Nothing leaves your machine. Whisper, Silero VAD, and Kokoro all run
locally. No API keys, no cloud tier, no audio uploaded, works on a plane. - It waits while you think. Answers end on 2.5s of silence rather than the
usual few hundred milliseconds, so pausing mid-sentence to think doesn't cut
you off. - It handles your jargon in both directions.
vocabularybiases Whisper
toward project words it would otherwise mangle, and the espeak-ng fallback
pronounces unfamiliar terms instead of spelling them out letter by letter. - Not tied to one vendor. It's an MCP server, so Claude Code, Cursor,
OpenCode, and anything else that speaks MCP all work. - One daemon, both jobs. Agent voice and system-wide dictation share the
same process, models, and microphone.
Install
Runs on macOS (Apple Silicon) and Linux (x86_64 / aarch64); Intel Macs
aren't supported. Needs ~1 GB of disk for the models.
On Linux, the global hotkey goes through X11; the library Banshee listens
with has no Wayland path, so under Wayland F5 does nothing. Bindbanshee record start / stop in your compositor instead (see
Wayland). Dictation typing does work under Wayland if wtype orydotool is installed. The agent voice (speak_status, ask_user) is
unaffected either way, and banshee doctor reports what your session supports.
Homebrew
brew install yamanahlawat/banshee/banshee
Shell installer
curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/yamanahlawat/banshee/releases/latest/download/banshee-installer.sh | sh
From source
Needs Rust (stable, edition 2024):
git clone https://github.com/yamanahlawat/banshee.git
cd banshee
cargo install --path bansheed # the `banshee` command
cargo install --path banshee-mcp-shim # the MCP shim (optional)
Setup
1. Download the models into ~/.banshee/models/:
banshee setup
| File | Size | What it is |
|---|---|---|
ggml-large-v3-turbo-q5_0.bin |
~547 MB | Whisper STT model (default balanced preset) |
silero_vad.onnx |
~2 MB | Silero voice-activity detection |
kokoro-v1.0.onnx |
~310 MB | Kokoro TTS model |
af_sky.bin |
~512 KB | Kokoro voice style (the configured voice) |
Files that already exist are skipped, so re-running banshee setup after
changing the STT preset or the TTS voice only downloads what's missing.
Optional: better pronunciation. Install espeak-ng and Banshee pronounces
unfamiliar words (tech jargon, proper nouns) instead of spelling them out. On
macOS it's brew install espeak-ng; banshee doctor prints the command for
your system.
2. Grant macOS permissions. Banshee needs three of them, otherwise it
quietly fails to record or type:
- Microphone, so it can capture audio.
- Input Monitoring, so it can listen for the global hotkey.
- Accessibility, so it can type out your transcribed text.
You'll find all three under System Settings > Privacy & Security. macOS
prompts for each one the first time Banshee needs it; approve the prompts, then
restart the daemon (permissions don't apply to an already-running process).
3. Check your setup:
banshee doctor
It reports on models, config, microphone, permissions, and daemon health, and
prints a fix for anything that's off. It never changes anything itself.
Usage
Start the daemon:
banshee start
It runs at every login, restarts if it crashes, and logs to~/.banshee/daemon.log. banshee stop pauses it until the next login or the
next banshee start. To run the daemon in the foreground instead (say, to
watch the logs while debugging), use banshee serve.
With the daemon running, the global hotkeys are:
- Hold
F5to record. On release, the transcription is saved, and you can
grab it later withbanshee listen. - Hold
Shift + F5to record. On release, the transcription is typed
straight into the app you're focused on (this is dictation mode).
Wayland
The global hotkey needs X11, so on a Wayland session (Hyprland, Sway, GNOME)
bind the record commands in your compositor instead. For push-to-talk on F5,
put these in ~/.config/hypr/hyprland.conf (or bindings.conf on Omarchy),
then run hyprctl reload:
bind = , F5, exec, banshee record start
bindr = , F5, exec, banshee record stop # bindr fires on release
bind = SHIFT, F5, exec, banshee record start --dictate
bindr = SHIFT, F5, exec, banshee record stop
Both release binds are there on purpose. Hyprland matches modifiers exactly, so
letting go of Shift before F5 means only the unmodified release matches.
Typing the transcription into the focused app needs wtype (wlroots
compositors such as Hyprland and Sway) or ydotool (anywhere, but it needs
its own daemon and uinput access). Without one of them, dictation has no way to
type and reports an error; the transcription is still kept inbanshee history. banshee doctor tells you which one it found.
The CLI commands all talk to the running daemon over its socket:
| Command | What it does |
|---|---|
banshee start |
Start the daemon, now and at every login |
banshee stop |
Stop the running daemon |
banshee setup |
Download the required models |
banshee status |
Show daemon health and state |
banshee doctor |
Diagnose setup problems and report fixes |
banshee serve |
Run the daemon in the foreground |
banshee service uninstall |
Remove the start-at-login launch agent |
banshee listen |
Print recent transcriptions |
banshee record start / stop |
Push-to-talk without the hotkey (for keybinds and scripts) |
banshee speak "<text>" |
Speak some text aloud |
banshee history |
List all saved transcriptions |
banshee clear-history |
Clear the saved transcriptions |
Connect your coding agent (MCP)
banshee-mcp-shim is an MCP stdio server that bridges your coding agent to the
running daemon. This is what turns Banshee into a voice for the agent. It
exposes three tools:
| Tool | What the agent does with it |
|---|---|
speak_status |
Say something aloud, for decisions made and work finished |
ask_user |
Ask a question aloud, then wait for and return your spoken answer |
listen_for_prompt |
Pick up anything you've said since it last checked |
It works with any MCP-capable tool, like Claude Code, OpenCode, Cursor, and
others. Most of them use the same mcpServers config shape:
{
"mcpServers": {
"banshee": {
"command": "banshee-mcp-shim"
}
}
}
Each tool keeps this config in its own spot (for example, Cursor uses~/.cursor/mcp.json, and Claude Code lets you add it with claude mcp add), so
check your tool's docs for where the MCP config lives. If your tool doesn't pick
up the binary from your PATH, use its full path instead. Restart the tool, and
the three tools will show up.
Pi coding agent
Pi has its own extension API instead of MCP, so it gets a native extension that
talks to the daemon directly. Copy it in and restart Pi:
cp integrations/pi/banshee.ts ~/.pi/agent/extensions/
That's the whole setup; see integrations/pi for details.
This is what the demo at the top is running.
Configuration
Configuration is optional. If you want to override the defaults, create~/.banshee/config.toml (defaults shown here):
[daemon]
save_history = true # keep transcriptions in ~/.banshee/banshee.db
[stt]
preset = "balanced" # fast | balanced | quality (see below)
vad_threshold = 0.5 # 0.0 to 1.0; higher means stricter speech detection
vocabulary = ["banshee"] # words Whisper keeps mangling, e.g. ["clippy", "tokio"]
endpoint_silence_ms = 2500 # trailing silence that ends a spoken answer
[tts]
voice = "af_sky" # any voice from the Kokoro voices directory
speed = 1.2 # playback speed multiplier
fallback = "system" # system = use `say` when Kokoro is unavailable | none
[audio]
input_device = "default" # "default" = follow the OS; otherwise match a device name
barge_in = "stop" # stop = the record hotkey cuts off whatever Banshee is saying | none
[audio.cues]
enabled = true # tones on record start/stop, success, and errors
input_device is a case-insensitive substring of the microphone name, so"yeti" matches Blue Yeti Stereo Microphone. Leave it as "default" to
follow whatever the OS is set to. If the name matches nothing, the daemon
refuses to start and lists the devices it did find, rather than quietly
recording from the wrong microphone.
You can also change vad_threshold at runtime through the banshee.configure
RPC, no restart needed. vocabulary biases Whisper toward project jargon and
proper nouns it would otherwise misspell; it is read once at startup, so
restart the daemon after changing it.
endpoint_silence_ms is how long you can go quiet mid-answer before Banshee
decides you're done. The default is deliberately generous so that thinking out
loud doesn't truncate your answer. Lower it if replies feel sluggish, raise it
if you keep getting cut off.
The preset picks which Whisper model Banshee uses:
| Preset | Model | Trade-off |
|---|---|---|
fast |
ggml-base.en.bin |
Fastest and lightest, English only |
balanced |
ggml-large-v3-turbo-q5_0.bin |
The default; accurate and reasonably quick |
quality |
ggml-large-v3-q5_0.bin |
Most accurate, heaviest |
For voice, any file in the
Kokoro voices directory
works, e.g. af_bella, am_michael, or bf_emma (the prefix is
accent/gender: american/british, female/male). After changing thepreset or voice, run banshee setup to download the new files, then restart
the daemon.
Troubleshooting
Start with banshee doctor; it catches most setup problems and tells you the
fix. Beyond that:
- The microphone looks dead: you record, and nothing ever comes back.
Usually the machine is just slow, not broken. On an older CPU the defaultbalancedmodel can take minutes on a few seconds of speech, which is
indistinguishable from a mic that never captured anything. Run the daemon in
the foreground withbanshee serveand watch for theTranscribed Ns of audio in Msline; if it warns that transcription ran slower than realtime,
setpreset = "fast"inconfig.tomland runbanshee setup. On a 2014
dual-core laptop that took one clip from 104s to 4.8s. banshee record startsays the microphone is busy. A previous
push-to-talk never got its matchingstop(a dropped key release, or a
script that died mid-recording).banshee record stopclears it; the daemon
also releases the mic on its own after two minutes.- Audio sounds muffled on Bluetooth earbuds while Banshee runs. Banshee
keeps the microphone open so the hotkey can start recording instantly, and
macOS switches Bluetooth earbuds to their low-quality telephony profile
whenever any app holds their mic. The fix: in System Settings > Sound, set
Input to your Mac's built-in microphone and leave Output on the earbuds.
Playback quality comes back, and the built-in mic transcribes better anyway.
For a one-off (say, a movie),banshee stopreleases the mic entirely. - Hotkeys or typing stopped working, but no error appears. macOS withholds
input events silently when an Input Monitoring or Accessibility grant is
stale. Remove the Banshee entries from both lists in System Settings >
Privacy & Security, restart the daemon, and approve the fresh prompts. - Permissions granted, but Banshee keeps asking. Grants only apply to newly
started processes. Restart the daemon withbanshee start.
Contributing
Contributions are welcome! See CONTRIBUTING.md for the dev
setup and architecture.
License
Licensed under either of Apache License, Version 2.0 or
MIT License at your option.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found