https://d226lax1qjow5r.cloudfront.net/blog/blogposts/play-an-audio-file-into-a-voice-call-with-go/go_audioincall1200x600.png

Reproducir un archivo de audio en una llamada de voz con Go

Publicado el January 14, 2021

Tiempo de lectura: 8 minutos

En tutoriales anteriores, aprendimos a hacer y recibir llamadas de Voz con Go.

Este tutorial le llevará a través del proceso de recibir una llamada de voz y luego reproducir un archivo de audio en la llamada, utilizando Go y la Voice API.

Escribiremos un servidor que responda a los webhook endpoints que Vonage envía cuando entra una llamada. Luego crearemos una aplicación de Vonage con capacidades de voz, para enrutar las llamadas de voz entrantes a su destino. Por último, instruiremos a la API para que transmita el archivo de audio en la llamada activa.

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.

Escriba el código

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

Escribamos el código que manejará cualquier petición a este webhook. Crea un archivo llamado play-an-audio-stream-into-a-call.go y copia lo siguiente en este archivo:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "os"

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

func answer(w http.ResponseWriter, req *http.Request) {
    uuid, _ := req.URL.Query()["uuid"]
    from, _ := req.URL.Query()["from"]

    MyNcco := ncco.Ncco{}

    talk := ncco.TalkAction{Text: "Thank you for calling."}
    MyNcco.AddAction(talk)

    conversation := ncco.ConversationAction{Name: from[0], StartOnEnter: "false"}
    MyNcco.AddAction(conversation)

    fmt.Println("uuid is :" + uuid[0])

    data, _ := json.Marshal(MyNcco)

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

func main() {
    http.HandleFunc("/webhooks/answer", answer)
    http.ListenAndServe(":3000", nil)
}

En primer lugar, hemos creado una nueva aplicación Go con una única URL webhook, /webhooks/answerpara manejar cualquier llamada entrante. La aplicación también se ejecuta como un servidor a través de la línea http.ListenAndServe(":3000", nil), para asegurarnos de que se ejecuta hasta que deseemos detener el servidor.

La función answer crea dos objetos de control de llamada (OCN). El primero es TalkActionque transmite una cadena predeterminada a la persona que está al teléfono. El segundo añade el tramo de llamada a una multiconferencia, que mantiene la línea y nos permite pasar un flujo de audio a la llamada.

A continuación, tenemos que añadir la funcionalidad para reproducir un archivo de audio en la llamada activa. Esto se hará mediante una URL definida como /play-audio. Así que por encima de func main() { añada el siguiente código:

func playAudio(w http.ResponseWriter, req *http.Request) {
    godotenv.Load("../.env")
    uuid, _ := req.URL.Query()["uuid"]

    privateKey, _ := ioutil.ReadFile(os.Getenv("VONAGE_APPLICATION_PRIVATE_KEY_PATH"))
    auth, _ := vonage.CreateAuthFromAppPrivateKey(os.Getenv("VONAGE_APPLICATION_ID"), privateKey)
    client := vonage.NewVoiceClient(auth)

    result, _, _ := client.PlayAudioStream(uuid[0],
        "https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3",
        vonage.PlayAudioOpts{},
    )

    // or to stop the audio
    // result, _, _:= client.StopAudioStream(os.Getenv(uuid[0]))
    fmt.Println("Update message: " + result.Message)
}

y por debajo: http.HandleFunc("/webhooks/answer", answer) añade lo siguiente:

http.HandleFunc("/play-audio", playAudio)

Ahora hemos creado un webhook para manejar la respuesta de una llamada entrante a tu número virtual de Vonage. Una vez respondida, verás en tu terminal la llamada uuidy un ID específico para esa llamada de Voz. Antes de probar, necesitas exponer tu proyecto a Internet y configurar tu Account en el Dashboard. Así que pasemos a exponer el proyecto a internet.

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.

Configurar los ajustes

Cree una aplicación en su Panel de control en "Tus Applications". Dé un nombre a su nueva aplicación y seleccione "Generar clave pública y privada". private.key archivo. Mueva este archivo para que esté junto al código que ha creado.

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.

Con toda la nueva información que has recopilado, crea un archivo .env en el directorio de tu proyecto y añade las siguientes variables:

VONAGE_APPLICATION_PRIVATE_KEY_PATH= VONAGE_APPLICATION_ID=

Actualiza las variables anteriores para que tengan los valores correctos. Por ejemplo, la primera debe tener private.key y la segunda necesita tener su application ID que aparece en la página del panel de control del desarrollador cuando creó su aplicación.

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 play-an-audio-stream-into-a-call.go para manejar cualquier solicitud de llamada entrante. Por último, hemos añadido otro endpoint que se activará manualmente para reproducir el archivo de audio en la llamada especificada.

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 play-an-audio-stream-into-a-call.go

Cuando llame a su número virtual, oirá las palabras "Gracias por llamar". Parecerá como si no ocurriera nada más, excepto que la llamada continúa.

Ahora abre tu navegador y teclea http://localhost:3000/play-audio?uuid=[paste your uuid here] sustituyendo [paste your uuid here] por la uuid que aparecía en tu Terminal cuando realizaste la llamada. Al introducir esta URL, oirás el flujo de audio reproducido en tu llamada. Una vez terminado, finaliza la llamada.

Ahora creaste una aplicación de Vonage, alquilaste un número de teléfono virtual y escribiste algo de código para manejar las llamadas de webhook a este nuevo número. Cuando llamas al número, tu código ahora agrega un mensaje de texto a voz a la llamada para que lo escuches. A continuación, se activa el evento para reproducir el archivo de audio en la llamada y escucharlo en el teléfono.

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.