For the complete documentation index, see llms.txt. This page is also available as Markdown.

Voice Configuration

Per-service voice pipeline tuning for latency, fillers, response limits, barge-in sensitivity, and emotion control.

Every voice service has a voice_config object that controls how the real-time pipeline behaves during calls. It covers latency tuning, filler behavior, response length limits, barge-in sensitivity, emotion modulation, voice model and TTS provider selection, and tool access. If you leave voice_config null, the service inherits balanced defaults from the workspace and environment.

The design principle is straightforward: each field is optional. A null field means "use the default from the layer above." You only set the fields you want to override.

Field Reference

Latency

These fields control how quickly the agent responds after the caller stops speaking.

Field
Type
Default
Description

tts_model

"sonic-turbo" or "sonic-3"

inherited

TTS model. sonic-turbo targets ~40ms time-to-first-audio and is best for snappy conversations. sonic-3 targets ~90ms but produces higher-quality speech with better prosody on longer utterances. Null inherits the environment default.

max_buffer_delay_ms

int (200-1000)

500

How long the pipeline buffers generated text before sending it to TTS. Lower values make the agent start speaking sooner, but may produce choppier speech because each TTS chunk has less context.

eager_eot_threshold

float (0.0-1.0)

inherited

End-of-turn confidence threshold. Higher values make the system more aggressive about deciding the caller has finished talking. A value of 0.8 means "start responding when 80% confident the caller is done." Lower values reduce latency but increase the chance of cutting the caller off mid-sentence.

eot_timeout_ms

int

inherited

Hard silence timeout in milliseconds. If the caller stops speaking for this long, the system forces an end-of-turn regardless of the confidence score. Useful as a safety net for the confidence-based detection.

post_eot_pause_ms

int

200

Intentional breath after the caller stops speaking, in milliseconds.

transition_deadline_ms

int

800

Maximum silence after caller end-of-turn before a filler is injected, in milliseconds.

empathy_hold_ms

int

500

Intentional silence held for empathy moments, in milliseconds.

Fillers

Fillers are the short sounds or phrases the agent produces while the LLM generates the full response. They fill what would otherwise be dead air.

Field
Type
Default
Description

filler_style

"backchannel", "phrase", or "silent"

"backchannel"

Controls the agent's autonomous fillers. Only silent changes runtime behavior: it mutes the agent's autonomous backchannels (the navigation acknowledgment and tool-wait acknowledgments). backchannel and phrase are currently advisory: the per-tool wait style is driven by the context graph's progress hints, not this field. Explicit context graph progress phrases still play even under silent.

filler_vocabulary

list[str]

null

Custom words for the short acknowledgment played when navigation is skipped (e.g., ["Mm", "Yeah", "Mhm"]). Does not change tool-execution wait phrases - those come from progress_vocabulary or the context graph's progress phrases.

backchannel_delay_ms

int (400-1000)

400

