https://d226lax1qjow5r.cloudfront.net/blog/blogposts/build-an-interactive-voice-response-with-go/go_ivr_1200x627.png

Crear una respuesta de voz interactiva con Go

Publicado el February 11, 2021

Tiempo de lectura: 8 minutos

En tutoriales anteriores, aprendimos a hacer y recibir llamadas de voz con Go. Este tutorial te mostrará cómo construir un sistema interactivo de respuesta de voz usando Go y la Voice API.

Construiremos un servidor que responda al punto final webhook que Vonage envía cuando entra una llamada. Utilizando una aplicación de Vonage con capacidades de voz, enrutaremos las llamadas de voz entrantes a su destino. Por último, daremos instrucciones a la API para que solicite al usuario que introduzca datos en la llamada y, mediante Text-To-Speech, se los transmita.

Requisitos previos

Para seguir este tutorial, necesitas lo siguiente:

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Instalar Go SDK

Este proyecto utilizará el Go SDK de Vonage, que puedes instalar con el siguiente comando:

go get github.com/vonage/vonage-go-sdk

Escriba el código

Vonage verifica si has configurado un webhook al cual dirigir tu llamada de voz cuando recibe una en tu número virtual. Esta configuración de webhook es específica de tu aplicación, que crearás y configurarás más adelante en el tutorial.

Vamos a escribir el código que se encargará de las solicitudes a este webhook. Primero, crea un archivo llamado handle-user-input-with-dtmf.go y copia lo siguiente en este archivo:

package main



import (
    "encoding/json"
    "io/ioutil"
    "log"
    "net/http"

    "github.com/vonage/vonage-go-sdk/ncco"
)



type Dtmf struct {
    Digits    string
    Timed_out bool
}



type Response struct {
    Speech            []string
    Dtmf              Dtmf
    From              string
    To                string
    Uuid              string
    Conversation_uuid string
    Timestamp         string
}



func main() {



}

El código anterior importa las bibliotecas que utilizaremos a lo largo de este tutorial, también creamos dos nuevos structs que manejarán la entrada de las solicitudes webhook recibidas de Vonage. A continuación inicializamos nuestro proyecto con una función main() función.

Luego, necesitaremos crear un punto final de /webhooks/answer para indicar a las API de Vonage qué hacer con las llamadas entrantes. Para ello, necesitaremos crear un objeto de control de llamadas (NCCO) que primero le pida a la persona que llama que ingrese cualquier tecla, y luego el siguiente paso es grabar el ingreso de la persona que llama. Añade el siguiente código a tu proyecto encima de la función main() función:

func answer(w http.ResponseWriter, req *http.Request) {
    MyNcco := ncco.Ncco{}

    talk := ncco.TalkAction{Text: "Hello please press any key to continue."}
    MyNcco.AddAction(talk)

    inputAction := ncco.InputAction{EventUrl: []string{"https://demo.ngrok.io/webhooks/dtmf"}, Dtmf: &ncco.DtmfInput{MaxDigits: 1}}
    MyNcco.AddAction(inputAction)

    data, _ := json.Marshal(MyNcco)

    w.Header().Set("Content-Type", "application/json")
    w.Write(data)
}

