Voice & Telephony
Real-time voice input and output. Four channels cover the matrix: inbound calls, local microphone wake, outbound speech synthesis, and SIP-grade real-time conversation.
ClawdTalk (real-time SIP)
Full-duplex SIP voice powered by Telnyx. The agent talks over a real phone call (inbound or outbound). Supports barge-in, mid-turn tool use, and regional number provisioning.
allowed_destinations
Set it on any surface:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.allowed_destinations field.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.allowed_destinations field.
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.allowed_destinations <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__clawdtalk__<alias>__allowed_destinations=
api_key*
Set it on any surface:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.api_key field.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.api_key field.
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.api_key <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__clawdtalk__<alias>__api_key=
connection_id*
Set it on any surface:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.connection_id field.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.connection_id field.
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.connection_id <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__clawdtalk__<alias>__connection_id=
excluded_tools
Tools excluded from this channel’s tool spec. When set, these tools are not exposed to the model when responding via this channel.
Set it on any surface:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.excluded_tools field.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.excluded_tools field.
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.excluded_tools <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__clawdtalk__<alias>__excluded_tools=
from_number*
Set it on any surface:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.from_number field.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.from_number field.
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.from_number <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__clawdtalk__<alias>__from_number=
webhook_secret
Set it on any surface:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.webhook_secret field.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.webhook_secret field.
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.webhook_secret <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__clawdtalk__<alias>__webhook_secret=
api_key (Telnyx) and webhook_secret are secrets:
channels.clawdtalk.<alias>.api_keyis a secret. Stored encrypted, never in plainconfig.toml. Set it through one of these, which encrypt on write:
Gateway dashboard
Open /config/channels/clawdtalk and set the channels.clawdtalk.<alias>.api_key field there.
zerocode
In the Config pane, set the channels.clawdtalk.<alias>.api_key field (input is masked).
zeroclaw config
zeroclaw config set channels.clawdtalk.<alias>.api_key # prompts for masked input, stores encrypted
Pair with: a telnyx model provider for the brain and ensure your Telnyx account has a SIP connection with the correct webhook URL pointed at the ZeroClaw gateway.
Voice Call (Twilio / Telnyx / Plivo)
Traditional carrier voice: the agent picks up, transcribes the caller, replies with TTS. Higher latency than ClawdTalk but works with any regular phone number and doesn’t require SIP trunk provisioning. Outbound calls hit from_number and require operator approval when require_outbound_approval is on.
account_id*
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.account_id field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.account_id field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.account_id <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__account_id=
auth_token*
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.auth_token field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.auth_token field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.auth_token <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__auth_token=
excluded_tools
Tools excluded from this channel’s tool spec. When set, these tools are not exposed to the model when responding via this channel.
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.excluded_tools field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.excluded_tools field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.excluded_tools <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__excluded_tools=
from_number*
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.from_number field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.from_number field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.from_number <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__from_number=
max_call_duration_secs
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.max_call_duration_secs field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.max_call_duration_secs field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.max_call_duration_secs <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__max_call_duration_secs=
model_provider
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.model_provider field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.model_provider field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.model_provider <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__model_provider=
require_outbound_approval
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.require_outbound_approval field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.require_outbound_approval field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.require_outbound_approval <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__require_outbound_approval=
transcription_logging
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.transcription_logging field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.transcription_logging field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.transcription_logging <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__transcription_logging=
tts_voice
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.tts_voice field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.tts_voice field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.tts_voice <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__tts_voice=
webhook_base_url
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.webhook_base_url field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.webhook_base_url field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.webhook_base_url <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__webhook_base_url=
webhook_port
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_call and set the channels.voice_call.<alias>.webhook_port field.
zerocode
In the Config pane, set the channels.voice_call.<alias>.webhook_port field.
zeroclaw config
zeroclaw config set channels.voice_call.<alias>.webhook_port <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_call__<alias>__webhook_port=
Voice Wake (local wake-word)
Runs locally, listens on the mic, triggers agent interaction when it hears the wake phrase. Useful for:
- Physical voice assistants on SBCs
- Desktop “hotword → ask” workflows
- Always-listening home-automation agents
The agent doesn’t send audio anywhere; wake detection is local. Only post-wake speech is captured and (separately) transcribed before reaching the LLM.
energy_threshold
RMS energy threshold for voice activity detection. Samples below this level are treated as silence. Default: 0.01.
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_wake and set the channels.voice_wake.<alias>.energy_threshold field.
zerocode
In the Config pane, set the channels.voice_wake.<alias>.energy_threshold field.
zeroclaw config
zeroclaw config set channels.voice_wake.<alias>.energy_threshold <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_wake__<alias>__energy_threshold=
excluded_tools
Tools excluded from this channel’s tool spec. When set, these tools are not exposed to the model when responding via this channel.
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_wake and set the channels.voice_wake.<alias>.excluded_tools field.
zerocode
In the Config pane, set the channels.voice_wake.<alias>.excluded_tools field.
zeroclaw config
zeroclaw config set channels.voice_wake.<alias>.excluded_tools <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_wake__<alias>__excluded_tools=
max_capture_secs
Maximum capture duration in seconds before forcing transcription. Default: 30.
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_wake and set the channels.voice_wake.<alias>.max_capture_secs field.
zerocode
In the Config pane, set the channels.voice_wake.<alias>.max_capture_secs field.
zeroclaw config
zeroclaw config set channels.voice_wake.<alias>.max_capture_secs <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_wake__<alias>__max_capture_secs=
silence_timeout_ms
Silence timeout in milliseconds: how long to wait after the last energy spike before finalizing a capture window. Default: 2000.
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_wake and set the channels.voice_wake.<alias>.silence_timeout_ms field.
zerocode
In the Config pane, set the channels.voice_wake.<alias>.silence_timeout_ms field.
zeroclaw config
zeroclaw config set channels.voice_wake.<alias>.silence_timeout_ms <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_wake__<alias>__silence_timeout_ms=
wake_word
Wake word phrase to listen for (case-insensitive substring match). Default: "hey zeroclaw".
Set it on any surface:
Gateway dashboard
Open /config/channels/voice_wake and set the channels.voice_wake.<alias>.wake_word field.
zerocode
In the Config pane, set the channels.voice_wake.<alias>.wake_word field.
zeroclaw config
zeroclaw config set channels.voice_wake.<alias>.wake_word <value>
Environment variable
Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:
export ZEROCLAW_channels__voice_wake__<alias>__wake_word=
Build flag: Voice Wake is gated by the
voice-wakecargo feature onzeroclaw-channels. Build with--features voice-waketo include it.
TTS (outbound speech synthesis)
TTS is an output service channels call into, not its own inbound channel. Global defaults live under tts. TTS provider instances are configured under providers.tts.<type>.<alias> (OpenAI, ElevenLabs, Google, Edge, Piper) and selected per agent via the agent’s tts_provider. See Model Providers for the provider entries and per-agent wiring. Provider API keys are secrets; set them through the gateway, zerocode, or zeroclaw config set, never in plaintext.
Latency budget
Speech feels real-time below ~500 ms end-to-end. Practical budgets:
| Component | Typical latency |
|---|---|
| Wake detection (local) | <100 ms |
| STT (Whisper local) | 300–800 ms per utterance |
| LLM first-token | 100–2000 ms (model dependent) |
| TTS first-audio | 200–700 ms |
| Network (cellular / PSTN) | 100–300 ms RTT |
ClawdTalk shortcuts several of these by keeping the audio stream live; regular voice_call incurs STT + LLM + TTS sequentially.
STT
Speech-to-text is configured separately from the voice channels; see the [transcription] config in the Config reference. Voice channels invoke whichever transcription provider is active when they need to turn audio into text.
Hardware notes
For always-on voice on an SBC:
- USB mic: any UAC-compliant mic works.
arecord -lto verify the OS sees it. - Speaker: either USB audio out or the SBC’s onboard jack; pick the OS default device for the user the daemon runs as.
- Microphones with built-in AEC (acoustic echo cancellation) dramatically improve wake reliability when the speaker is nearby.
See Hardware → Android for Android-specific audio setup.