Voice is a first-class input and output mode in Crew. The default provider — Piper — runs locally, so nothing leaves your machine. Cloud STT via AWS Transcribe is an optional extra.
Both are on-demand. Voice input never fires until you press the mic; voice output never plays unless you enable it per-session or globally.
Hold or click the mic button in the dashboard chat input.
Behind the scenes, this streams audio to /api/stt (WebSocket), which pipes it to your chosen provider and returns transcription events in real time.
Configure the STT provider in ~/.kiro/crew/config.json:
{ "voice": { "stt_provider": "whisper" } }
| Provider | Runs where | Notes |
|---|---|---|
whisper (default) | Local | Uses local Whisper if available; falls back to the browser's built-in STT |
aws_transcribe | Cloud | Requires the voice install extra + AWS credentials |
browser | Local (browser) | Uses the browser's Web Speech API — quality varies by browser |
Install the cloud STT extra:
pip install "kirocrew[voice]"
Attach a voice memo as a file with @filename — the audio is transcribed automatically and inlined into the message. Useful when you want to leave a voice note in an existing message without triggering the live mic.
Piper is a fast, local neural TTS engine. It runs entirely on your machine (no internet needed) and streams audio word-by-word as the agent generates its reply.
Piper voice files are downloaded on first use, then cached locally.
{ "voice": { "tts_provider": "piper", "tts_voice": "en_US-amy-medium", "tts_speed": 1.0 } }
| Key | Default | Purpose |
|---|---|---|
voice.tts_provider | piper | TTS engine (only piper today) |
voice.tts_voice | en_US-amy-medium | Piper voice file to use |
voice.tts_speed | 1.0 | Playback speed (0.5–2.0) |
Available voices: any Piper voice file. Drop a .onnx file into ~/.kiro/crew/voices/ and reference it by filename.
TTS is designed to fade into the background:
You can override any of these from the voice settings panel.
Voice output can be interrupted the same way as a chat turn:
!stop command in Slack does the same for cross-surface useThe interrupt is bidirectional: stopping the reply also stops the TTS mid-word.
Voice input is dashboard-only for now. Slack voice memos work through Slack's voice-note feature. There's no voice mode in the CLI.
Voice output works everywhere the dashboard is open — including remote hosts accessed over an SSH tunnel or mobile tunnel. The audio stream is delivered as chunked WebSocket messages, so latency depends on your network.
voice extra installed and credentials configuredPiper is the default because it's the only provider that never leaves the machine.
| Problem | Fix |
|---|---|
| Mic button does nothing | Grant the browser microphone permission for the dashboard origin |
| TTS is silent | Check the dashboard tab's audio permission; confirm system output isn't muted |
| Piper voice missing | The first use downloads the voice file; check ~/.kiro/crew/voices/ and network connectivity |
| Transcription is inaccurate | Try a quieter room, switch to aws_transcribe if you need cloud-grade accuracy |
| STT stops mid-sentence | Silence detection is aggressive — click and hold instead of click-to-talk |
Voice