Robot d'appel vocal IA - Intégration OpenAI GPT-4o + ElevenLabs + Twilio
Ceci est unSupport Chatbot, AI Chatbotworkflow d'automatisation du domainecontenant 10 nœuds.Utilise principalement des nœuds comme If, OpenAi, Webhook, ElevenLabs, HttpRequest. Utiliser GPT-4o, ElevenLabs et Twilio pour créer un bot d'appel vocal multilingue
- •Clé API OpenAI
- •Point de terminaison HTTP Webhook (généré automatiquement par n8n)
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
- •Informations d'identification Google Sheets API
Nœuds utilisés (10)
Catégorie
{
"id": "ai-voice-calling-bot",
"meta": {
"instanceId": "12345abcde67890fghij",
"templateCredsSetupCompleted": true
},
"name": "AI Voice Calling Bot - OpenAI GPT-4o + ElevenLabs + Twilio Integration",
"tags": [
{
"id": "ai-voice-bot",
"name": "AI Voice Bot",
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
],
"nodes": [
{
"id": "webhook-start",
"name": "Twilio Voice Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
240,
300
],
"webhookId": "voice-webhook-start",
"parameters": {
"path": "voice-webhook",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 1
},
{
"id": "check-speech-input",
"name": "Vérifier la saisie vocale",
"type": "n8n-nodes-base.if",
"position": [
460,
300
],
"parameters": {
"conditions": {
"options": {
"leftValue": "={{ $json.SpeechResult }}",
"operation": "exists",
"caseSensitive": true
}
}
},
"typeVersion": 1
},
{
"id": "openai-gpt",
"name": "OpenAI GPT-4o Response",
"type": "n8n-nodes-base.openAi",
"position": [
680,
200
],
"parameters": {
"model": "gpt-4o",
"options": {
"maxTokens": 150,
"temperature": 0.7
},
"messages": {
"values": [
{
"role": "system",
"content": "You are a helpful AI assistant for a service business. You can help customers:\n1. Schedule appointments (collect name, phone, preferred date/time, service type)\n2. Order pizza (collect size, toppings, address, phone)\n3. Book other services (collect relevant details)\n\nAlways be polite, concise, and gather necessary information step by step. Keep responses under 100 words for voice calls. End with a clear question or next step."
},
{
"role": "user",
"content": "={{ $json.SpeechResult || 'Hello, how can I help you today?' }}"
}
]
}
},
"credentials": {
"openAiApi": {
"id": "openai-creds",
"name": "OpenAI API"
}
},
"typeVersion": 1
},
{
"id": "elevenlabs-tts",
"name": "ElevenLabs Text-to-Speech",
"type": "n8n-nodes-base.elevenLabs",
"position": [
900,
200
],
"parameters": {
"text": "={{ $json.choices[0].message.content }}",
"model_id": "eleven_monolingual_v1",
"voice_id": "21m00Tcm4TlvDq8ikWAM",
"voice_settings": {
"style": 0,
"stability": 0.75,
"similarity_boost": 0.75,
"use_speaker_boost": true
}
},
"credentials": {
"elevenLabsApi": {
"id": "elevenlabs-creds",
"name": "ElevenLabs API"
}
},
"typeVersion": 1
},
{
"id": "upload-audio",
"name": "Téléverser l'audio vers le stockage",
"type": "n8n-nodes-base.httpRequest",
"position": [
1120,
200
],
"parameters": {
"operation": "upload",
"additionalFields": {
"fileName": "response.mp3",
"contentType": "audio/mpeg"
},
"binaryPropertyName": "data"
},
"typeVersion": 3
},
{
"id": "twilio-response",
"name": "Twilio TwiML Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1340,
200
],
"parameters": {
"twiml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n <Play>{{ $json.audio_url }}</Play>\n <Gather input=\"speech\" timeout=\"10\" speechTimeout=\"auto\" action=\"{{ $node.webhook.getWebhookUrl() }}\" method=\"POST\">\n <Say voice=\"alice\">Please speak after the tone.</Say>\n </Gather>\n <Say voice=\"alice\">I didn't hear anything. Goodbye!</Say>\n <Hangup/>\n</Response>"
},
"typeVersion": 1
},
{
"id": "initial-greeting",
"name": "Salutation initiale",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
680,
400
],
"parameters": {
"twiml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n <Say voice=\"alice\">Hello! I'm your AI assistant. I can help you schedule appointments, order pizza, or book services. How can I help you today?</Say>\n <Gather input=\"speech\" timeout=\"10\" speechTimeout=\"auto\" action=\"{{ $node['Twilio Voice Webhook'].getWebhookUrl() }}\" method=\"POST\">\n <Say voice=\"alice\">Please speak after the tone.</Say>\n </Gather>\n <Say voice=\"alice\">I didn't hear anything. Please call back. Goodbye!</Say>\n <Hangup/>\n</Response>"
},
"typeVersion": 1
},
{
"id": "log-conversation",
"name": "Journaliser la conversation",
"type": "n8n-nodes-base.googleSheets",
"position": [
900,
400
],
"parameters": {
"columns": {
"value": {
"call_sid": "={{ $json.CallSid }}",
"caller_id": "={{ $json.From }}",
"timestamp": "={{ $now }}",
"ai_response": "={{ $json.choices[0].message.content }}",
"speech_input": "={{ $json.SpeechResult }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": "Call_Logs",
"documentId": "your-google-sheet-id"
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "google-sheets-creds",
"name": "Google Sheets"
}
},
"typeVersion": 3
},
{
"id": "check-appointment",
"name": "Vérifier un rendez-vous",
"type": "n8n-nodes-base.if",
"position": [
1120,
400
],
"parameters": {
"conditions": {
"options": {
"leftValue": "={{ $json.choices[0].message.content.toLowerCase() }}",
"operation": "contains",
"rightValue": "appointment",
"caseSensitive": false
}
}
},
"typeVersion": 1
},
{
"id": "save-appointment",
"name": "Enregistrer la demande de rendez-vous",
"type": "n8n-nodes-base.googleSheets",
"position": [
1340,
500
],
"parameters": {
"columns": {
"value": {
"status": "pending",
"call_sid": "={{ $json.CallSid }}",
"caller_id": "={{ $json.From }}",
"timestamp": "={{ $now }}",
"request_details": "={{ $json.SpeechResult }}"
},
"mappingMode": "defineBelow"
},
"operation": "append",
"sheetName": "Appointments",
"documentId": "your-appointments-sheet-id"
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "google-sheets-creds",
"name": "Google Sheets"
}
},
"typeVersion": 3
}
],
"active": true,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "1",
"connections": {
"log-conversation": {
"main": [
[
{
"node": "check-appointment",
"type": "main",
"index": 0
}
]
]
},
"check-speech-input": {
"main": [
[
{
"node": "openai-gpt",
"type": "main",
"index": 0
}
],
[
{
"node": "initial-greeting",
"type": "main",
"index": 0
}
]
]
},
"webhook-start": {
"main": [
[
{
"node": "check-speech-input",
"type": "main",
"index": 0
}
]
]
},
"check-appointment": {
"main": [
[
{
"node": "save-appointment",
"type": "main",
"index": 0
}
],
[]
]
},
"openai-gpt": {
"main": [
[
{
"node": "elevenlabs-tts",
"type": "main",
"index": 0
},
{
"node": "log-conversation",
"type": "main",
"index": 0
}
]
]
},
"upload-audio": {
"main": [
[
{
"node": "twilio-response",
"type": "main",
"index": 0
}
]
]
},
"elevenlabs-tts": {
"main": [
[
{
"node": "upload-audio",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Intermédiaire - Chatbot de support, Chatbot IA
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Shiva
@shivp1413Several years of Experience in AI, LLMs, Robotics, Electronics. I create N8N templates which are open-source and free!!
Partager ce workflow