Erweiterte IVR

In dieser Anleitung erstellen Sie einen Bot, der einen eingehenden Telefonanruf beantwortet. Der Bot wird nach Ihrem Standort fragen und Ihnen die die aktuellen Wetterbedingungen mitteilen. Sie implementieren dies mithilfe der express Web Anwendungsrahmen, Weatherstack API und Vonage Automatische Spracherkennung (ASR) Funktion.

Voraussetzungen

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

  • A Vonage-Konto
  • Die Vonage CLI installiert und eingerichtet
  • ngrok - um Ihren Entwicklungs-Webserver über das Internet für die Server von Vonage zugänglich zu machen
  • Node.JS installiert

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.

Weatherstack Account anmelden

In dieser Anleitung werden Sie Weatherstack API verwenden, um Wetterinformationen zu erhalten. Um eine Anfrage zu stellen, müssen Sie sich einschreiben für einen kostenlosen Account, um den API-Schlüssel zu erhalten.

Schreiben Sie Ihre Antwort Webhook

Wenn Vonage einen eingehenden Anruf auf Ihrer virtuellen Nummer empfängt, stellt es eine Anfrage an Ihre /webhooks/voice/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, um mit dem Zuhören zu beginnen:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const http = require('http')

app.use(bodyParser.json())

app.get('/webhooks/voice/answer', (request, response) => {

  const ncco = [{
      action: 'talk',
      text: 'Thank you for calling Weather Bot! Where are you from?'
    },
    {
      action: 'input',
      eventUrl: [
        `${request.protocol}://${request.get('host')}/webhooks/asr`],
      type: [ "speech" ]
    },
    {
      action: 'talk',
      text: 'Sorry, I don\'t hear you'
    }
  ]

  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/events', (request, response) => {
  console.log(request.body)
  response.sendStatus(200);
})

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

Schreiben Sie Ihren ASR-Webhook

Die Ergebnisse der Spracherkennung werden an die spezifische URL gesendet, die Sie in der Eingabeaktion festgelegt haben: /webhooks/asr. Fügen Sie einen Webhook, um das Ergebnis zu verarbeiten und eine Benutzerinteraktion hinzuzufügen.

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

{
  "speech": {
    "timeout_reason": "end_on_silence_timeout",
    "results": [
      {
        "confidence": 0.78097206,
        "text": "New York"
      }
    ]
  },
  "dtmf": {
    "digits": null,
    "timed_out": false
  },
  "from": "442039834429",
  "to": "442039061207",
  "uuid": "abfd679701d7f810a0a9a44f8e298b33",
  "conversation_uuid": "CON-64e6c8ef-91a9-4a21-b664-b00a1f41340f",
  "timestamp": "2020-04-17T17:31:53.638Z"
}

Sie können die confidence Element der speech.results Array für die weitere Analyse. Um die Daten zu den Wetterbedingungen zu erhalten, machen Sie eine HTTP GET Anfrage an die folgende URL:

Hier, access_key ist Ihr Weatherstack-API-Schlüssel und query ist der Ort, den der Benutzer gesagt hat (oder zumindest was man von ihm erwartet). Weatherstack liefert eine Menge interessanter Daten im Antwortkörper:

{
  "request": {
    "type": "City",
    "query": "New York, United States of America",
    "language": "en",
    "unit": "m"
  },
  "location": {
    "name": "New York",
    "country": "United States of America",
    "region": "New York",
    "lat": "40.714",
    "lon": "-74.006",
    "timezone_id": "America/New_York",
    "localtime": "2020-04-17 13:33",
    "localtime_epoch": 1587130380,
    "utc_offset": "-4.0"
  },
  "current": {
    "observation_time": "05:33 PM",
    "temperature": 9,
    "weather_code": 113,
    "weather_icons": [
      "http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png"
    ],
    "weather_descriptions": [
      "Sunny"
    ],
    "wind_speed": 15,
    "wind_degree": 250,
    "wind_dir": "WSW",
    "pressure": 1024,
    "precip": 0,
    "humidity": 28,
    "cloudcover": 0,
    "feelslike": 7,
    "uv_index": 5,
    "visibility": 16,
    "is_day": "yes"
  }
}

