Handleidingen · n8n

AI voice-assistent bouwen met ElevenLabs en n8n

Bouw een realtime AI voice-assistent met n8n, Claude en ElevenLabs. Van webhook tot audio-response, in eigen beheer.

🟡 Gevorderd — beetje technisch ⏱ 90 minuten
Tools: n8nElevenLabs
AI voice-assistent bouwen met ElevenLabs en n8n

Met de opkomst van conversationele AI is de vraag niet meer of je een AI voice assistent bouwt, maar hoe snel je dat doet. In deze handleiding bouw je stap voor stap een volwaardige real-time AI voice assistent die luistert naar gebruikersinput, die verwerkt via Claude van Anthropic, en terugpraat via de stem van Rachel van ElevenLabs. De volledige flow draait in n8n, het open-source automatiseringsplatform.

Na het doorlopen van deze handleiding heb je een werkende webhook-gebaseerde voice pipeline: van tekst-input naar AI-antwoord naar audiofragment, klaar om te integreren in een website, app of telefoonsysteem.

Vereisten en voorbereiding

Voordat je begint heb je nodig: een werkende n8n installatie (zelfgehost of cloud, versie 2.0 of hoger), een Anthropic API-key met toegang tot claude-sonnet-4-6, een ElevenLabs API-key met credits voor de Rachel-stem (voice ID: 21m00Tcm4TlvDq8ikWAM), en een HTTPS-eindpunt voor de webhook (gebruik ngrok of Cloudflare Tunnel voor lokale ontwikkeling).

Zorg dat je n8n-omgeving toegang heeft tot het internet voor outbound API-calls. Test dit eerst met een eenvoudige HTTP Request node naar httpbin.org/get.

Stap 1: n8n Webhook instellen als trigger

Open n8n en maak een nieuw workflow. Sleep een Webhook node naar het canvas. Stel de HTTP-methode in op POST en kies een pad zoals /voice-assistent. De webhook URL wordt automatisch gegenereerd en ziet er zo uit:

https://jouw-n8n.example.com/webhook/voice-assistent # Of voor lokale ontwikkeling met ngrok: https://abc123.ngrok-free.app/webhook/voice-assistent

Stel de Response Mode in op 'Last Node' zodat n8n wacht op de volledige verwerking voordat het een response stuurt. Klik op 'Listen for Test Event' om de webhook te activeren voor het testen. Stuur een test-POST request met een tool zoals Postman of via curl.

Stap 2: Input valideren en verwerken

Na de Webhook node voeg je een Set node toe om de gebruikersinput te extraheren en te normaliseren. De inkomende payload verwacht je in dit formaat:

{ "message": "Wat zijn de openingstijden van jullie kantoor?", "session_id": "user-123-abc", "language": "nl" }

In de Set node maak je de volgende variabelen aan: userMessage (uit {{ $json.body.message }}), sessionId (uit {{ $json.body.session_id }}), en language (uit {{ $json.body.language || 'nl' }}). Voeg ook een timestamp toe met {{ new Date().toISOString() }}.

Optioneel: voeg een IF node toe die controleert of userMessage niet leeg is. Stuur bij een lege input direct een foutmelding terug zodat je geen API-credits verspilt.

Stap 3: Systeemprompt definiëren

Voor een goede voice assistent is de systeemprompt cruciaal. Deze instrueert Claude over de persoonlijkheid, het taalgebruik en de grenzen van de assistent. Voeg een tweede Set node toe met de systeemprompt:

systemPrompt: | Je bent een vriendelijke en behulpzame AI voice assistent voor workflows.nl. Je geeft korte, duidelijke antwoorden die goed klinken als gesproken audio. Gebruik nooit bullet points of markdown opmaak in je antwoorden. Spreek in complete zinnen, als in een normaal gesprek. Maximale antwoordlengte: 150 woorden. Taal: altijd Nederlands, ook als de vraag in een andere taal gesteld wordt.

Let op het laatste punt: voor voice output wil je geen markdown, geen asterisken, geen lijstjes. ElevenLabs leest alles letterlijk voor, inclusief sterretjes en koppeltekens. Houd antwoorden gesproken van toon.

