Voice Journey

In diesem Leitfaden werden Sie das folgende Contact Center-Szenario implementieren:

  • Der Benutzer ruft Ihre Vonage-Nummer an,
  • Die Begrüßung wird vorgelesen, und der Benutzer wählt eine Option aus dem angebotenen Menü,
  • Der Benutzer ist mit einem Agenten verbunden,
  • Nachdem der Agent den Anruf beendet hat, wird der Benutzer zu einer Umfrage zur Kundenzufriedenheit weitergeleitet.

Für ein besseres Verständnis des Flusses, siehe Anruffluss.

Voraussetzungen

Um diesen Leitfaden zu vervollständigen, benötigen Sie:

  • A Vonage-Konto,
  • Die Vonage CLI installiert und eingerichtet werden,
  • ngrok - um Ihren Entwicklungs-Webserver über das Internet für die Server von Vonage zugänglich zu machen,
  • Node.JS installiert,
  • zwei Telefonanrufgeräte mit zugewiesenen PSTN-Nummern - "Benutzertelefon" und "Agententelefon", z. B. zwei Mobiltelefone oder eine Anwendung mit Anruffunktion wie Vonage Business app.

Installieren Sie die Abhängigkeiten

Installieren Sie die express Web Application Framework und body-parser Pakete:

npm install express body-parser

Erstellen einer Sprachanwendung

Verwenden Sie die CLI, um eine Voice API-Anwendung mit dem Webhaken der für die Beantwortung eines Anrufs Anruf auf Ihrer Vonage-Nummer (/webhooks/voice/answer) und die Protokollierung von Anrufereignissen (/webhooks/voice/event), beziehungsweise.

Diese Webhooks müssen von den Vonage-Servern aus zugänglich sein, daher werden Sie in dieser Anleitung die ngrok um Ihre lokale Entwicklungsumgebung Entwicklungsumgebung mit dem öffentlichen Internet zu verbinden. Dieser Artikel erklärt, wie man installiert und ausführen ngrok und konfigurieren Sie Vonage für das Senden von Anfragen.

Wenn Sie noch keine Anwendung haben, können Sie eine mit Hilfe der CLI erstellen

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

Der Befehl gibt eine Anwendungs-ID zurück (die Sie sich notieren sollten) und Ihre privaten Schlüsselinformationen (die Sie für die Zwecke dieses Leitfadens getrost ignorieren können).

ausführen. ngrok mit dem folgenden Befehl:

ngrok http 3000

Notieren Sie sich den temporären Hostnamen, den ngrok zur Verfügung stellt, und verwenden Sie es anstelle von example.com in folgendem Befehl:

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

Eine Telefonnummer kaufen

Um eingehende Anrufe zu Ihrer Anwendung zu bearbeiten, benötigen Sie eine Number von Vonage. Wenn Sie bereits eine Nummer haben, die Sie verwenden möchten, springen Sie zum nächsten Abschnitt, um die vorhandene Nummer mit Ihrer Anwendung zu verknüpfen.

Sie können die Vonage CLI um die Rufnummer zu kaufen:

Suche nach einer Number

Sie können eine Nummer über die Vonage CLI erwerben. Der folgende Befehl sucht nach einer gekauften Nummer (geben Sie einen alternativen zweistelligen Ländercode zum Kauf einer Nummer in einem anderen Land).

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.

Eine Nummer kaufen

Wenn Sie eine Nummer gefunden haben, mit der Sie zufrieden sind, können Sie diese über die vonage numbers buy Befehl:

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

Jetzt können Sie den Code für Ihre Anwendung schreiben.

Schreiben Sie Ihre Antwort Webhook

Wenn Vonage einen eingehenden Anruf auf Ihrer virtuellen Nummer empfängt, stellt es eine Anfrage an Ihre /webhooks/answer Route. Diese Route sollte ein HTTP GET Anfrage und geben eine Nexmo Call Control Objekt (NCCO) die Vonage mitteilt, wie der Anruf behandelt werden soll.

Ihr NCCO sollte die talk Aktion zur Begrüßung des Anrufers und die input Aktion zum Abrufen der Benutzer DTMF-Eingang (Taste gedrückt):

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)
})

Schreiben Sie Ihren Ereignis-Webhook

Implementieren Sie einen Webhook, der Anrufereignisse erfasst, so dass Sie den Lebenszyklus des Anrufs in der Konsole beobachten können:

app.post('/webhooks/voice/event', (request, response) => {
  console.log('event:', request.body)
  response.sendStatus(200);
})

Vonage macht eine POST Anfrage an diesen Endpunkt jedes Mal, wenn sich der Anrufstatus ändert.

Schreiben Sie Ihren Eingabe-Webhook

Die Ergebnisse der DTMF-Eingabe werden an die spezifische URL gesendet, die Sie in der input Aktion: /webhooks/input. Fügen Sie einen Webhook hinzu, um das Ergebnis zu verarbeiten und eine Benutzerinteraktion hinzuzufügen.

Im Falle einer erfolgreichen Erkennung sieht die Nutzlast der Anfrage wie folgt aus:

{
  "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"
}

Abrufen der Benutzereingaben aus dem dtmf.digits Array, um die ausgewählten Optionen zu ermitteln. Um sowohl den Benutzer als auch den Agenten der entsprechenden Abteilung zu verbinden, erstellen Sie einen ausgehenden Anruf an den Endpunkt des Agenten. In diesem Beispiel können Sie der Einfachheit halber eine Testtelefonnummer verwenden, zum Beispiel Ihre Handynummer. Im wirklichen Leben könnte der Endpunkt eine PSTN-Nummer sein oder SIP-Endpunkt um Ihre bestehende Telefonanlage oder Ihr Contact Center anzuschließen. Es könnte auch ein WebRTC-Client sein, wenn Sie Ihre Contact Center-Lösung von Grund auf neu entwickeln - die Vonage Client SDK bietet alles, was Sie zur Implementierung Ihrer eigenen Contact Center-Agentenanwendung benötigen.

