Le voyage de la voix
Dans ce guide, vous allez mettre en œuvre le scénario de centre de contact suivant :
- L'utilisateur appelle votre numéro Vonage,
- Le message d'accueil est lu et l'utilisateur choisit une option dans le menu proposé,
- L'utilisateur est connecté à un agent,
- Une fois que l'agent a mis fin à l'appel, l'utilisateur est transféré vers une enquête de satisfaction du client.
Pour une meilleure compréhension du flux, voir Flux d'appels.
Conditions préalables
Pour compléter ce guide, vous avez besoin de :
- A Account Vonage,
- Les CLI Vonage installé et mis en place,
- ngrok - pour rendre votre serveur web de développement accessible aux serveurs de Vonage sur Internet,
- Node.JS installés,
- deux dispositifs d'appel téléphonique avec des numéros RTPC attribués - "téléphone de l'utilisateur" et "téléphone de l'agent", par exemple, deux téléphones mobiles ou une application dotée d'une capacité d'appel telle que Vonage Business app.
Installer les dépendances
Installer le express le cadre d'application web et analyseur de corps paquets :
Créer une application vocale
Utilisez l'interface de commande pour créer une application Voice API à l'aide de l'option
webhooks qui sera chargé de répondre à un appel sur votre numéro Vonage (
appel sur votre numéro Vonage (/webhooks/voice/answer) et l'enregistrement des événements d'appel (/webhooks/voice/event), respectivement.
Ces webhooks doivent être accessibles par les serveurs de Vonage, donc dans ce guide vous utiliserez ngrok d'exposer votre environnement de
environnement de développement local à l'Internet public. Cet article explique comment installer
et d'exécuter ngrok et configurer Vonage pour qu'il envoie des requêtes.
Si vous n'avez pas d'application, vous pouvez en créer une à l'aide du CLI
vonage apps create 'Your application'
✅ Creating Application
Saving private key ... Done!
Application created
Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set
Capabilities:
None Enabled
vonage apps create 'Your application'
✅ Creating Application
Saving private key ... Done!
Application created
Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set
Capabilities:
None Enabled
La commande renvoie un numéro d'identification de l'application (que vous devez noter) et les informations relatives à votre clé privée (que vous pouvez ignorer pour les besoins de ce guide). pouvez ignorer pour les besoins de ce guide).
Exécuter ngrok à l'aide de la commande suivante :
Notez le nom d'hôte temporaire que ngrok et l'utiliser à la place de example.com dans la commande suivante
commande :
vonage apps capabilities update 00000000-0000-0000-0000-000000000000 voice `
--voice-answer-url='https://example.com/webhooks/voice/answer' `
--voice-event-url='https://example.com/webhooks/voice/event' `
--voice-fallback-url='https://example.com/webhooks/voice/fallback'
✅ Fetching Application
✅ Adding voice capability to application 00000000-0000-0000-0000-000000000000
Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set
Capabilities:
VOICE:
Uses Signed callbacks: On
Conversation TTL: 41 hours
Leg Persistence Time: 6 days
Event URL: [POST] https://example.com/webhooks/voice/event
Answer URL: [POST] https://example.com/webhooks/voice/answer
Fallback URL: [POST] https://example.com/webhooks/voice/fallback
vonage apps capabilities update 00000000-0000-0000-0000-000000000000 voice ^
--voice-answer-url='https://example.com/webhooks/voice/answer' ^
--voice-event-url='https://example.com/webhooks/voice/event' ^
--voice-fallback-url='https://example.com/webhooks/voice/fallback'
✅ Fetching Application
✅ Adding voice capability to application 00000000-0000-0000-0000-000000000000
Name: Your application
Application ID: 00000000-0000-0000-0000-000000000000
Improve AI: Off
Private/Public Key: Set
Capabilities:
VOICE:
Uses Signed callbacks: On
Conversation TTL: 41 hours
Leg Persistence Time: 6 days
Event URL: [POST] https://example.com/webhooks/voice/event
Answer URL: [POST] https://example.com/webhooks/voice/answer
Fallback URL: [POST] https://example.com/webhooks/voice/fallback
Acheter un numéro de téléphone
Pour traiter les appels entrants vers votre application, vous avez besoin d'un numéro de Vonage. Si vous avez déjà un numéro à utiliser, passez à la section suivante pour associer le numéro existant à votre application. à la section suivante pour associer le numéro existant à votre application.
Vous pouvez utiliser le CLI Vonage pour acheter le numéro de téléphone :
Recherche d'un Numbers
Vous pouvez acheter un numéro à l'aide de la CLI de Vonage. La commande suivante recherche un numéro à acheter (spécifiez un autre code de pays à deux caractères pour acheter un numéro dans un autre pays).
vonage numbers search US
✅ Searching for numbers
There is 1 number available for purchase in United States
Number Type Features Monthly Cost Setup Cost
----------- ------ --------------- ------------ ----------
16127779311 Mobile MMS, SMS, VOICE €0.90 €0.00
Use vonage numbers buy to purchase.
vonage numbers search US
✅ Searching for numbers
There is 1 number available for purchase in United States
Number Type Features Monthly Cost Setup Cost
----------- ------ --------------- ------------ ----------
16127779311 Mobile MMS, SMS, VOICE €0.90 €0.00
Use vonage numbers buy to purchase.
Acheter un numéro
Une fois que vous avez trouvé un numéro qui vous convient, vous pouvez l'acheter à l'aide de la fonction vonage numbers buy commande :
vonage numbers buy US 16127779311
✅ Searching for numbers
Are you sure you want to purchase the number 16127779311 for €0.90? [y/n] y
✅ Purchasing number
Number 16127779311 purchased
Number: 16127779311
Country: 🇺🇸 United States
Type: Mobile
Features: MMS, SMS, VOICE
Monthly Cost: €0.90
Setup Cost: €0.00
Linked Application ID: Not linked to any application
Voice Callback: Not Set
Voice Callback Value: Not Set
Voice Status Callback: Not Set
vonage numbers buy US 16127779311
✅ Searching for numbers
Are you sure you want to purchase the number 16127779311 for €0.90? [y/n] y
✅ Purchasing number
Number 16127779311 purchased
Number: 16127779311
Country: 🇺🇸 United States
Type: Mobile
Features: MMS, SMS, VOICE
Monthly Cost: €0.90
Setup Cost: €0.00
Linked Application ID: Not linked to any application
Voice Callback: Not Set
Voice Callback Value: Not Set
Voice Status Callback: Not Set
Vous êtes maintenant prêt à écrire le code de votre application.
Rédigez votre réponse webhook
Lorsque Vonage reçoit un appel entrant sur votre numéro virtuel, il fait une demande à votre /webhooks/answer route.
Cette route doit accepter un message HTTP GET et renvoie un
Objet de contrôle d'appel Nexmo (NCCO) qui indique à Vonage comment traiter l'appel.
Votre BCN doit utiliser le talk pour accueillir l'appelant, et l'action input action pour obtenir l'utilisateur
Entrée DTMF (touche enfoncée) :
app.get('/webhooks/voice/answer', (request, response) => {
console.log('answer: ', request.query)
const ncco = [{
action: 'talk',
text: 'Thank you for calling Example Inc.! Press 1 to talk to the sales department, press 2 to get technical support.',
bargeIn: true
},
{
action: 'input',
eventUrl: [
`${request.protocol}://${request.get('host')}/webhooks/input`],
type: [ 'dtmf' ],
dtmf: {
maxDigits: 1
}
}
]
response.json(ncco)
})
Rédigez votre webhook d'événement
Mettre en place un webhook qui capture les événements d'appel afin de pouvoir observer le cycle de vie de l'appel dans la console :
app.post('/webhooks/voice/event', (request, response) => {
console.log('event:', request.body)
response.sendStatus(200);
})
Vonage fait une POST à ce point d'extrémité à chaque fois que l'état de l'appel change.
Rédigez votre webhook d'entrée
Les résultats de l'entrée DTMF seront envoyés à l'URL spécifique que vous avez définie dans la rubrique input action : /webhooks/input. Ajouter un webhook pour traiter le résultat et ajouter une interaction avec l'utilisateur.
En cas de reconnaissance réussie, la charge utile de la demande se présentera comme suit :
{
"speech": {
},
"dtmf": {
"digits": "1",
"timed_out": true
},
"from": USER_NUMBER,
"to": VONAGE_NUMBER,
"uuid": "abfd679701d7f810a0a9a44f8e298b33",
"conversation_uuid": "CON-64e6c8ef-91a9-4a21-b664-b00a1f41340f",
"timestamp": "2020-04-17T17:31:53.638Z"
}
Récupérer les données de l'utilisateur dans la base de données dtmf.digits pour déterminer les options qu'ils ont sélectionnées. Pour connecter l'utilisateur et l'agent du service correspondant, vous allez créer un appel sortant vers le point de terminaison de l'agent. Pour simplifier, vous pouvez utiliser un numéro de téléphone de test dans cet exemple, par exemple votre numéro de téléphone portable. Dans la réalité, le point de terminaison peut être un numéro RTCP ou Point de terminaison SIP pour connecter votre PBX ou votre centre de contact existant. Il peut également s'agir d'un client WebRTC si vous développez votre solution de centre de contact à partir de zéro. Client SDK fournit tout ce dont vous avez besoin pour mettre en œuvre votre propre application d'agent de centre de contact.
Enfin, les deux appels (segments) doivent être déplacés vers une salle de conférence (nommée conversation). Pour ce faire, vous devez utiliser conversation l'action avec la même name à la fois pour l'appel de l'utilisateur (l'appel entrant) et pour l'appel de l'agent (l'appel sortant). Pour générer le nom de la conversation, vous pouvez utiliser n'importe quelle méthode de génération d'identifiant unique, par exemple en utilisant l'horodatage réel.
En option, vous pouvez utiliser connect dans le NCCO pour connecter l'utilisateur à l'agent. La différence est qu'avec connectL'appel sera immédiatement terminé lorsque l'un des participants raccrochera et qu'il ne restera plus qu'un seul segment. Il serait donc impossible de transférer l'utilisateur vers l'enquête après l'appel, si cela n'est pas nécessaire dans votre cas, connect est une option un peu plus pratique. Si vous souhaitez que l'utilisateur reste connecté une fois que l'agent a terminé l'appel, choisissez conversation comme le montre l'exemple ci-dessous.
Ajoutez le code pour gérer le rappel de l'entrée :
app.post('/webhooks/input', (request, response) => {
console.log('input:', request.body)
// generating unique conversation name
var conversationName = 'conversation_' + Date.now()
console.log('conversationName: ', conversationName)
// selecting agent/department endpoint
var departmentId = request.body.dtmf.digits
var department = ''
var departmentNumber = ''
switch (departmentId) {
case '1':
department = 'Sales'
departmentNumber = AGENT_NUMBER
break
case '2':
department = 'Support'
departmentNumber = OTHER_AGENT_NUMBER //you can use the same number for the sample
break
default:
break
}
var ncco = ''
if (department != '') {
// NCCO for the user leg
ncco = [{
action: 'talk',
text: 'Please wait while we connect you to ' + department
}, {
action: 'conversation',
name: conversationName
}
]
// creating the agent leg and moving it to the same conversation
vonage.calls.create({
to: [
{
type: 'phone',
number: departmentNumber
}
],
from: {
type: 'phone',
number: VONAGE_NUMBER
},
ncco: [
{
action: 'conversation',
name: conversationName
}]
}, (error, response) => {
if (error) console.error('outbound error:', error)
if (response) {
console.log('outbound ok')
}
})
} else { // something went wrong, fallback route
ncco = [{
action: 'talk',
text: 'Press 1 to talk to the sales department, press 2 to get technical support.',
bargeIn: true
}, {
action: 'input',
eventUrl: [
`${request.protocol}://${request.get('host')}/webhooks/input`
],
dtmf: {
maxDigits: 1
}
}]
}
response.json(ncco)
})
Ajouter une enquête NCCO
Ensuite, pour mettre en œuvre l'enquête de satisfaction du client à la fin de l'appel, vous devez traiter les points suivants completed pour la jambe de l'agent. Il arrivera au même webhook d'événement, vous devez donc étendre le webhook d'événement avec demande de transfert à l'enquête NCCO. Pour ce faire, vous devez stocker les identifiants de l'utilisateur et de l'agent :
var userLegId = ''
var agentLegId = ''
app.get('/webhooks/answer', (request, response) => {
console.log('answer: ', request.query)
userLegId = request.query.uuid
console.log('userLegId: ', userLegId)
...
app.post('/webhooks/input', (request, response) => {
console.log('input:', request.body)
// creating the agent's leg and moving it to the same conversation
vonage.calls.create({
...
}, (error, response) => {
if (error) console.error('outbound error:', error)
if (response) {
agentLegId = response.uuid
console.log('agentLegId: ', agentLegId)
}
})
} else ...
Dans un scénario réel, vous devez mettre en place un cache pour stocker les paires d'identifiants de jambe utilisateur/agent. L'exemple de code présenté dans ce guide ne fonctionnera correctement que pour un seul appel simultané.
Étendez votre webhook d'événement avec la méthode d'appel de mise à jour de l'API REST avec NCCO en ligne avec talk et input pour déplacer la jambe de l'utilisateur vers la partie de l'enquête :
app.post('/webhooks/event', (request, response) => {
console.log('event:', request.body)
if (request.body.uuid == agentLegId && request.body.status == 'completed') {
vonage.calls.update(userLegId, {
action: 'transfer',
destination: {
type: 'ncco',
ncco: [ {
action: 'talk',
text: 'Please valuate quality of service by entering a digit, 1 to 5'
},
{
action: 'input',
type: [ 'dtmf' ],
dtmf: {
maxDigits: 1
},
eventUrl: [ `${request.protocol}://${request.get('host')}/webhooks/survey` ]
}
]
}
}, (err, res) => {
if (err) {
console.error('transfer error:', err)
} else {
console.log('transfer ok')
}
})
}
response.sendStatus(200)
})
Rédigez votre webhook d'enquête
Ajouter un webhook d'enquête pour imprimer les résultats :
app.post('/webhooks/survey', (request, response) => {
console.log('survey: ', request.body)
var phone = request.body.from
var date = request.body.timestamp
var score = request.body.dtmf.digits
console.log('[%s] User %s gave %d', date, phone, score)
const ncco = [
{
action: 'talk',
text: 'Thank you, good bye.'
}
]
response.json(ncco)
})
Créez votre serveur Node.js
Enfin, écrivez le code pour instancier votre serveur Node.js :
const port = 3000
app.listen(port, () => console.log(`Listening on port ${port}`))
Testez votre application
- Exécutez votre application Node.js en exécutant la commande suivante :
Appelez votre numéro Vonage à partir du "téléphone de l'utilisateur" et écoutez le message de bienvenue.
Ouvrez le clavier et appuyez sur 1 ou 2.
Répondre à l'appel entrant "téléphone de l'agent".
Raccrocher le téléphone de l'agent.
Écoutez le message de l'enquête et appuyez sur n'importe quelle touche du premier appareil.
Observez le journal de la console pour voir le résultat de l'enquête.
Dépannage
Si vous n'entendez pas le son de l'utilisateur et de l'agent, c'est peut-être parce que les deux jambes sont traitées à des endroits différents. Vous pouvez le déterminer en observant différents conversation_uuid_to dans la base de données transfer pour les jambes de l'utilisateur et de l'agent. Pour résoudre ce problème, essayez de configurer le SDK pour qu'il utilise un centre de données spécifique, comme décrit dans la section Guide de dépannage:
const options = {
apiHost: 'api-us-1.nexmo.com',
restHost: 'rest-us-1.nexmo.com'
}
const vonage = new Vonage({
apiKey: VONAGE_API_KEY,
apiSecret: VONAGE_API_SECRET
applicationId: VONAGE_APPLICATION_ID,
privateKey: VONAGE_APPLICATION_PRIVATE_KEY_PATH
}, options)
Conclusion
Avec l'API Voice de Vonage, vous pouvez doter votre solution de centre de contact existante d'un SVI d'une complexité logique quelconque, qui ne dépend que de votre cas d'utilisation cible et qui est virtuellement illimitée. Vous pouvez également créer votre propre solution à partir de zéro à l'aide de Voice API et de Client SDK. Le passage de la partie scénarisée de l'appel à la conversation en direct (et vice-versa) vous permet de combiner tous les cas d'utilisation des appels téléphoniques et de créer une expérience client transparente.
Quelle est la prochaine étape ?
- En savoir plus sur Flux d'appels avec l'API Voice
- Apprenez à créer un menu d'appel (Interactive Voice Response) à partir de zéro en suivant les étapes suivantes notre tutoriel
- Améliorer l'expérience des clients avec Reconnaissance de la paroleen remplacement ou en complément de la saisie DTMF ;
- Voir comment utiliser Enregistrement des appels pour des références futures et des analyses après l'appel ;
- Accédez directement aux médias grâce à WebSockets pour l'analyse en temps réel et l'intégration de l'IA.
- Vérifier Vonage AI vous proposant de faire construire un SVI ou un robot vocal par nos experts pour votre cas d'utilisation spécifique.