AI vende pizza o cómo Voximplant se hace amigo de Dialogflow

Recientemente presentamos una solución comercial llamada Dialogflow Connector: un montón de Dialogflow de Google y nuestra nube Voximplant. El conector puede funcionar en lugar de un operador de centro de llamadas y aceptar pedidos complejos. Esto fue posible porque Dialogflow le permite alejarse del escenario IVR habitual, donde el cliente se ve obligado a nombrar palabras de un conjunto dado, a las que puede responder el menú interactivo. La plataforma de Google puede recibir de forma secuencial información de un cliente y reunirla, por ejemplo, para realizar un pedido en una tienda en línea. Probablemente ya haya escuchado la palabra de moda " llenar el espacio " , así que eso es todo. Los detalles lo esperan debajo del corte, como hicimos con el bot para pedir pizza: por analogía, puede cortar algo similar y alegrarse de que los tiempos del ascensor y "once" hayan pasado hace mucho ...


Número de teléfono


Para empezar, debe alquilar un número virtual al que el bot "responderá". Para hacer esto, en el panel de administración de Voximplant, en el menú "Números", haga clic en "Comprar número de teléfono".


En la nueva pantalla, coloque el interruptor en la posición "Números de prueba"; esto le permitirá alquilar un número virtual.


Los números virtuales son muy baratos y le permiten probar completamente cualquier solución en nuestra plataforma. Alquile una habitación y más ...

... crear un guión


Ahora necesitamos un escenario en la nube, el corazón de nuestra decisión. Es él quien recibirá la llamada, reconocerá el discurso y lo transferirá a Dialogflow. El script debe crearse dentro de la aplicación. En el menú de la izquierda, seleccione "Aplicaciones" , cree una nueva aplicación y asígnele un nombre.


Luego vaya a la pestaña "Scripts" en su aplicación y cree la suya propia haciendo clic en el signo más. Recuerde darle un nombre, como dialogflow.


¡Hora de escribir código!

Conectemos el módulo AI , que contiene los métodos y eventos para Dialogflow, así como el módulo de reconocimiento de voz y el reproductor . Declararemos las variables y la función complicada de redacción , que toma una cantidad de entrada (pizzas) y una matriz con las palabras ('margarita', 'margaritas', 'margaritas') y devuelve una palabra que coincide con el número de caso. Esto es necesario para que el bot no diga "4 margaritas", sino que emita correctamente "4 margaritas".

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

Ahora agregue el controlador para la llamada entrante y la función auxiliar startASR :

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

Cuando se produce el evento Connected , se llama a la función handleCallConnected . En realidad, todo el relleno tiene lugar en él:

  • se crea un objeto Dialogflow;
  • una voz sintetizada saluda al cliente y le ofrece hacer un pedido;
  • comienza el reconocimiento, el cliente hace un pedido;
  • las palabras del cliente se transfieren a Dialogflow, se produce un espacio de philling;
  • la voz sintetizada expresa el orden y la dirección del cliente;
  • el bot cuelga, la sesión se cierra.

Listado de funciones:

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


Queda muy poco. Vaya a la pestaña Enrutamiento -> "Crear". Aparecerá una ventana modal con un formulario. El nombre se puede dar por analogía: dialogflow-rule. Deje la máscara predeterminada y lo más importante es adjuntar el script de flujo de diálogo. Haga clic en "Crear regla", la ventana modal se cerrará.


Ahora debe adjuntar el número comprado a la aplicación. Para hacer esto, vaya a la sección "Números" dentro de su aplicación, haga clic en "Disponible" y luego - "Adjuntar" al lado del número seleccionado. Se abrirá una ventana modal, solo queda seleccionar la regla deseada aquí y hacer clic en "adjuntar".


Haz clic en "Guardar". Ahora el script sabe lo que necesita para responder a cualquier número marcado que haya alquilado. Dado que tenemos un número, esto es lo que necesitamos.

¡Genial, ahora todo está conectado y debería funcionar!

Agente de Dialogflow


En términos de Dialogflow, un agente es el bot. Ya hemos descrito en detalle cómo crear su agente y cómo comunicarse con él, pero esta vez sugerimos usar nuestra pieza de trabajo.

Debe registrarse en dialogflow.com y crear un nuevo agente. No olvides especificar el idioma ruso:


Por defecto, el agente no conoce una sola declaración (intenciones) y generalmente no puede hacer nada. Descargue los activos de nuestro agente y cárguelos en los suyos: para esto, en la configuración del agente, vaya a la pestaña "Exportar e importar" -> "Importar desde ZIP".


¡Ahora tienes un conjunto de dichos para pedir pizza! Puedes estudiarlos en la sección "Intentos"; tenga en cuenta que el agente tiene declaraciones auxiliares pizza.sizehelp y pizza.typehelp . Gracias a ellos, después de saludar a la pizzería, el cliente puede preguntar: "¿Qué tipo de pizza tiene?" Y el bot le dirá qué hay en el menú.

Verifique que la segunda versión de la API esté seleccionada en la configuración de la pestaña General.


Finalmente, descargue el JSON de su cuenta de servicio de Google; esto se hace con un par de clics .

Enlace del agente a la aplicación Voximplant


En el menú de la izquierda en su aplicación Voximplant, seleccione "Conector Dialogflow", haga clic en "Agregar", en el formulario modal que aparece, cargue JSON y haga clic en "Agregar" nuevamente.


Verá que el archivo JSON aparece en la lista, lo que significa que está adjunto a la aplicación.

Hecho El paquete Dialoglow + Voximplant está configurado, todos los eslabones de la cadena se ensamblan juntos.

En caso de que haya sido demasiado vago para hacer todos estos pasos, puede sentir nuestra demostración de pizzería:

  • vaya a http://demos05.voximplant.com/pizza/ ;
  • ingrese el número de teléfono (para Rusia será 7900 ...) y haga clic en "SIGUIENTE";
  • desde el número indicado marque +74999384952;
  • disfruta el milagro bot :)

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


All Articles