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 :

npm install express body-parser

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

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 :

ngrok http 3000

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

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.900.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 for0.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

  1. Exécutez votre application Node.js en exécutant la commande suivante :
node index.js
  1. Appelez votre numéro Vonage à partir du "téléphone de l'utilisateur" et écoutez le message de bienvenue.

  2. Ouvrez le clavier et appuyez sur 1 ou 2.

  3. Répondre à l'appel entrant "téléphone de l'agent".

  4. Raccrocher le téléphone de l'agent.

  5. Écoutez le message de l'enquête et appuyez sur n'importe quelle touche du premier appareil.

  6. 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.