Voice Configuration
Configure per-service voice latency, fillers, barge-in, response limits, provider inheritance, call forwarding, and conversation tool availability.
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 has no service-level overrides.
Each field is optional, but inheritance depends on the field. session_provider resolves service > agent > environment. tts_provider resolves service > agent > workspace > environment. Per-language maps check the exact language, base language, and multilingual key in that order, with service > agent > workspace precedence within each key. Unset tuning fields use their runtime defaults.
Field Reference
Latency
These fields control how quickly the agent responds after the caller stops speaking.
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.
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
Response limits are applied while generated text is consumed. Sentence counting is approximate across streamed fragments; these settings are not exact bounds on an utterance a caller will hear.
max_response_sentences
int
null (unlimited)
Streamed-response sentence cap. Counting is approximate across streamed fragments.
max_response_words
int
null (unlimited)
Streamed-response word cap, enforced while consuming generated text.
Barge-in
Barge-in is when the caller interrupts agent speech. Recognition, the service minimum speech duration, and active turn policy govern the greeting as well as later speech. There is no separate greeting-shield setting; the runtime default minimum is 500ms.
barge_in_min_speech_s
float
0.5
Minimum caller-speech duration used by barge-in detection. Detection also depends on the active turn policy and audio path; the main path checks recognized words and additional gates. This setting does not guarantee that every short interjection interrupts or that noise can never interrupt.
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
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
session_provider
"amigo" or "gpt_realtime"
inherited
Overrides the voice model family at the service level. Null inherits the agent value and then the environment default.
tts_provider
"cartesia" or "elevenlabs"
inherited
Overrides the TTS provider at the service level. Null inherits from the agent, then the workspace; see Default TTS Model when none is named.
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.
realtime
object
null
Realtime session controls. Requires session_provider gpt_realtime; see Realtime Session Models.
Realtime Session Models
On the gpt_realtime runtime, realtime.model accepts gpt-realtime-2.1, the default, and gpt-realtime-2.1-mini. Caller-audio transcription, realtime.transcription.model, accepts gpt-transcribe, which is also its default. Other ids return 422, including gpt-realtime-1.5, gpt-realtime-2, whisper-1, gpt-4o-mini-transcribe, and gpt-4o-transcribe, which were accepted before October 9, 2026. realtime.reasoning_effort is accepted with either model.
Default TTS Model
A call or voice note whose service, agent, and workspace name no tts_provider speaks Cartesia when any TTS setting is stored: a workspace voice_id, tts_model, pronunciation_dict_id, or tts_config, an agent voice_config with a voice_id or tts_config, or a service tts_config. With none of these stored, the call speaks ElevenLabs eleven_v4_turbo with the ElevenLabs default voice. That default replaced Cartesia Sonic 3.6 on October 12, 2026. A matching language_providers entry still decides the provider for its language. To keep an unconfigured service on Cartesia, set tts_provider to cartesia.
When the resolved configuration stores no model, Cartesia calls use Sonic 3.6 (sonic-3.6-2026-08-27). It replaced Sonic 3.5 as the default on October 8, 2026, and Sonic 3.5 is no longer a platform default. Voice IDs, speed, volume, and other request settings carry over unchanged. ElevenLabs calls with no stored model use eleven_v4_turbo, which replaced eleven_flash_v2_5 as the default on October 9, 2026.
A stored model always wins over the default: tts_config.model at the workspace, agent, or service level, or a per-language entry's config.model. To keep a call on a specific model, pin it in the service tts_config.model. The service voice_config.tts_model field was removed on October 9, 2026: a request that sends it is accepted, but the value is ignored, and a stored value no longer selects a model. A matching language_providers entry, including multilingual, brings only its own config, so pin the model in that entry's config.model too. An entry without one uses the default even when the base config pins a model.
Retired Cartesia Models
Cartesia stops serving some models, and a call pinned to one would produce no audio. When the resolved model is one of these, the call uses Sonic 3.6 instead. Voice, speed, volume, tone, and language settings are unchanged, and the stored configuration is not rewritten.
The remap covers sonic, sonic-english, sonic-multilingual, sonic-2024-10-19, sonic-2024-12-12, sonic-2 and its snapshots, sonic-turbo and its snapshots, and sonic-3-2025-10-27. Cartesia retires sonic-2, sonic-turbo, and sonic-3-2025-10-27 after October 20, 2026. Since October 10, 2026, it also covers the superseded Sonic 3 and Sonic 3.5 ids: sonic-3, sonic-3-preview, sonic-3-2026-01-12, sonic-3.5, and sonic-3.5-2026-05-04. sonic-3.6, sonic-preview, and ids the platform does not recognize are sent as stored.
This applies to every place a model can be stored. Replace retired pins with a current model so the configuration shows what the call speaks.
Retired ElevenLabs Models
A stored ElevenLabs pin of eleven_flash_v2_5, eleven_flash_v2, eleven_turbo_v2_5, eleven_turbo_v2, eleven_multilingual_v2, eleven_multilingual_v1, or eleven_monolingual_v1 uses eleven_v4_turbo instead, on live calls and audio-turn voice notes. The Developer Console's ElevenLabs settings save eleven_multilingual_v2, so those services move too. The voice and stored configuration are unchanged.
On eleven_v4_turbo, only stability is applied. It defaults to 0.5; configuration or a sympathetic tone can change it. style and speed, whether configured or emotion-driven, and stored similarity_boost and use_speaker_boost have no effect on this model. A service that depends on a slower or faster speaking rate should be re-tested.
ElevenLabs voice runs only eleven_v3* and eleven_v4* models. A stored model that is neither one of those nor a retired id listed above, for example a bare v3, eleven_ttv_v3, eleven_english_sts_v2, or a case variant such as Eleven_v4_turbo, now fails the voice session at setup with an error naming the id, instead of connecting a call that never speaks. Pin a current eleven_v3* or eleven_v4* id, or leave the model unset to use the default.
A call to a caller whose record has no language speaks the workspace language, so a Spanish or Arabic workspace no longer speaks English to those callers.
Call Forwarding
A service destination must also be on the provisioned voice use case's allowed_forwarding_numbers. Confirm the Channel Manager forwarding restrictions before using transfers.
Configure forwarding in voice_config.forwarding. Omitting that block or setting it to null leaves the forwarding tool unavailable. When present, choose warm or cold transfer explicitly and configure either a fixed destination or dynamic destination mode. There is no workspace-number fallback.
A fixed destination sets forward_to to one E.164 number. Dynamic mode sets forward_to to null and lists every number a transfer may dial in approved_destinations, a map of E.164 number to a label for what answers there, such as {"+16095550199": "Scheduling desk"}, with up to 50 entries. The agent picks from those numbers and sees their labels. Any other number is refused without dialing, and a dynamic block with no approved destinations offers no forward_call tool. Setting approved_destinations with a fixed forward_to returns 422.
The removed forward_call_enabled flag is not the current enablement control. The embedded service schema is authoritative for the forwarding object. Active turn policy can further restrict forwarding. See Call Forwarding for the hold and answer-handling sequence.
Named Presets
Agent Forge exposes four named presets. A preset sets multiple fields at once as a starting configuration.
ultra_low_latency
(default)
200ms
backchannel
400ms
1 sentence
Quick intake, high-volume triage, yes/no flows
balanced
(default)
500ms
(default)
(default)
(unlimited)
General-purpose conversations
quality
(default)
500ms
phrase
(default)
(unlimited)
Sensitive topics, empathetic conversations where natural speech quality matters more than speed
gpt_realtime
n/a
n/a
n/a
n/a
n/a
Realtime speech-to-speech provider selection where enabled
Presets are a starting point. You can apply a preset and then override individual fields on top of it. Presets no longer select a Cartesia model: the tts_model value they set is ignored, so pin a model in tts_config.model when you need one.
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
Update a service's configuration. Requires Service.update permission.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
voicePossible values: productionPossible values: falseMissing or invalid API key.
Insufficient permissions.
Not found.
Name already taken.
Invalid request body.
PUT /v1/{workspace_id}/services/{service_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 1911
{
"name": "text",
"description": "text",
"agent_id": "123e4567-e89b-12d3-a456-426614174000",
"context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
"keyterms": [
"text"
],
"is_active": true,
"version_sets": {
"ANY_ADDITIONAL_PROPERTY": {
"agent_version_number": 1,
"context_graph_version_number": 1,
"llm_model_preferences": {
"ANY_ADDITIONAL_PROPERTY": {
"llm_name": "text",
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"experience_controls": {
"reasoning_effort": "none",
"temperature": 1,
"top_p": 1
}
}
}
}
},
"tags": [
{
"key": "text",
"value": "text"
}
],
"tool_capacity": 1,
"channel_type": "voice",
"environment": "sandbox",
"voice_config": {
"max_buffer_delay_ms": 1,
"eager_eot_threshold": 1,
"eot_timeout_ms": 1,
"filler_style": "backchannel",
"filler_vocabulary": [
"text"
],
"backchannel_delay_ms": 400,
"max_response_sentences": 1,
"max_response_words": 1,
"barge_in_min_speech_s": 1,
"barge_in_cooldown_s": 1,
"min_tts_speed": 1,
"post_eot_pause_ms": 1,
"transition_deadline_ms": 1,
"progress_interval_ms": 1,
"empathy_hold_ms": 1,
"filler_cooldown_ms": 1,
"progress_vocabulary": [
"text"
],
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
},
"session_provider": "amigo",
"realtime": {
"model": "gpt-realtime-2.1",
"voice": "alloy",
"speed": 1,
"noise_reduction": "near_field",
"transcription": {
"model": "gpt-transcribe",
"language": "text",
"prompt": "text"
},
"turn_detection": {
"type": "server_vad",
"threshold": 1,
"prefix_padding_ms": 1,
"silence_duration_ms": 1,
"idle_timeout_ms": 1
},
"reasoning_effort": "low",
"max_output_tokens": 1,
"truncation": {
"type": "auto",
"retention_ratio": 1,
"post_instructions_tokens": 1
},
"required_tool_on_first_caller_turn": "text"
},
"forwarding": {
"forward_to": "text",
"warm_transfer": true,
"approved_destinations": {
"ANY_ADDITIONAL_PROPERTY": "text"
}
}
},
"accepted_context": [
{
"key": "text",
"type": "string",
"description": "text",
"required": true
}
]
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"description": "text",
"agent_id": "123e4567-e89b-12d3-a456-426614174000",
"context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
"agent_name": "text",
"context_graph_name": "text",
"keyterms": [
"text"
],
"is_active": true,
"version_sets": {
"ANY_ADDITIONAL_PROPERTY": {
"agent_version_number": 1,
"context_graph_version_number": 1,
"llm_model_preferences": {
"ANY_ADDITIONAL_PROPERTY": {
"llm_name": "text",
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"experience_controls": {
"reasoning_effort": "none",
"temperature": 1,
"top_p": 1
}
}
}
}
},
"tags": [
{
"key": "text",
"value": "text"
}
],
"tool_capacity": 1,
"channel_type": "voice",
"environment": "production",
"voice_config": {
"max_buffer_delay_ms": 1,
"eager_eot_threshold": 1,
"eot_timeout_ms": 1,
"filler_style": "backchannel",
"filler_vocabulary": [
"text"
],
"backchannel_delay_ms": 400,
"max_response_sentences": 1,
"max_response_words": 1,
"barge_in_min_speech_s": 1,
"barge_in_cooldown_s": 1,
"min_tts_speed": 1,
"post_eot_pause_ms": 1,
"transition_deadline_ms": 1,
"progress_interval_ms": 1,
"empathy_hold_ms": 1,
"filler_cooldown_ms": 1,
"progress_vocabulary": [
"text"
],
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
},
"session_provider": "amigo",
"realtime": {
"model": "gpt-realtime-2.1",
"voice": "alloy",
"speed": 1,
"noise_reduction": "near_field",
"transcription": {
"model": "gpt-transcribe",
"language": "text",
"prompt": "text"
},
"turn_detection": {
"type": "server_vad",
"threshold": 1,
"prefix_padding_ms": 1,
"silence_duration_ms": 1,
"idle_timeout_ms": 1
},
"reasoning_effort": "low",
"max_output_tokens": 1,
"truncation": {
"type": "auto",
"retention_ratio": 1,
"post_instructions_tokens": 1
},
"required_tool_on_first_caller_turn": "text"
},
"forwarding": {
"forward_to": "text",
"warm_transfer": true,
"approved_destinations": {
"ANY_ADDITIONAL_PROPERTY": "text"
}
}
},
"accepted_context": [
{
"key": "text",
"type": "string",
"description": "text",
"required": true
}
],
"is_system": false,
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}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 (max_buffer_delay_ms, eot_timeout_ms, and so on return to their field-specific inheritance or runtime defaults) and resets defaulted fields to their defaults (backchannel_delay_ms to 400, forwarding to null).
Reading current config
The service response includes the full voice_config object:
Retrieve a service by ID. Requires Service.view permission.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
voicePossible values: productionPossible values: falseMissing or invalid API key.
Insufficient permissions.
Not found.
Validation Error
GET /v1/{workspace_id}/services/{service_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"description": "text",
"agent_id": "123e4567-e89b-12d3-a456-426614174000",
"context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
"agent_name": "text",
"context_graph_name": "text",
"keyterms": [
"text"
],
"is_active": true,
"version_sets": {
"ANY_ADDITIONAL_PROPERTY": {
"agent_version_number": 1,
"context_graph_version_number": 1,
"llm_model_preferences": {
"ANY_ADDITIONAL_PROPERTY": {
"llm_name": "text",
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"experience_controls": {
"reasoning_effort": "none",
"temperature": 1,
"top_p": 1
}
}
}
}
},
"tags": [
{
"key": "text",
"value": "text"
}
],
"tool_capacity": 1,
"channel_type": "voice",
"environment": "production",
"voice_config": {
"max_buffer_delay_ms": 1,
"eager_eot_threshold": 1,
"eot_timeout_ms": 1,
"filler_style": "backchannel",
"filler_vocabulary": [
"text"
],
"backchannel_delay_ms": 400,
"max_response_sentences": 1,
"max_response_words": 1,
"barge_in_min_speech_s": 1,
"barge_in_cooldown_s": 1,
"min_tts_speed": 1,
"post_eot_pause_ms": 1,
"transition_deadline_ms": 1,
"progress_interval_ms": 1,
"empathy_hold_ms": 1,
"filler_cooldown_ms": 1,
"progress_vocabulary": [
"text"
],
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
},
"session_provider": "amigo",
"realtime": {
"model": "gpt-realtime-2.1",
"voice": "alloy",
"speed": 1,
"noise_reduction": "near_field",
"transcription": {
"model": "gpt-transcribe",
"language": "text",
"prompt": "text"
},
"turn_detection": {
"type": "server_vad",
"threshold": 1,
"prefix_padding_ms": 1,
"silence_duration_ms": 1,
"idle_timeout_ms": 1
},
"reasoning_effort": "low",
"max_output_tokens": 1,
"truncation": {
"type": "auto",
"retention_ratio": 1,
"post_instructions_tokens": 1
},
"required_tool_on_first_caller_turn": "text"
},
"forwarding": {
"forward_to": "text",
"warm_transfer": true,
"approved_destinations": {
"ANY_ADDITIONAL_PROPERTY": "text"
}
}
},
"accepted_context": [
{
"key": "text",
"type": "string",
"description": "text",
"required": true
}
],
"is_system": false,
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Fields that are null apply no service-level override. Depending on the field, the runtime then consults agent, workspace, or environment configuration, or uses a runtime default. See Field-Specific Resolution.
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
Field-Specific Resolution
Voice settings do not use one universal first-non-null cascade. Resolution depends on the field:
Session provider
Service, then agent, then environment
Flat TTS provider
Service, then agent, then workspace. With none named, Cartesia when any TTS setting is stored, otherwise ElevenLabs; see Default TTS Model
Per-language TTS provider
Exact language, base language, then multilingual; for each key, service, then agent, then workspace
TTS provider configuration and model
Workspace settings form the base, agent tts_config overrides them, and service tts_config overrides both; unresolved values use the environment configuration. When a per-language entry selects the provider, that entry's config replaces the merged base provider config
Service tuning fields
The service value applies when set; otherwise the field's documented runtime default or supported fallback applies
Workspace Voice Settings
Workspace Voice Settings provide baseline voice identity, tone, speed, volume, language, keyterms, and sensitive topics. See Workspaces for how those settings interact with service overrides.
Get the voice experience settings for a workspace.
Returns voice identity, domain vocabulary, and post-call intelligence configuration. These settings shape how the AI agent sounds and what domain-specific terms it recognizes accurately.
Permissions
- Requires authenticated API key (any role).
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Voice experience state — what the PM configured.
Rate limited
GET /v1/{workspace_id}/settings/voice HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"voice_id": "text",
"tone": "text",
"speed": 1,
"volume": 1,
"language": "text",
"keyterms": [
"text"
],
"pronunciation_dict_id": "text",
"sensitive_topics": [
"text"
],
"post_call_analysis_enabled": true,
"stt_provider": "deepgram",
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}
}Update the voice experience settings for a workspace.
Only provided fields are updated; omitted fields retain their current
values. Set a field to null to reset it to default.
Voice Identity & Style
- voice_id: Voice identity UUID — determines the agent's voice persona
- tone: Emotional baseline (
calm,sympathetic,enthusiastic,content,curious,cheerful,serious,friendly). The system also adapts tone dynamically based on real-time caller emotion analysis; this setting provides the baseline when no strong emotional signal is detected. - speed: Speech rate multiplier (0.5-2.0)
- volume: Volume multiplier (0.0-1.0)
- language: BCP-47 language tag (default
en)
Speech Recognition Boost
- keyterms: Exact words the speech recognition engine should
prioritize. Use for specific names, drug names, and org jargon.
Example:
["Dr. Ramirez", "metformin", "HIPAA"]
Post-Call Intelligence
- post_call_analysis_enabled: Run automated quality scoring after
each call ends (default
true)
Permissions
- Requires admin or owner role.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Voice experience control plane — PM-facing, high-level controls.
Controls the caller experience without exposing engineering internals. Emotion detection, filler speech, model selection, and buffer tuning are always-on internals managed by engineering.
Successful Response
Voice experience state — what the PM configured.
Workspace not found
Validation error
Rate limited
PUT /v1/{workspace_id}/settings/voice HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 410
{
"voice_id": "text",
"tone": "text",
"speed": 1,
"volume": 1,
"language": "text",
"keyterms": [
"text"
],
"pronunciation_dict_id": "text",
"sensitive_topics": [
"text"
],
"post_call_analysis_enabled": true,
"stt_provider": "deepgram",
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}
}{
"voice_id": "text",
"tone": "text",
"speed": 1,
"volume": 1,
"language": "text",
"keyterms": [
"text"
],
"pronunciation_dict_id": "text",
"sensitive_topics": [
"text"
],
"post_call_analysis_enabled": true,
"stt_provider": "deepgram",
"tts_provider": "cartesia",
"tts_config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"language_providers": {
"ANY_ADDITIONAL_PROPERTY": {
"provider": "cartesia",
"config": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}
}Context Graph TurnPolicy and channel overrides control separate state- and channel-specific behavior. They can gate capabilities or alter objectives and guidance, but they are not additional tiers in a generic voice-setting cascade.
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:
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?

