Wat is een voice agent en hoe werkt het?
Een voice agent is een AI-systeem dat telefoongesprekken begrijpt, verwerkt en beantwoordt. In 2026 is dit niet meer voorbehouden aan grote bedrijven. Met n8n 2.0, Twilio en moderne AI-modellen bouw je in een middag een systeem dat inkomende gesprekken afhandelt alsof er een menselijke medewerker opneemt.
De technologie werkt in drie stappen. Stap 1: de beller spreekt. Twilio vangt de audiostroom op en stuurt het naar jouw n8n-workflow. Stap 2: AI begrijpt de spraak. Speech-to-Text (STT) zet audio om in tekst. Claude verwerkt die tekst en genereert een antwoord. Stap 3: het antwoord klinkt. Text-to-Speech (TTS) via ElevenLabs of OpenAI zet de tekst om in een menselijke stem, die direct teruggaat naar de beller.
Het praktische nut: een installatiebedrijf dat 40 inkomende gesprekken per dag ontvangt voor afspraken en storingen, kan 80 procent van die gesprekken automatiseren. De voice agent plant afspraken, geeft statusinformatie en escaleert complexe gevallen naar een medewerker.
Wat je nodig hebt
Zorg dat je de volgende accounts en tools klaar hebt voordat je begint:
n8n 2.0 (cloud of self-hosted). De voice agent nodes zijn beschikbaar vanaf versie 2.0. Installeer via n8n.io of gebruik n8n cloud.
Twilio account. Twilio is de telefoondienst die inkomende gesprekken afhandelt en doorstuurt naar jouw webhook. Maak een gratis testaccount op twilio.com. Je hebt een telefoonnummer nodig (circa 1 euro per maand na testfase).
ElevenLabs of OpenAI TTS. Voor de stem van de agent. ElevenLabs biedt de meest realistische Nederlandse stemmen. OpenAI TTS is iets eenvoudiger te integreren. Beide werken via API.
Claude API (Anthropic). Het brein van de agent. Gebruik claude-sonnet-4-6 voor de balans tussen snelheid en kwaliteit. Kosten circa 0,003 euro per gesprek van een minuut.
Google Sheets of Notion (optioneel). Voor het opslaan van afspraken en gesprekslog.
{
"kosten_schatting": {
"twilio_telefoonnummer": "1,00 EUR/maand",
"twilio_per_minuut_inkomend": "0,0085 EUR/min",
"elevenlabs_starter": "5 USD/maand (30.000 tekens)",
"openai_tts": "0,015 USD per 1.000 tekens",
"claude_sonnet_4_6": "3 USD per 1M input tokens",
"n8n_cloud_starter": "20 EUR/maand",
"schatting_per_gesprek_1_min": "~0,01-0,03 EUR"
}
}
Stap 1: Twilio instellen en webhook configureren
Log in op console.twilio.com. Ga naar Phone Numbers en koop een Nederlands telefoonnummer (0085x of 06-nummer). Kies onder 'Capabilities' voor Voice.
Ga naar de instellingen van je telefoonnummer. Onder 'Voice Configuration' stel je de webhook in. Dit is de URL van je n8n-workflow. Die URL heb je nodig in Stap 2, maar je kunt alvast een placeholder invullen.
Twilio stuurt bij elke inkomende oproep een HTTP POST-request naar jouw webhook met de volgende parameters:
# Twilio webhook parameters (POST body)
CallSid=CA... # Uniek gesprek-ID
From=+31612345678 # Telefoonnummer beller
To=+31858001234 # Jouw Twilio-nummer
CallStatus=ringing # Status: ringing, in-progress, completed
Direction=inbound # Richting van het gesprek
# Na eerste spraakopname ook:
RecordingUrl=https://... # URL naar de audio
SpeechResult=Hallo, ik wil een afspraak # Getranscribeerde tekst (als je Gather gebruikt)
Confidence=0.97 # Vertrouwensscore
Stap 2: n8n workflow opbouwen
Maak een nieuw workflow in n8n. Het basisskelet bestaat uit de volgende nodes:
Node 1: Webhook. Type: POST. Dit is de ingang van de workflow. Copieer de Webhook URL en plak deze in Twilio (zie Stap 1). Stel de response mode in op 'Using Respond to Webhook Node'.
Node 2: Code (verwerk Twilio data). Verwerk de binnenkomende data en haal de relevante velden eruit.
// Node 2: Extract Twilio parameters
const body = $input.first().json.body;
return [{
json: {
callSid: body.CallSid,
caller: body.From,
speechResult: body.SpeechResult || '',
confidence: parseFloat(body.Confidence || '0'),
callStatus: body.CallStatus,
isFirstTurn: !body.SpeechResult // Eerste keer: geen spraak ontvangen
}
}];
Node 3: IF (eerste beurt?). Controleer of dit de eerste keer is dat de workflow wordt aangeroepen. Als er nog geen SpeechResult is, stuur je een begroeting. Anders verwerk je de spraak.
Stap 3: Speech-to-Text via Twilio Gather
Twilio heeft ingebouwde spraakherkenning via de Gather-TwiML-tag. Je hoeft geen aparte STT-dienst in te stellen. Twilio luistert naar de beller, converteert naar tekst en stuurt die tekst terug naar jouw webhook.
De Twilio Respond-node stuurt TwiML (Twilio Markup Language) terug. TwiML is vergelijkbaar met XML en instrueert Twilio wat het moet doen.
<!-- TwiML voor begroeting en spraakopname -->
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<!-- Speel een begroeting af -->
<Say language="nl-NL" voice="alice">
Goedendag, u bent verbonden met het installatiebedrijf Van der Berg.
Hoe kan ik u helpen?
</Say>
<!-- Luister naar de beller (max 10 seconden, timeout 5 sec) -->
<Gather
input="speech"
language="nl-NL"
action="https://JOUW-N8N-WEBHOOK-URL"
method="POST"
speechTimeout="2"
timeout="10"
enhanced="true">
<!-- Say binnen Gather speelt af terwijl Twilio luistert -->
</Gather>
<!-- Fallback als niemand iets zegt -->
<Say language="nl-NL">Ik heb u niet verstaan. Probeer het opnieuw.</Say>
</Response>
Stel in n8n een Respond to Webhook-node in die deze TwiML teruggeeft als content-type text/xml. Zo ontvangt de beller de begroeting en wordt direct zijn spraak opgenomen.
Stap 4: AI-antwoord genereren met Claude
Voeg een AI-node toe voor Claude. Gebruik de Anthropic-node in n8n met het claude-sonnet-4-6 model.
Schrijf een systeem-prompt die de agent instrueert. Wees specifiek over wat de agent kan en niet kan doen.
// Systeem-prompt voor Claude (voice agent installatiebedrijf)
const systemPrompt = `Je bent een vriendelijke telefonische assistent voor installatiebedrijf Van der Berg.
Je kunt het volgende:
- Afspraken plannen voor installaties en onderhoud
- Storingsinformatie doorgeven
- Openingstijden en contactinformatie geven
- Klanten doorverbinden naar een medewerker
Je KUNT het volgende NIET:
- Prijsafspraken maken
- Garantieclaims verwerken
- Technisch advies geven
REGELS:
- Antwoord altijd in het Nederlands
- Houd antwoorden kort: maximaal 2 zinnen (dit is een telefoongesprek)
- Vraag altijd om een naam en telefoonnummer bij afspraken
- Zeg TRANSFER als je een medewerker wil inschakelen
- Zeg AFSPRAAK:DATUM:TIJD als je een afspraak wil inplannen
Openingstijden: maandag t/m vrijdag 08:00-17:00.`;
// Gesprekshistorie bijhouden (uit workflow memory)
const history = $('Memory Node').first().json.history || [];
return [{
json: {
systemPrompt,
messages: [
...history,
{ role: 'user', content: $input.first().json.speechResult }
]
}
}];
Stap 5: Conversatiegeheugen opzetten
Voor een goede voice agent moet je meerdere beurten bijhouden. Anders vergeet de agent na elke spraakbeurt wat eerder besproken is. Gebruik een Memory-node in n8n voor persistentie.
In n8n 2.0 zijn er ingebouwde Memory-nodes. Je kunt kiezen tussen Session Memory (tijdelijk, per gesprek) en Window Buffer Memory. Gebruik Session Memory met de CallSid als identifier, zodat elke beller een eigen geheugen heeft.
// Memory configuratie in n8n
{
"memoryType": "SessionMemory",
"sessionId": "{{ $json.callSid }}",
"windowSize": 10, // Bewaar de laatste 10 beurten
"ttl": 3600 // Verwijder na 1 uur inactiviteit
}
Stap 6: TTS antwoord terugspelen
Nadat Claude een antwoord heeft gegenereerd, moet je dat omzetten in spraak. Er zijn twee aanpakken:
Aanpak A (eenvoudig): Twilio ingebouwde TTS. Twilio heeft een ingebouwde text-to-speech engine. Je stuurt de tekst direct terug als TwiML Say-tag. Kwaliteit is acceptabel maar minder natuurlijk.
Aanpak B (premium): ElevenLabs of OpenAI TTS. Je genereert een audio-bestand en laat Twilio die afspelen. Klinkt veel natuurlijker maar voegt latentie toe.
<!-- Aanpak A: Twilio ingebouwde TTS (eenvoudig, snelst) -->
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="nl-NL" voice="alice">
{{ claudeAntwoord }}
</Say>
<Gather
input="speech"
language="nl-NL"
action="https://JOUW-N8N-WEBHOOK"
method="POST"
speechTimeout="2"
timeout="10"
enhanced="true">
</Gather>
</Response>
// Aanpak B: ElevenLabs TTS (premium kwaliteit)
const elevenLabsApiKey = 'jouw-api-key';
const voiceId = 'pNInz6obpgDQGcFmaJgB'; // Adam stem (NL)
const response = await fetch(
`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`,
{
method: 'POST',
headers: {
'xi-api-key': elevenLabsApiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify({
text: claudeAntwoord,
model_id: 'eleven_multilingual_v2',
voice_settings: { stability: 0.5, similarity_boost: 0.75 }
})
}
);
// Sla audio op in tijdelijke opslag (bijv. Cloudflare R2 of S3)
// En speel af via Twilio Play-tag
const audioUrl = await uploadToStorage(await response.arrayBuffer());
return { twiml: `<Response><Play>${audioUrl}</Play><Gather ...></Gather></Response>` };
Stap 7: Acties uitvoeren vanuit spraak
De kracht van een voice agent zit in het uitvoeren van echte acties. Als Claude in zijn antwoord AFSPRAAK:2026-08-15:10:00 teruggeeft, verwerk je dat in je workflow.
// Detect en verwerk acties in Claude output
const claudeResponse = $input.first().json.content;
// Parse AFSPRAAK actie
const afspraakMatch = claudeResponse.match(/AFSPRAAK:(\d{4}-\d{2}-\d{2}):(\d{2}:\d{2})/);
if (afspraakMatch) {
const datum = afspraakMatch[1];
const tijd = afspraakMatch[2];
// Voeg toe aan Google Sheets of Notion
return [{
json: {
actie: 'plan_afspraak',
datum,
tijd,
klant: $('Memory').first().json.klantNaam || 'Onbekend',
telefoonnummer: $input.first().json.caller,
antwoordVoorBeller: `Prima, ik plan een afspraak op ${datum} om ${tijd} uur. U ontvangt een bevestiging.`
}
}];
}
// Parse TRANSFER actie
if (claudeResponse.includes('TRANSFER')) {
return [{
json: {
actie: 'transfer',
antwoordVoorBeller: 'Ik verbind u door met een van onze medewerkers.'
}
}];
}
// Standaard antwoord
return [{ json: { actie: 'antwoord', antwoordVoorBeller: claudeResponse } }];
Stap 8: Testen met echte telefoonnummers
Voordat je live gaat, test je grondig. Twilio biedt een testomgeving, maar voor spraakherkenning heb je echte oproepen nodig.
Testscenario 1 - Basisafspraak: bel het nummer en zeg 'Ik wil een afspraak maken voor volgende week dinsdag.' Controleer of de agent een datum vraagt en de afspraak correct opslaat.
Testscenario 2 - Storingsmelding: zeg 'Mijn cv-ketel doet het niet meer.' De agent moet dit registreren en navragen om welk type ketel het gaat.
Testscenario 3 - Onbekende vraag: stel een vraag buiten de scope, zoals 'Wat kost een nieuwe warmtepomp?' De agent moet doorverbinden.
Testscenario 4 - Onduidelijke spraak: spreek zachtjes of in een omgeving met achtergrondgeluid. Test hoe de agent omgaat met lage confidence scores.
// Foutafhandeling voor lage confidence
const confidence = $input.first().json.confidence;
const speechResult = $input.first().json.speechResult;
if (confidence < 0.6 || !speechResult) {
// Te lage zekerheid: vraag herhaling
return [{
json: {
twiml: `<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="nl-NL" voice="alice">
Kunt u dat herhalen? Ik verstond u niet goed.
</Say>
<Gather input="speech" language="nl-NL" action="WEBHOOK_URL"
method="POST" speechTimeout="2" enhanced="true">
</Gather>
</Response>`
}
}];
}
Stap 9: Live zetten en monitoren
Als de tests slagen, zet je de workflow live. Update de Twilio webhook-URL naar je productie-n8n-endpoint. Schakel logging in voor alle gesprekken.
Monitor in de eerste week intensief. Luister naar de gespreksopnames (die Twilio automatisch bewaart als je RecordingEnabled=true instelt) en verbeter de systeem-prompt op basis van wat je hoort.
Bekijk wekelijks de statistieken: hoeveel procent van gesprekken wordt volledig afgehandeld zonder medewerker? Streef naar 60 tot 80 procent voor standaardvragen. Gesprekken die escaleert worden zijn juist goed - de agent herkent zijn grenzen.
Uitbreidingsmogelijkheden
Als de basisagent werkt, kun je uitbreiden met: koppeling met je CRM (HubSpot, Salesforce) zodat klantinfo direct zichtbaar is, sentimentanalyse om emotionele gesprekken te detecteren en prioriteit te geven, en WhatsApp Business naast telefoon zodat klanten ook via app contact kunnen opnemen met dezelfde agent.
Een volgende stap is proactief bellen: n8n triggert automatisch een outbound-gesprek via Twilio als een afspraak over 24 uur is. De voice agent herinnert de klant en vraagt om bevestiging. Dit soort workflows bespaart no-show's.