El proyecto no tiene actualmente ninguna funcionalidad para saber qué hacer con la entrada de la persona que llama (puede haber notado la URL https://demo.ngrok.io/webhooks/dtmf en el paso anterior). Necesitaremos crear este endpoint en nuestro proyecto, este endpoint necesitará leer el cuerpo de la petición POST y, a continuación, leer la clave que la persona que llama envió en el paso anterior. Añade el siguiente ejemplo de código a tu proyecto:

func dtmf(w http.ResponseWriter, r *http.Request) {
    data, _ := ioutil.ReadAll(r.Body)
    var t Response
    json.Unmarshal(data, &t)

    MyNcco := ncco.Ncco{}
    talk := ncco.TalkAction{Text: "You pressed " + t.Dtmf.Digits + ", Goodbye"}
    MyNcco.AddAction(talk)

    responseData, _ := json.Marshal(MyNcco)
    w.Header().Set("Content-Type", "application/json")
    w.Write(responseData)
}

Es hora de instruir a la función main() para que sepa qué hacer con estas dos nuevas funciones que hemos creado. Necesitamos crear un servidor http que escuche en el puerto 3000y enrutar dos endpoints a esas funciones. Añade las tres líneas siguientes a tu función main() vacía.

http.HandleFunc("/webhooks/answer", answer)
    http.HandleFunc("/webhooks/dtmf", dtmf)

    http.ListenAndServe(":3000", nil)

Exponer el proyecto a Internet

Cuando entre una llamada telefónica, Vonage enviará una solicitud HTTP a tu URL de webhook preconfigurada. Tu aplicación Go debe ser accesible a Internet para recibirla, por lo que recomendamos usar Ngrok.

Inicie Ngrok con el siguiente comando:

ngrok http 3000

Copie la URL HTTPS que utiliza ngrok, ya que la necesitará más adelante. Será similar al ejemplo de abajo:

https://abc1234.ngrok.io -> http://localhost:8080

Nota Esta URL será diferente cada vez que ejecutes el comando si utilizas el plan gratuito. Así que tendrás que actualizar tu aplicación en el Panel de control cada vez que ejecute el comando.

En su handle-user-input-with-dtmf.go encuentre la línea inputAction := ncco.InputAction{EventUrl: []string{"https://demo.ngrok.io/webhooks/dtmf"}, dentro de la función answer() y sustituye "https://demo.ngrok.io" por la URL de ngrok. Recuerde mantener la parte /webhooks/dtmf de la línea.

Configurar los ajustes

Cree una aplicación en su Panel de control en "Tus Applications". Dale un nombre a tu nueva aplicación.

Añada funciones de Voice a la aplicación y configure las URL utilizando la URL de Ngrok que copió anteriormente. Para la URL de respuesta, utilice [paste ngrok url]/webhooks/answer y para la URL de eventos [paste ngrok url]/webhooks/event.

Ahora, haz clic en el botón Link junto a tu número virtual de Vonage recientemente adquirido para vincular tu nueva aplicación al número de teléfono.

Compraste un número virtual de Vonage, creaste una aplicación de Vonage y escribiste el código para manejar los eventos de webhook. ¡Es hora de probar tu proyecto!

Hora de probar

Hemos configurado nuestra aplicación de Vonage y nuestro número de teléfono para saber cómo gestionar las llamadas de voz entrantes. También hemos escrito un webhook dentro de handle-user-input-with-dtmf.go para manejar cualquier solicitud de llamada entrante. Por último, hemos agregado otro endpoint que activaremos una vez que la persona que llama haya seleccionado una tecla desde su teléfono.

Ahora es el momento de probar esta aplicación. Cuando ejecutes el comando de abajo, se iniciará un servidor web con este webhook escuchando la petición. Así que ejecute el siguiente comando para empezar a probar nuestra nueva aplicación:

go run handle-user-input-with-dtmf.go

Cuando llame a su número virtual, oirá la frase "Hola, pulse cualquier tecla para continuar". Cuando oigas esta frase, pulsa cualquiera de las teclas de tu teléfono. Una vez introducida, su llamada será redirigida a la /webhooks/dtmf URL del webhook, que leerá lo que ha introducido con la frase: "Ha pulsado [tecla aquí] Adiós". Sustituyendo [key here] por la tecla que hayas introducido.

Lecturas complementarias

Puede encontrar el código mostrado en este tutorial en el repositorio de repositorio de fragmentos de código Go.

A continuación encontrarás otros tutoriales que hemos escrito sobre el uso de nuestros servicios con Go:

Si tienes alguna pregunta, consejo o idea que quieras compartir con la comunidad, no dudes en entrar en nuestro espacio de trabajo espacio de trabajo comunitario Slack. Me encantaría saber de alguien que haya implementado este tutorial y cómo funciona su proyecto.

Compartir:

https://a.storyblok.com/f/270183/250x250/b052219541/greg-holmes.png
Greg HolmesAntiguos alumnos de Vonage

Antiguo educador de desarrolladores @Vonage. Procedente de PHP, pero no limitado a un solo lenguaje. Un ávido jugador y un entusiasta de Raspberry pi. A menudo se le encuentra practicando escalada en rocódromo.