https://d226lax1qjow5r.cloudfront.net/blog/blogposts/text-speech-prompt-calls-using-python-aws-lambda-dr/ttsblog.jpeg

Texto a voz con llamadas de aviso, utilizando Python en AWS Lambda

Publicado el May 12, 2021

Tiempo de lectura: 5 minutos

La Nexmo Voice API ofrece una gran flexibilidad en los escenarios de llamada que puede activar, sin embargo para ello a menudo necesita realizar varias interacciones con la API. Para algunos escenarios, es posible que desee tener una sola llamada a la API desde su lógica de negocio que invoque una serie de interacciones con la Voice API. Este es un escenario ideal para construir una aplicación sin servidor que luego puedes llamar y dejar que se ocupe de las interacciones con la Voice API.

En este ejemplo le mostraremos cómo realizar una llamada de texto a voz que reproducirá un mensaje a un destinatario y luego le pedirá que introduzca algunos dígitos en su teclado, tal vez para confirmar un número PIN, a continuación, obtendrá una devolución de llamada a una URL que especifique una vez que la interacción se ha completado. Es muy similar a la obsoleta TTS Prompt API que ofrecía Nexmo, pero con mayor flexibilidad.

Actualmente, la aplicación llamará a un número, reproducirá un mensaje inicial y luego esperará a que el usuario introduzca el pin que especifiques, si se equivocan se les reproduce un mensaje de error y luego se les permite volver a intentarlo, se permiten hasta 3 intentos aunque esto podría editarse en tu código.

Si no introducen el PIN correcto al tercer intento, la llamada finalizará sin ningún mensaje.

Si introducen correctamente el PIN, se les reproducirá otro mensaje y, a continuación, finalizará la llamada. Una vez finalizada la llamada, recibirá una devolución de llamada a su webhook con el ID de transacción de la llamada y el resultado de los intentos de introducción del PIN.

Ver el código fuente en GitHub

Requisitos previos

En este tutorial:

  • Necesita una AWS Account (puede ejecutarlo en la capa gratuita de Lambda)

  • Disponer de la herramienta AWS CLI y Chalice instalados y configurados en su máquina

  • Cree una Aplicación Nexmo Voice y guarde la clave privada en un archivo local llamado private.keyjunto con el ID de la aplicación.

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.

Despliegue

Para implementar la función en su propia cuenta de AWS:

En primer lugar, clone el repositorio Git en su máquina local:

git clone https://github.com/nexmo-community/voice-ttsprompt-lambda.git

Cambia a la carpeta:

cd voice-ttsprompt-lambda

Implemente la función en AWS:

chalice deploy

Usted verá la siguiente salida como su función se despliega, confirme 'Y' que desea agregar la política de ejecución

Initial creation of lambda function.
Updating IAM policy.

The following actions will be added to the execution policy:

dynamodb:PutItem
logs:PutLogEvents
dynamodb:CreateTable
logs:CreateLogStream
dynamodb:GetItem
logs:CreateLogGroup

Would you like to continue? [Y/n]: y
Creating deployment package.
Initiating first time deployment...
Deploying to: api
https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/

La última línea es la URL base de su función recién desplegada, tome nota de esto, puede recuperarlo en cualquier momento con el comando chalice url

Configurar

Es muy poco lo que hay que configurar, ya que Chalice se encarga de la mayor parte de la configuración de AWS en la primera implementación. Sin embargo, tendrá que crear la tabla DynamoDB que se utiliza para almacenar el estado de la llamada. Para ello, debe realizar una solicitud HTTP GET a la URL /setup URL de la función.

Invocando

Ahora puede invocar su nueva función con una única petición HTTP POST a su URL base con /call al final. Necesita pasar los siguientes parámetros

Parameter Value Example
to The number to be called in e.164 format 14155550100
from The Nexmo number on your account to use for CallerID 14155550101
text The initial message played to the called party "Enter your pin"
pin_code The PIN that the user should enter 1234
callback The URL on your server where the result should be sent http://example.com/callback
callback_method The HTTP method used for your callback webhook GET or POST
bye_text The message to be played on a successful pin entry "Thank you, goodbye"
failed_text The message to be played on an incorrect pin with retry "Incorrect, try again"

Autenticación

La aplicación Lambda no guarda ninguna de sus credenciales de Nexmo, sino que éstas se pasan en el momento en que invoca la función y sólo se utilizan para esa solicitud.

Hay dos formas de hacerlo: generando un JWT de Nexmo con nuestras bibliotecas y poniéndolo en las cabeceras de la solicitud o simplemente enviando la clave privada y el applicationID como parte de una solicitud cURL. Se recomienda utilizar el método JWT de autenticación.

cURL (autenticación de clave privada)

Edite la URL para que coincida con la que se le dio cuando desplegó su función

curl -X "POST" "https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/call" \
--data-urlencode "private_key=`cat private.key`" \
-d "app_id=684027bc-a2e7-48b1-b4bd-adc02324e09c" \
-d "to=447970513607" \
-d "from=447520616161" \
-d "text='Enter the PIN'" \
-d "pin_code=1234" \
-d "callback=https://2bwz8nkbmfgc.runscope.net/callback" \
-d "callback_method=post" \
-d "bye_text='Thank You'" \
-d "failed_text='Try again'"

Python (JWT)

Edite la URL para que coincida con la que se le dio cuando desplegó su función.

Necesitará la biblioteca Nexmo python: instálela con pip install nexmo

# you need the Nexmo client lib to generate your JWT
import nexmo
import requests

client = nexmo.Client(application_id=APP_ID, private_key=PRIVATE_KEY, key='dummy', secret='dummy')
headers = client._Client__headers()
data = {
'to': 'TO_NUMBER',
'from': 'CALLERID_NUMBER',
'text': 'Enter the pin',
'pin_code' : '1234',
'callback' : 'https://example.com/callback',
'callback_method' : 'post',
'bye_text' : 'thankyou',
'failed_text' : 'try again'
}
response = requests.post("https://910e9mcan2.execute-api.us-east-1.amazonaws.com/api/call", json=data, headers=headers)

Para cualquiera de los dos métodos, la respuesta será un objeto JSON que contiene un ID de transacción ('tid') esta es la referencia para la llamada y se utilizará en la devolución de llamada con el resultado.

Ejemplo de respuesta: { "tid": "6a2827c9-4c68-46fc-b179-115f055dc0eb" }

Devoluciones de llamada

Una vez completada la llamada, la función Lambda realizará una petición de devolución de llamada a un webhook especificado al invocarla, que contendrá los detalles de la llamada y el resultado:

Parameter Value Example
to The number called in e.164 format 14155550100
tid The transaction ID 6a2827c9-4c68-46fc-b179-115f055dc0eb
status The result ok

Se pueden devolver los siguientes valores de estado:

  • okla llamada se ha completado y el usuario ha introducido el PIN correcto

  • failedLa llamada se ha completado pero el usuario no ha introducido el PIN correcto.

  • errorla llamada no se ha completado

Próximos pasos

Puede modificar el código para ajustar parámetros como el número de reintentos que el usuario obtiene en el pin o tal vez desee cambiar el código voiceName utilizado en los avisos.

Los detalles de cada una de sus llamadas se almacenarán en AWS DynamoDB, es posible que desee limpiar estas entradas de vez en cuando en función de sus necesidades.

Compartir:

https://a.storyblok.com/f/270183/384x384/7fbbc7293b/sammachin.png
Sam MachinAntiguos alumnos de Vonage