dottie-talk
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dottie-talktranscribe the file recording.wav"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dottie-talk
Local voice: STT + koko TTS (:1314) + HTTP façade (:1320).
Standalone. No gateway. No Dottie.app.
npm install
npm startBins ship in bin/ (macOS). Models download on first boot (~/.cache/parakeet.cpp, ~/.cache/dottie-talk or ~/.dottie).
Platform | STT | TTS |
Apple Silicon (darwin) |
|
|
Omarchy / Linux |
|
|
Command | What |
| HTTP |
| MCP stdio |
| TTS only ( |
| TTS → |
| STT → text on stdout |
| same as |
| STT/TTS readiness JSON |
| enable talk-keys-style hotkeys (off by default) |
| disable hotkeys |
| enabled / armed / chords |
| Omarchy menubar icon (hidden until |
| stop the HTTP server |
npx speak "hello" -o hello.wav
speak "hello" -o hello.wav # after dottie-talk bar on (~/.local/bin/speak)
npx transcribe hello.wavNode ≥22. Override STT with DOTTIE_STT=voxtype or DOTTIE_STT=parakeet.
Linux: if voxtype is already on PATH, talk uses it. If not, first start downloads the x86_64 AVX2 binary into ~/.cache/dottie-talk/bin and base.en (no sudo, no pacman). npm start skips the Darwin bin/koko and downloads the linux-bins ELF the same way. Streaming/multipart STT needs parakeet — buffered JSON /v1/audio/transcriptions works on both.
MCP
npm run mcp (stdio). Audio stays on disk or goes to the speakers, so agent context never fills with base64.
Tool | Args | Returns |
|
| text |
|
| streams PCM to the speakers; starts in ~20 ms, not after the whole clip |
|
| saves the file; |
|
| base64 too (old behavior, for apps) |
Streaming needs a player that reads stdin: pw-cat, pacat, aplay, or ffplay. The first one on PATH wins (pw-cat runs with --raw).
Add to Claude Code:
claude mcp add dottie-talk -s user -- node ~/Projects/dottie-talk/mcp.jsRelated MCP server: io.github.chicogong/ffvoice
Talk-back (Claude Code)
Read Claude's replies aloud through koko. talk-back.js runs as two Claude Code hooks, and skills/ has the /talk and /talk-toggle skills.
Command | What |
| speak this session's last reply, one time |
| talk-back mode: read every reply aloud |
| same as |
| stop playback |
| on or off |
Stop it: type anything (the next prompt cuts playback off), /talk stop, or /talk off. On Linux with dottie-talk keys on, Escape stops it too.
What is read: only the final reply. Never thinking, tool calls, or notes written between tool calls. Code blocks, tables, URLs, and markdown marks are dropped.
State: ~/.config/dottie-talk/talk-back/. The saved last reply is per session (last-<session>.txt), so two windows never read each other's reply. The on/off mode is global.
Setup
Start dottie-talk (
npm start), so koko answers on:1314Link the skills:
ln -s ~/Projects/dottie-talk/skills/talk ~/.claude/skills/talk ln -s ~/Projects/dottie-talk/skills/talk-toggle ~/.claude/skills/talk-toggleAdd the hooks to
~/.claude/settings.json:{ "hooks": { "Stop": [{ "hooks": [{ "type": "command", "command": "node ~/Projects/dottie-talk/talk-back.js hook", "timeout": 5 }] }], "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "node ~/Projects/dottie-talk/talk-back.js interrupt", "timeout": 5 }] }] } }Restart Claude Code, then
/talk on
The Stop hook saves every reply and speaks it only when the mode is on. It returns at once; playback runs in a detached child. The interrupt hook prints nothing, because UserPromptSubmit output goes into the model's context.
Keys (Linux)
Talk-keys analog. Off by default. Enable, then keep npm start running so binds arm:
dottie-talk keys on
npm startChord | Action | Omarchy |
Alt+S | Speak selection if present, else clipboard. Second tap stops. | Steals app Alt+S menu accelerators while armed |
Alt+D | Hold to dictate (voxtype push-to-talk) | Steals browser Alt+D address bar while armed; leaves Super+Ctrl+X / F9 alone |
Escape | Stop speak | Only consumed while playback is active |
Config: ~/.config/dottie-talk/config.json
{
"keys": {
"enabled": false,
"speak": "ALT + S",
"stop": "ESCAPE",
"dictate": "ALT + D",
"voice": ""
}
}DOTTIE_TALK_KEYS=on / off overrides enabled. Hotkeys no-op when the HTTP server is down. macOS: use talk-keys.
Bar (Omarchy)
Menubar icon only while npm start is running. Click: keys toggle, speak selection, stop, quit. Middle-click quits.
dottie-talk bar on
dottie-talk startstart on Linux also installs the plugin (sd.dottie-talk) next to Dottie if the bar does not already have it.
Related
talk-keys — macOS hotkeys for speak / dictate
dottie-desktop — desktop app
local-ai-cli — local AI CLI
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Speech-to-Text
Hosted text-to-speech MCP server: 66 voices in 9 languages, long-form narration, podcasts.
MCP server exposing the AceDataCloud Fish Audio API (text-to-speech with voice conditioning)
MCP server for Text-to-Speech
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceA local voice interface providing high-performance speech recognition and natural text-to-speech with voice cloning capabilities. It enables AI assistants to speak, listen, and engage in character-based voice conversations through integrated MCP tools.-
- AlicenseNot gradedqualityBmaintenanceMCP server for offline speech-to-text and speaker diarization, enabling AI agents to transcribe audio locally without cloud APIs.32 PyPI3MIT
- AlicenseNot gradedqualityDmaintenanceLocal-first speech-to-text and text-to-speech MCP server. Hot-swappable engines via config.yaml — no code changes, no API keys required.2MIT
- AlicenseNot gradedqualityAmaintenanceLocal voice toolkit over MCP: transcribe audio to text in 25 languages, synthesize speech in 9, and list available voices and languages. Runs fully on-device — no API keys, no cloud.606 npm79MIT