In der Anwendung werden Sie Parameter wie description ("Sunny") und temperature. Es wäre schön, eine Wettervorhersage Wettervorhersage als die aktuelle Temperatur zu erhalten, aber da der kostenlose Weatherstack Account nur die current Bedingungen - das ist es, was Sie verwenden werden.

Sobald Sie die Antwort von Weatherstack erhalten haben, müssen Sie ein neues NCCO mit der Gesprächsaktion "Heute in New York: es ist sonnig, 9 Grad Celsius".

Der folgende Code zeigt, wie Sie den ASR-Callback behandeln und Ihren NCCO zurückgeben:

app.post('/webhooks/asr', (request, response) => {

  console.log(request.body)

  if (request.body.speech.results) {

    const city = request.body.speech.results[0].text

    http.get(
      'http://api.weatherstack.com/current?access_key=WEATHERSTACK_API_KEY&query=' +
      city, (weatherResponse) => {
        let data = '';

        weatherResponse.on('data', (chunk) => {
          data += chunk;
        });

        weatherResponse.on('end', () => {
          const weather = JSON.parse(data);

          console.log(weather);

          let location = weather.location.name
          let description = weather.current.weather_descriptions[0]
          let temperature = weather.current.temperature          

          console.log("Location: " + location)
          console.log("Description: " + description)
          console.log("Temperature: " + temperature)

          const ncco = [{
            action: 'talk',
            text: `Today in ${location}: it's ${description}, ${temperature}°C`
          }]

          response.json(ncco)

        });

      }).on("error", (err) => {
      console.log("Error: " + err.message);
    });

  } else {

    const ncco = [{
      action: 'talk',
      text: `Sorry I don't understand you.`
    }]

    response.json(ncco)
  }

})

Sie könnten dem Bot eine zusätzliche Logik hinzufügen, z. B. um die Temperatur in Fahrenheit umzurechnen, wenn der angegebene Ort in den den USA liegt. Fügen Sie dazu dieses Codeschnipsel hinzu, bevor Sie den NCCO erstellen:

if (weather.location.country == 'United States of America') {
  temperature = Math.round((temperature * 9 / 5) + 32) + '°F'
} else {
  temperature = temperature + '°C'
}

und vergessen Sie nicht, das Grad-Symbol aus dem Nachrichtentext zu entfernen, da es nun in den temperature variabler Wert:

text: `Today in ${location}: it's ${description}, ${temperature}`

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 an und hören Sie sich die Begrüßungsansage an.

  2. Sagen Sie den Namen Ihrer Stadt.

  3. Hören Sie sich Ihre aktuellen Wetterbedingungen an.

Schlussfolgerung

In diesem Handbuch haben Sie eine Anwendung erstellt, die die Voice API verwendet, um mit einem Anrufer zu interagieren, indem sie ihm eine Frage stellt und mit einer Sprachnachricht antwortet.

Der von Ihnen erstellte Bot war in der Lage, dem Anrufer zuzuhören und mit einigen relevanten Informationen zu antworten. Sie können ihn als Basis für Ihre IVR- oder Kundenselbstbedienungsanwendung verwenden, indem Sie eine entsprechende Geschäftslogik für Ihren Fall und die die von Ihnen verwendeten Dienste.

Wie Sie sehen, ist die automatische Spracherkennung (ASR) eine mühelose Möglichkeit, einen Sprachbot im Dialogstil oder IVR ( Interactive Voice Response)/IVA (Interactive Voice Assistant) schnell zu implementieren. Wenn Sie mehr Flexibilität oder fast Echtzeit-Interaktion benötigen Echtzeit-Interaktion benötigen, probieren Sie unser WebSockets Funktion, die extrem leistungsfähig ist und kann einige sehr anspruchsvolle Anwendungsfälle ermöglichen, wie z. B. künstliche Intelligenz, Analyse und Transkription von Audioanrufen.

Wie geht es weiter?

Hier sind einige weitere Vorschläge für Ressourcen, die Sie als nächsten Schritt nach diesem Leitfaden nutzen könnten: