AI verkauft Pizza oder wie Voximplant sich mit Dialogflow anfreundet

Wir haben kürzlich eine Geschäftslösung namens Dialogflow Connector vorgestellt: eine Reihe von Dialogflow von Google und unsere Voximplant-Cloud. Der Connector kann anstelle eines Call-Center-Betreibers arbeiten und komplexe Bestellungen annehmen. Dies wurde möglich, weil Sie mit Dialogflow vom üblichen IVR-Szenario abweichen können, bei dem der Client gezwungen ist, Wörter aus einem bestimmten Satz zu benennen, auf die das interaktive Menü reagieren kann. Die Google-Plattform kann nacheinander Eingaben von einem Kunden empfangen und zusammenfassen, um beispielsweise eine Bestellung in einem Online-Shop zu erstellen. Sie haben wahrscheinlich bereits das Schlagwort " Slot Filling " gehört. Details warten unter dem Schnitt auf Sie, so wie wir den Bot für die Bestellung von Pizza gemacht haben - analog können Sie etwas Ähnliches zerschlagen und froh sein, dass die Zeiten von Aufzug und "elf" längst vorbei sind ...


Telefonnummer


Zunächst sollten Sie eine virtuelle Nummer mieten, auf die der Bot „antwortet“. Klicken Sie dazu im Voximplant-Administrationsbereich im Menü "Nummern" auf "Telefonnummer kaufen".


Stellen Sie den Schalter auf dem neuen Bildschirm auf "Testnummern" - damit können Sie eine virtuelle Nummer mieten.


Virtuelle Nummern sind sehr billig und ermöglichen es Ihnen, jede Lösung auf unserer Plattform vollständig zu testen. Mieten Sie ein Zimmer und mehr ...

... ein Skript erstellen


Jetzt brauchen wir ein Cloud-Szenario, das Herzstück unserer Entscheidung. Er wird den Anruf entgegennehmen, die Sprache erkennen und an Dialogflow weiterleiten. Das Skript muss in der Anwendung erstellt werden. Wählen Sie im linken Menü "Anwendungen" , erstellen Sie eine neue Anwendung und geben Sie ihr einen Namen.


Gehen Sie dann in Ihrer Anwendung zur Registerkarte "Skripte" und erstellen Sie Ihre eigenen, indem Sie auf das Plus klicken. Denken Sie daran, ihm einen Namen zu geben, z. B. dialogflow.


Zeit, Code zu schreiben!

Verbinden wir das AI- Modul - es enthält die Methoden und Ereignisse für Dialogflow - sowie das Spracherkennungsmodul und den Player . Wir deklarieren die Variablen und die knifflige Wortendfunktion , die eine Eingabe (Pizza) und ein Array mit den Wörtern ('Margarita', 'Margaritas', 'Margaritas') akzeptiert und ein Wort zurückgibt , das der Fallnummer entspricht. Dies ist notwendig, damit der Bot nicht "4 Margaritas" sagt, sondern korrekt "4 Margaritas" ausgibt.

require(Modules.AI); require(Modules.ASR); require(Modules.Player); let mycall = null, voice = Language.Premium.RU_RUSSIAN_YA_FEMALE, account_name = "", dialed_number = "", caller_id = "", flow, lastText = '', player function wordend(num, words) { return words[ ((num=Math.abs(num%100)) > 10 && num < 15 || (num%=10) > 4 || num === 0) + (num !== 1) ]; } 

Fügen Sie nun den Handler für den eingehenden Anruf und die StartASR-Hilfsfunktion hinzu :

 VoxEngine.addEventListener(AppEvents.CallAlerting, (e) => { mycall = e.call; mycall.addEventListener(CallEvents.Connected, handleCallConnected); account_name = e.toURI.substring(e.toURI.indexOf('.') + 1); account_name = account_name.substring(0, account_name.indexOf('.')); dialed_number = e.destination; caller_id = e.callerid; mycall.answer(); }); function startASR() { mycall.removeEventListener(CallEvents.PlaybackFinished, startASR); mycall.sendMediaTo(flow); } 

Wenn das Ereignis Connected auftritt, wird die Funktion handleCallConnected aufgerufen . Eigentlich findet die ganze Füllung darin statt:

  • Ein Dialogflow-Objekt wird erstellt.
  • eine synthetisierte Stimme begrüßt den Kunden und bietet an, eine Bestellung aufzugeben;
  • Anerkennung beginnt, der Kunde gibt eine Bestellung auf;
  • Client-Wörter werden an Dialogflow übertragen, es tritt ein Philling-Slot auf.
  • synthetisierte Sprachstimmen die Reihenfolge und Adresse des Kunden;
  • Der Bot legt auf, die Sitzung wird geschlossen.

Funktionsliste:

handleCallConnected
function handleCallConnected(e) {
flow = AI.createDialogflow({
lang: "ru"
});
if (AI.Events.DialogflowResponse !== undefined)
flow.addEventListener(AI.Events.DialogflowResponse, (event) => {
if (event.response.queryResult !== undefined) {
let result = event.response.queryResult
if (result.queryText === undefined) {
if (result.languageCode !== undefined) startASR();
return
}
if (result.fulfillmentText !== undefined) {
try {
player = VoxEngine.createTTSPlayer(result.fulfillmentText, voice)
player.addMarker(-500)
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR)
player.sendMediaTo(mycall)
} catch (err) {}
if (result.allRequiredParamsPresent == true &&
result.outputContexts !== undefined &&
result.parameters.PizzaType != undefined) {
let msg = " ";
for (let k = 0; k < result.parameters.PizzaType.length; k++) {
let count = result.parameters.count[k] !== undefined ? result.parameters.count[k] : 1
switch (count) {
case 1:
msg += " ";
break;
case 2:
msg += " ";
break;
default:
msg += count + " ";
break;
}
if (result.parameters.PizzaSize[k] !== undefined) {
switch (result.parameters.PizzaSize[k]) {
case "small":
msg += wordend(count, ['', '', '']);
break;
case "medium":
msg += wordend(count, ['', '', '']);
break;
case "large":
msg += wordend(count, ['', '', '']);
break;
}
}
msg += " "
switch (result.parameters.PizzaType[k]) {
case "margarita":
msg += wordend(count, ['', '', '']);
break;
case "fourcheese":
msg += wordend(count, ['', '', '']) + " ";
break;
case "vegetarian":
msg += wordend(count, [' ', ' ', ' ']);
break;
case "pepperoni":
msg += wordend(count, ['', '', '']) + " ";
break;
case "cheese":
msg += wordend(count, [' ', ' ', ' ']);
break;
case "chicken":
msg += wordend(count, ['', '', '']) + " ";
break;
}
if (k == result.parameters.PizzaType.length - 1) msg += " , "
else msg += " ";
}
msg = msg.slice(0, msg.length - 2);
if (result.parameters.time !== undefined && result.parameters.time != "") {
let time = new Date(result.parameters.time),
local = time.toTimeString()
local = local.split(":")
time = local[0] + ":" + local[1]
msg += ". " + time
}
if (result.parameters.deliveryaddress !== undefined) msg += ". " + result.parameters.deliveryaddress
msg += ". ?";
player.stop()
player = VoxEngine.createTTSPlayer(msg, voice)
player.addMarker(-500)
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR)
player.sendMediaTo(e.call)
} else {
player.stop()
lastText = result.fulfillmentText
player = VoxEngine.createTTSPlayer(result.fulfillmentText, voice)
if (result.action == "pizzaorder.pizzaorder-yes") {
player.addEventListener(PlayerEvents.PlaybackFinished, () => mycall.hangup())
player.sendMediaTo(e.call)
} else {
player.addMarker(-500)
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR)
player.sendMediaTo(e.call)
}
}
}
}
})
player = VoxEngine.createTTSPlayer("! , !", voice);
player.addMarker(-500);
player.addEventListener(PlayerEvents.PlaybackMarkerReached, startASR);
player.sendMediaTo(e.call);
mycall.record();
mycall.addEventListener(CallEvents.Disconnected, (event) => {
VoxEngine.terminate();
})
}


