Quick Start
How It Works
A voice note is downloaded, transcribed, and handed to the agent as text. A user records a voice note in Telegram (or Slack, or WhatsApp) and taps send. Within a second, the bot’s typing indicator appears — the audio has been downloaded and handed towhisper-1. When the transcript comes back, the agent processes it exactly as if the user had typed the text. If echo_transcripts: true, the user first sees the recognised text confirmed back to them, then the agent’s reply — helpful during onboarding so users know their voice was heard correctly.
Graceful degradation
A voice note is never silently dropped — the agent always sees at least a placeholder.- STT disabled → the turn still reaches the agent with
[Voice message received]. - Transcription fails → same placeholder.
- STT tool import fails (missing whisper/litellm deps) → same placeholder plus a
WARNINGin logs.
Configuration Options
Thestt: block lives under any channel in gateway.yaml / bot.yaml.
| Option | Type | Default | Description |
|---|---|---|---|
enabled | bool | True | Transcribe inbound audio. On by default. |
echo_transcripts | bool | False | Echo the recognised text back to the user. |
language | Optional[str] | None | ISO language code (e.g. "en", "es"). None = auto-detect. |
model | Optional[str] | None | STT model override. None uses openai/whisper-1. |
Bool shorthand
Resolution order
The effective policy is resolved from, in order:config.metadata["stt"](operator override; dict or bool),- a direct
config.sttattribute (schema-backed configs), then - the on-by-default default.
Platform Support
| Platform | Native voice-note support | Behaviour |
|---|---|---|
| Telegram | ✅ | Downloads voice file, transcribes, feeds transcript to agent. |
| Slack | ✅ | Downloads voice file via bot token through the SSRF-safe media cache. |
| ✅ | Transcribes inbound audio, forwards transcript plus cached audio to the agent. | |
| Discord | ❌ | Voice-note API not yet wired by the adapter. |
| Email / AgentMail / Linear | ❌ | No voice-note surface. |
Placeholder Behaviour
When transcription is unavailable, the agent receives[Voice message received] instead of nothing.
| Scenario | What the agent sees |
|---|---|
| STT enabled, transcription succeeds | The transcript (e.g. "Hey, what's the weather?") |
STT enabled, echo_transcripts: true | [Voice message]: Hey, what's the weather? |
STT disabled (enabled: false) | [Voice message received] |
| Transcription fails or deps missing | [Voice message received] |
Common Patterns
Voice notes fit several bot styles.Voice-first assistant
No config needed. The user taps the mic, records a question, and the agent replies in text — the transcription happens automatically.Multilingual support
Force a language for a single-language community bot. Auto-detection is skipped for faster, more accurate recognition.Debug transcription quality
Echo the recognised text back so users can spot recognition errors and rephrase.Best Practices
Set a language when your users speak one language
Set a language when your users speak one language
language: "en" (or "es", "fr", …) skips auto-detection — faster and more accurate for short clips.Turn on echo_transcripts during onboarding
Turn on echo_transcripts during onboarding
echo_transcripts: true shows users what the bot heard so they can rephrase if recognition was off.Keep enabled: true unless you have a reason to disable
Keep enabled: true unless you have a reason to disable
Even with STT off, the placeholder fallback still lets voice-note messages reach the agent. Only disable for privacy, cost, or latency reasons.
Ship your STT provider's API key
Ship your STT provider's API key
openai/whisper-1 is the default, so set OPENAI_API_KEY. Any LiteLLM-supported STT model works via the model: field.Related
Gateway Overview
The overall gateway pattern — voice notes are one of several inbound-media types.
Audio Overview
The higher-level
AudioAgent abstraction — different from this gateway feature.