Schließlich sollten beide Anrufe (Legs) in einen Konferenzraum (namens Gespräch). Zu diesem Zweck sollten Sie conversation Aktion mit der gleichen name sowohl für den Benutzeranruf (der eingehende Teil) als auch für den Agentenanruf (der ausgehende Teil). Um den Gesprächsnamen zu generieren, können Sie jede beliebige Methode zur Erzeugung einer eindeutigen ID verwenden, z. B. den aktuellen Zeitstempel.

Als Option können Sie Folgendes verwenden connect Aktion im NCCO, um den Benutzer mit dem Agenten zu verbinden. Der Unterschied besteht darin, dass bei connectwird das Gespräch sofort beendet, wenn einer der Gesprächsteilnehmer auflegt und nur noch eine Seite übrig ist. Es wäre also unmöglich, den Benutzer nach dem Anruf zur Umfrage weiterzuleiten, falls dies in Ihrem Fall nicht erforderlich ist, connect ist eine etwas praktischere Option. Wenn Sie möchten, dass der Benutzer noch verbunden ist, nachdem der Agent den Anruf beendet hat, wählen Sie conversation wie im folgenden Beispiel gezeigt.

Fügen Sie den Code für den Eingabe-Callback hinzu:

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)
})  

Umfrage hinzufügen NCCO

Um die Umfrage zur Kundenzufriedenheit am Ende des Anrufs durchzuführen, sollten Sie folgende Schritte durchführen completed Ereignis für das Bein des Agenten. Es wird an demselben Ereignis-Webhook ankommen, daher sollten Sie den Ereignis-Webhook erweitern mit Versetzungsantrag zur Umfrage NCCO. Dazu müssen Sie die Beinamen des Benutzers und des Agenten speichern:

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

In einem realen Szenario sollten Sie einen Cache implementieren, um die Paare von Benutzer-/Agentenkennungen zu speichern. Der in diesem Leitfaden gezeigte Beispielcode funktioniert nur bei einem gleichzeitigen Aufruf ordnungsgemäß.

Erweitern Sie Ihren Ereignis-Webhook um eine REST-API-Aktualisierungsaufrufmethode mit Inline-NCCO mit talk und input Aktionen, um das Bein des Benutzers zum Umfrageteil zu bewegen:

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)
})

Schreiben Sie Ihren Umfrage-Webhook

Fügen Sie einen Umfrage-Webhook hinzu, um die Ergebnisse zu drucken:

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)
})

Erstellen Sie Ihren Node.js-Server

Schreiben Sie schließlich den Code, um Ihren Node.js-Server zu instanziieren:

const port = 3000
app.listen(port, () => console.log(`Listening on port ${port}`))

Testen Sie Ihre Anwendung

  1. Führen Sie Ihre Node.js-Anwendung aus, indem Sie den folgenden Befehl ausführen:
node index.js
  1. Rufen Sie Ihre Vonage-Nummer vom "Benutzertelefon" aus an und hören Sie sich die Begrüßungsansage an.

  2. Öffnen Sie die Wähltastatur und drücken Sie 1 oder 2.

  3. Beantworten Sie den eingehenden Anruf "Agententelefon".

  4. Legen Sie am Telefon des Agenten auf.

  5. Hören Sie sich die Umfragenachricht an und drücken Sie eine beliebige Taste am ersten Gerät.

  6. Beobachten Sie das Konsolenprotokoll, um das Umfrageergebnis zu sehen.

Fehlersuche

Wenn Sie den Benutzer- und den Agententon nicht hören, liegt das möglicherweise daran, dass die beiden Teile an unterschiedlichen Stellen verarbeitet werden. Sie können dies feststellen, indem Sie verschiedene conversation_uuid_to Werte in der transfer Ereignisse für Benutzer- und Agentenbeine. Um dies zu beheben, versuchen Sie, das SDK so zu konfigurieren, dass ein bestimmtes Datenzentrum verwendet wird, wie im Abschnitt Anleitung zur Fehlersuche:

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)

Schlussfolgerung

Mit der Vonage Voice API können Sie Ihre bestehende Contact Center-Lösung mit IVR von beliebiger logischer Komplexität ausstatten, die nur von Ihrem Zielanwendungsfall abhängt und praktisch unbegrenzt ist. Oder Sie können Ihre eigene Lösung von Grund auf mit der Voice API und Client SDK. Durch den Wechsel zwischen dem geskripteten Teil des Anrufs und dem Live-Gespräch (und zurück) können Sie beliebige Anwendungsfälle für Telefonanrufe kombinieren und ein nahtloses Kundenerlebnis schaffen.

Wie geht es weiter?

  • Erfahren Sie mehr über Anruffluss mit der Voice API
  • Erfahren Sie, wie Sie ein Anrufmenü (Interactive Voice Response) von Grund auf neu erstellen können, indem Sie unsere Anleitung
  • Verbessern Sie das Kundenerlebnis mit Erkennung von Spracheals Alternative oder zusammen mit der DTMF-Eingabe;
  • Sehen Sie, wie man Aufzeichnung von Anrufen für zukünftige Referenzen und Analysen nach dem Anruf;
  • Erhalten Sie direkten Zugang zu den Medien mit WebSockets für Echtzeit-Analysen und KI-Integration.
  • Siehe Vonage AI das Angebot, IVR oder Voice Bot von unseren Experten für Ihren spezifischen Anwendungsfall erstellen zu lassen.