Stap 4: Claude API koppelen via HTTP Request

n8n heeft een eigen Anthropic node, maar voor maximale controle gebruiken we de HTTP Request node direct. Voeg een HTTP Request node toe met deze configuratie:

Method: POST URL: https://api.anthropic.com/v1/messages Headers: x-api-key: {{ $vars.ANTHROPIC_API_KEY }} anthropic-version: 2023-06-01 content-type: application/json Body (JSON): { "model": "claude-sonnet-4-6", "max_tokens": 300, "system": "{{ $json.systemPrompt }}", "messages": [ { "role": "user", "content": "{{ $json.userMessage }}" } ] }

Gebruik n8n Credentials voor de API-key in plaats van hardcoded waarden. Ga naar Settings > Credentials en maak een nieuwe 'Header Auth' credential met de naam 'Anthropic API'. Zo blijft de key veilig en kun je hem makkelijk roteren.

Na de API-call extraheer je de tekst uit de response met een Set node: claudeResponse = {{ $json.content[0].text }}. Dit is de tekst die ElevenLabs gaat omzetten naar audio.

Stap 5: Tekst naar spraak met ElevenLabs

Nu voeg je een tweede HTTP Request node toe voor de ElevenLabs Text-to-Speech API. Rachel (voice ID: 21m00Tcm4TlvDq8ikWAM) is een warme, natuurlijk klinkende Nederlandse stem die uitstekend werkt voor klantenservice toepassingen.

Method: POST URL: https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM Headers: xi-api-key: {{ $vars.ELEVENLABS_API_KEY }} content-type: application/json Body (JSON): { "text": "{{ $json.claudeResponse }}", "model_id": "eleven_multilingual_v2", "voice_settings": { "stability": 0.75, "similarity_boost": 0.85, "style": 0.20, "use_speaker_boost": true } } Response Format: Binary (voor audio data)

Stel de Response Format in op 'Binary' in de HTTP Request node om de ruwe audiobytes te ontvangen. ElevenLabs retourneert standaard MP3-audio (128kbps). Voor hogere kwaliteit kun je de output_format parameter toevoegen: mp3_44100_128 of pcm_44100 voor ongecomprimeerde audio.

Stap 6: Audio opslaan en beschikbaar maken

De audiobinary die je terugkrijgt van ElevenLabs kun je op verschillende manieren verder verwerken, afhankelijk van je use case:

Optie A - Direct als base64 teruggeven: Converteer de binary naar base64 met {{ Buffer.from($binary.data, 'base64').toString('base64') }} en stuur dit terug in de webhook response. De frontend kan dit direct afspelen als audio/mpeg.

Optie B - Opslaan in S3 of Cloudflare R2: Gebruik de AWS S3 node of een HTTP Request node naar Cloudflare R2 om de audio op te slaan en een publieke URL terug te sturen. Dit is beter voor productie-omgevingen met grote volumes.

Optie C - Doorgeven aan telefonieprovider: Als je de assistent koppelt aan een telefoonsysteem (Twilio, Vonage), stuur je de TwiML/NCCO response met een Play-actie naar de audio URL.

Stap 7: Webhook response samenstellen

Voeg een Respond to Webhook node toe als laatste stap. Configureer de response om zowel de tekst als de audio mee te sturen:

// Respond to Webhook configuratie Response Code: 200 Content-Type: application/json Response Body: { "success": true, "message": "{{ $json.claudeResponse }}", "audio_base64": "{{ $binary.data }}", "audio_format": "mp3", "session_id": "{{ $json.sessionId }}", "timestamp": "{{ $json.timestamp }}", "voice": { "id": "21m00Tcm4TlvDq8ikWAM", "name": "Rachel", "provider": "ElevenLabs" } }

Stap 8: Foutafhandeling toevoegen

Een productie-ready voice assistent heeft foutafhandeling nodig. Voeg Error Trigger nodes toe aan de Claude en ElevenLabs HTTP Request nodes. Stel in elke HTTP Request node de 'On Error' optie in op 'Continue' en voeg error handling toe.

