In complex enterprise scenarios, a single voice isn't enough. Multi-voice systems deploy multiple distinct voices — for different departments, characters, or languages. The challenge: consistency, routing, and seamless transitions.
| Agent | Department | Voice | Characteristics |
|---|---|---|---|
| Sophia | Sales | Female, 30s | Warm, enthusiastic, persuasive |
| Max | Tech Support | Male, 40s | Calm, patient, technically competent |
| Elena | Billing | Female, 50s | Professional, precise, trustworthy |
| Kai | Onboarding | Male, 20s | Friendly, casual, approachable |
| System | IVR/Routing | Neutral | Clear, factual, no emotion |
const voiceAgents = {
sales: {
voiceId: 'sophia-voice-id',
systemPrompt: 'You are Sophia, our sales consultant...',
tools: ['check_pricing', 'schedule_demo', 'send_proposal'],
},
support: {
voiceId: 'max-voice-id',
systemPrompt: 'You are Max, our technical support...',
tools: ['check_ticket', 'remote_diagnostics', 'escalate'],
},
billing: {
voiceId: 'elena-voice-id',
systemPrompt: 'You are Elena, our billing specialist...',
tools: ['check_invoice', 'process_refund', 'update_payment'],
},
}
Voice routing determines which voice the user hears — based on context:
Incoming call
↓
Greeting (System voice)
↓
Intent recognition: "How can I help you?"
↓
├── "I'd like to buy something" → Sophia (Sales)
├── "My internet isn't working" → Max (Support)
├── "I have a question about my invoice" → Elena (Billing)
└── "I'm new here" → Kai (Onboarding)
| Criterion | Example | Voice Agent |
|---|---|---|
| Intent | Purchase interest | Sophia (Sales) |
| Language | English detected | English voice agent |
| Customer status | Enterprise customer | Senior agent (premium voice) |
| Time of day | After 6 PM | After-hours agent |
| Escalation | Repeat call | Experienced agent |
A customer should always hear the same voice when speaking with the same department:
async function getVoiceForCustomer(customerId: string, department: string) {
// Check if customer already has an assigned agent
const assignment = await db.voiceAssignments.findOne({
customerId,
department,
})
if (assignment) {
return assignment.voiceId // Known voice
}
// New assignment based on availability and customer profile
const voiceId = await selectBestVoice(customerId, department)
await db.voiceAssignments.create({ customerId, department, voiceId })
return voiceId
}
ElevenLabs voices can sound slightly different with different texts. For enterprise use, consistency must be guaranteed:
1. Standardize voice settings:
{
"stability": 0.65,
"similarity_boost": 0.80,
"style": 0.20,
"use_speaker_boost": true
}
2. Prompt consistency:
3. Audio post-processing:
| Metric | Target | Tool |
|---|---|---|
| Speaker similarity | > 0.90 | Resemblyzer |
| MOS (Mean Opinion Score) | > 4.0/5 | Sample tests |
| TTS latency | < 400 ms | API monitoring |
| Audio quality | > 3.5 PESQ | Automated tests |
Practical tip: Create a "Voice Style Guide" — similar to a brand style guide, but for voices. Define for each agent: voice, settings, tonality, do's and don'ts. Share it with all developers and stakeholders.