How many milliseconds the pipeline waits before playing a backchannel when navigation is skipped (the caller said something that doesn't require a state change). Lower values make the agent feel more responsive; higher values feel more deliberate.

progress_vocabulary

list[str]

null

Custom phrases for the tool-execution wait filler (distinct from filler_vocabulary). Ignored when the active tool's context graph progress hint is deterministic - scripted progress phrases play verbatim in that case.

filler_cooldown_ms

int

2000

Minimum gap in milliseconds between consecutive fillers.

progress_interval_ms

int

3000

How often to produce progress audio during tool execution, in milliseconds.

Response

Hard caps on how much the agent says per turn. These are mechanically enforced by the pipeline (it truncates the output), not just prompted.

Field
Type
Default
Description

max_response_sentences

int

null (unlimited)

Maximum sentences per response. Set to 1 or 2 for voice services where brevity matters. The pipeline counts sentences by punctuation and cuts off after the limit.

max_response_words

int

null (unlimited)

Maximum words per response. Same mechanical enforcement. Useful when you want finer control than sentence-level truncation.

Barge-in

Barge-in is when the caller starts speaking while the agent is still talking. These fields control how sensitive that detection is.

Field
Type
Default
Description

barge_in_min_speech_s

float

0.25

Minimum duration of caller speech (in seconds) before a barge-in triggers. The default of 0.25s lets short phrases ("yes", "no", roughly 200-400ms) interrupt the agent while the recognized-words gate keeps noise out. Duration alone never triggers a barge-in - the pipeline also requires recognized interim words from the STT engine, so breath sounds and background noise do not cause false interrupts. Raising the value (e.g., 1.0+) makes the agent feel like it ignores short interjections.

barge_in_cooldown_s

float

1.5

Cooldown period after a barge-in before another one can fire. Prevents rapid-fire interruptions where the caller and agent keep cutting each other off.

Emotion Modulation

Field
Type
Default
Description

min_tts_speed

float (0.5-1.0) or null

null (no floor)

Minimum TTS speed the empathy engine can set. The empathy system reduces speaking speed after detecting caller distress, but without a floor the reduction can make the agent sound unnaturally slow. Set this to prevent over-modulation while preserving the warmth response. Values are relative to normal speed (e.g., 0.85 means the agent never drops below 85% of normal speed).

Voice Model and TTS Provider

Field
Type
Default
Description

session_provider

"amigo", "gpt_realtime", or "gpt_live"

inherited

Overrides the voice model family at the service level. Null inherits the environment default (amigo).

tts_provider

"cartesia", "elevenlabs", or "groq"

inherited

Overrides the TTS provider at the service level. Null inherits from workspace/environment.

tts_config

object

null

Provider-specific configuration bag; keys depend on tts_provider.

language_providers

object

null

Per-language TTS provider map (up to 10 entries). Keys are BCP-47 language codes or multilingual.

Tools

Field
Type
Default
Description

forward_call_enabled

bool

false

Whether the forward_call tool is available during conversations. This is opt-in because call forwarding has cost and compliance implications. Even when enabled, the context graph's TurnPolicy can further gate forwarding (e.g., block_forward_call_after_turns).

forwarding

object or null

null

Per-service call-forwarding destination: { "forward_to": "<E.164 number>" }. Used by the forward_call tool as the static fallback destination when the agent does not pass an explicit number and no EHR location is configured.

Named Presets

Three presets cover common configurations. A preset sets multiple fields at once to a tested combination.

Preset
TTS Model
Buffer Delay
Filler Style
Backchannel Delay
Response Cap
Best For

ultra_low_latency

sonic-turbo

200ms

backchannel

400ms

1 sentence

Quick intake, high-volume triage, yes/no flows

balanced

(default)

500ms

(default)

(default)

(unlimited)

General-purpose conversations

quality

sonic-3

500ms

phrase

(default)

(unlimited)

Sensitive topics, empathetic conversations where natural speech quality matters more than speed

Presets are a starting point. You can apply a preset and then override individual fields on top of it.

API Usage

Voice config is a field on the service model. You set it when creating or updating a service.

Setting voice config via PUT

The voice_config object is replaced wholesale, not merged. Merge behavior on service update applies only across other top-level service fields - within voice_config, whatever you send becomes the entire config. To change one field, send the full object: read the current config via GET, modify the field, and PUT the complete object back.

A partial body like this:

changes the filler style, but it also drops every omitted nullable field (tts_model, max_buffer_delay_ms, and so on revert to workspace and environment inheritance) and resets defaulted fields to their defaults (backchannel_delay_ms to 400, forward_call_enabled to false).

Reading current config

The service response includes the full voice_config object:

Fields that are null mean "inherit from the layer above" (see Configuration Cascade below).

CLI Usage

The forge CLI provides a shorthand for voice config operations.

Apply a preset

This sets all the fields in the preset at once.

Set individual fields

Read current config

Configuration Cascade

Voice behavior resolves through a four-layer cascade. Each layer can override the one above it. The first non-null value wins.

Here is what each layer controls:

Layer 1: Workspace Voice Settings set the baseline for all services in a workspace. Voice ID, tone, speed, volume, language, keyterms, and sensitive topics. Configured via GET/PUT /v1/{workspace_id}/settings/voice. See Workspaces.

Layer 2: Service Voice Config (voice_config on the service) overrides workspace defaults for pipeline behavior. This is where you set latency tuning, filler style, response limits, and barge-in sensitivity. A null field means "use whatever the workspace says."

Layer 3: Context Graph TurnPolicy can override behavior per-state. For example, a "crisis" state might set safety_response: stay_empathize and block_forward_call: true. TurnPolicy fields include barge_in_enabled, greeting_shield_s, safety_response, context_strategy, degradation_threshold, and block_forward_call. See Simulation Coverage for how these were tuned.

Layer 4: Channel Overrides on individual actions or states can override the objective, action guidelines, and filler suppression for specific channels (e.g., SMS versus voice).

In practice, most services only need Layer 1 (workspace) and Layer 2 (service voice config). Layers 3 and 4 are for advanced context graph tuning.

Turn-Level Emotion Selection

During each turn, the voice pipeline selects an emotional tone alongside the state transition, based on the caller's emotional state and the conversation context. The selected tone is applied to the entire response - the filler and the main response share it - so each turn is spoken with one consistent voice.

Available Emotions

The pipeline chooses from eight emotions:

Emotion
When to use

friendly

Default warmth. General conversations, greetings, confirmations.

sympathetic

Caller is frustrated, upset, or sharing bad news.

calm

Sensitive topics, de-escalation, anxious callers.

enthusiastic

Positive outcomes, good news, caller is excited.

serious

Important information, disclaimers, medical details.

cheerful

Light conversations, small talk, closing on a positive note.

curious

Asking clarifying questions, exploring a topic.

content

Neutral satisfaction. Wrapping up, confirmations after a good interaction.

Because the tone applies to the whole utterance, the prosody stays consistent from the first filler word to the end of the response - there are no uncanny emotional shifts partway through a sentence.

The empathy system can override the turn-level selection at higher tiers. At Tier 2 (full empathy), the system forces warmth regardless of the selected emotion. At Tier 3 (hold space), filler is suppressed entirely and silence replaces speech.

Last updated

Was this helpful?