Es ist sehr wenig übrig. Gehen Sie zur Registerkarte Routing -> "Erstellen". Ein modales Fenster mit einem Formular wird angezeigt. Der Name kann analog angegeben werden - Dialogflussregel. Belassen Sie die Standardmaske und das Wichtigste ist, das Dialogflow-Skript anzuhängen. Klicken Sie auf "Regel erstellen". Das modale Fenster wird geschlossen.


Jetzt müssen Sie die gekaufte Nummer an die Anwendung anhängen. Gehen Sie dazu in Ihrer Anwendung zum Abschnitt "Nummern", klicken Sie auf "Verfügbar" und dann auf "Anhängen" neben der ausgewählten Nummer. Ein modales Fenster wird geöffnet, es bleibt nur die gewünschte Regel hier auszuwählen und auf "Anhängen" zu klicken.


Klicken Sie auf "Speichern". Jetzt weiß das Skript, was es benötigt, um auf eine von Ihnen gemietete gewählte Nummer zu antworten. Da wir eine Nummer haben, brauchen wir diese.

Großartig, jetzt ist alles miteinander verbunden und sollte funktionieren!

Dialogflow Agent


In Bezug auf Dialogflow ist ein Agent der Bot. Wir haben bereits ausführlich beschrieben, wie Sie Ihren Agenten erstellen und mit ihm kommunizieren. Diesmal empfehlen wir jedoch die Verwendung unseres Werkstücks.

Sie müssen sich auf dialogflow.com registrieren und einen neuen Agenten erstellen. Vergessen Sie nicht, die russische Sprache anzugeben:


Standardmäßig kennt der Agent keine einzelne Anweisung (Absichten) und kann im Allgemeinen nichts tun. Laden Sie die Assets unseres Agenten herunter und laden Sie sie in Ihre hoch. Gehen Sie dazu in den Einstellungen des Agenten auf die Registerkarte "Exportieren und Importieren" -> "Aus ZIP importieren".


Jetzt haben Sie eine Reihe von Sprüchen für die Bestellung von Pizza! Sie können sie im Abschnitt "Absichten" studieren. Beachten Sie, dass der Agent zusätzliche Anweisungen hat: pizza.sizehelp und pizza.typehelp . Dank ihnen kann der Kunde nach der Begrüßung der Pizzeria fragen: „Welche Art von Pizza haben Sie?“ Der Bot teilt Ihnen mit, was auf der Speisekarte steht.

Stellen Sie sicher, dass die zweite Version der API in den Einstellungen auf der Registerkarte Allgemein ausgewählt ist.


Laden Sie abschließend den JSON Ihres Google Service-Kontos herunter - dies erfolgt mit wenigen Klicks .

Bindemittel an Voximplantat-Anwendung


Wählen Sie im Menü links in Ihrer Voximplant-Anwendung "Dialogflow-Connector" aus, klicken Sie auf "Hinzufügen", laden Sie in der angezeigten modalen Form JSON und klicken Sie erneut auf "Hinzufügen".


Sie werden sehen, dass die JSON-Datei in der Liste angezeigt wird, was bedeutet, dass sie an die Anwendung angehängt ist.

Fertig! Das Dialoglow + Voximplant-Bündel ist konfiguriert, alle Glieder der Kette sind zusammengebaut.

Falls Sie zu faul waren, um all diese Schritte auszuführen, können Sie unsere Pizzeria-Demo spüren:

  • Gehen Sie zu http://demos05.voximplant.com/pizza/ .
  • Geben Sie die Telefonnummer ein (für Russland ist es 7900 ...) und klicken Sie auf "WEITER".
  • von der angegebenen Nummer wählen Sie +74999384952;
  • genieße den Wunderbot :)

Source: https://habr.com/ru/post/de412663/


All Articles