Bij een Claude API-fout (rate limit, timeout, of content policy) stuur je een vriendelijke fallback audio terug. Pre-genereer een aantal veelgebruikte foutmeldingen via ElevenLabs en sla deze op als statische MP3-bestanden. Zo houdt de assistent ook bij storingen een menselijke toon.

Monitor je workflow via n8n's ingebouwde execution logs. Stel een alert in via een Telegram of Slack node die triggert wanneer een uitvoering mislukt. Gebruik de Expression: {{ $execution.status === 'error' }} in een IF node.

Stap 9: Testen en optimaliseren

Test de complete pipeline met een curl-commando:

curl -X POST https://jouw-n8n.example.com/webhook/voice-assistent \ -H "Content-Type: application/json" \ -d '{"message": "Hoi, wat kan jij voor mij doen?", "session_id": "test-001"}' \ --output response.json # Extraheer audio en speel af: jq -r '.audio_base64' response.json | base64 --decode > antwoord.mp3 mpv antwoord.mp3

Meet de latency van elke stap. Een goede voice assistent reageert binnen 2 seconden. Claude-latency is gemiddeld 800ms-1.2s, ElevenLabs 400-600ms, n8n overhead 100ms. Totaal: 1.3-1.9 seconden, goed genoeg voor een vloeiende conversatie.

Optimaliseer de streaming: ElevenLabs ondersteunt streaming audio via Server-Sent Events. Als je de frontend kunt aanpassen, gebruik dan de /stream endpoint om de audio al te starten voordat de volledige response klaar is. Dit verlaagt de waargenomen latency met 40-60%.

Stap 10: Deployment en schalen

Voor productie zet je de workflow op via n8n's ingebouwde scheduler en maak je hem actief. Configureer rate limiting om API-kosten te beheersen: gebruik een Rate Limit node of voeg throttling toe via een Redis-based counter in een Code node.

Schaal-tips voor hogere volumes: gebruik n8n Worker mode voor parallelle uitvoering, zet een Redis cache op voor veelgestelde vragen (zodat je Claude niet steeds hoeft aan te roepen voor hetzelfde antwoord), en overweeg ElevenLabs' batch TTS API voor niet-realtime use cases.

Beveilig je webhook met een geheim token. Voeg een header toe zoals X-Webhook-Secret aan inkomende requests en valideer dit in n8n met een IF node: {{ $json.headers['x-webhook-secret'] === $vars.WEBHOOK_SECRET }}.

Kosteninschatting

Voor een typische MKB-implementatie met 1.000 vragen per maand: Claude Sonnet 4.6 kost ongeveer 0,003 dollar per vraag (300 output tokens gemiddeld), ElevenLabs kost 0,001 dollar per 100 tekens met het Creator plan. Totale kosten: circa 5-15 euro per maand voor 1.000 gesprekken. Dat is goedkoper dan het eerste kwartier van een menselijke klantenservicemedewerker.

Gebruik n8n's execution metrics om je werkelijk verbruik bij te houden. Stel dagelijkse budgetlimieten in via de ElevenLabs dashboard en Anthropic Console om verrassingen op de factuur te voorkomen.

Conclusie en volgende stappen

Je hebt nu een werkende AI voice assistent gebouwd op n8n, Claude en ElevenLabs. De combinatie is krachtig: n8n geeft je volledige controle over de flow en integraties, Claude levert intelligente antwoorden in natuurlijk Nederlands, en ElevenLabs maakt de output menselijk en aangenaam om naar te luisteren.

Mogelijke uitbreidingen: voeg een conversatiegeheugen toe via n8n's database nodes en sla sessies op in PostgreSQL, integreer de assistent met je CRM om klantgegevens op te zoeken, of koppel hem aan een live chat widget op je website. De architectuur die je hier hebt gebouwd vormt de basis voor vrijwel elke conversationele AI-applicatie.

Vragen of vastgelopen? Bekijk de workflows.nl handleidingen over n8n integraties of stel je vraag via het forum.

Gerelateerd

Nieuwsbrief

Meer handleidingen en tips?

Elke week de beste agentic AI inzichten en nieuwe handleidingen in je inbox.

Gratis aanmelden →