El 3CX Voice Application Designer es una herramienta que permite crear aplicaciones de voz fácilmente, diseñando el flujo de la llamada gráficamente con bloques funcionales predefinidos, sin necesidad de programar.

En este artículo mostraremos cómo hacer para reproducir fácilmente una secuencia de números dentro de una aplicación.

Introducción

Muchas veces nos encontramos ante la necesidad de reproducir una secuencia de números con el VAD. Por ejemplo, si queremos solicitar el ingreso de un número por DTMF y luego reproducir el valor ingresado al usuario para su validación:

  1. VAD: Por favor, ingrese su código de cliente
  2. El usuario ingresa 1234 utilizando su teclado telefónico
  3. VAD: El código de cliente ingresado es 1234. Para confirmar presione 1, para ingresar nuevamente presione 2.

Dado que la reproducción de los dígitos puede ser algo que se requiera en distintos puntos de la aplicación, resulta conveniente encapsular esa funcionalidad en un componente. El VAD permite crear componentes que luego pueden ser reutilizados en diferentes partes de la aplicación.

Paso 1: Creando el componente

El componente que necesitamos crear debe poder recibir como parámetro de entrada la secuencia de dígitos, y reproducirlos uno a uno.

Para crear el componente vaya a File -> New -> Component. Utilizaremos el nombre PlayDigits. Al crear el componente, el mismo es abierto automáticamente. Vaya a la ventana de Propiedades y haga clic en el botón a la derecha del ítem “Variables”, de modo de abrir el diálogo de configuración de propiedades, como se muestra en la siguiente figura:

Vamos a necesitar 2 variables:

  • Digits: será una variable pública para que pueda ser completada desde el exterior del componente, es decir desde la parte de la aplicación que va a llamar a este componente. No es necesario configurar un valor inicial, ya que el mismo será inicializado desde el exterior. La accesibilidad debe ser “ReadWrite” para que pueda ser escrito desde el exterior del componente.
  • Index: será una variable privada para uso interno del componente. Esta variable nos permitirá iterar uno a uno los números de la secuencia. La inicializamos en cero para reproducir primero el número que se encuentra en la primera posición.

Luego presionamos el botón OK para guardar las variables creadas.

Ahora necesitamos diseñar el componente en sí. Para esto vamos a necesitar un componente de tipo “Loop” para iterar los números de la secuencia. Dentro del componente “Loop” vamos a agregar un componente de tipo “Prompt Playback” para reproducir el número de esa iteración, y un componente de tipo “Increment Variable” para incrementar la variable Index que creamos anteriormente, de modo de posicionarnos en el próximo número de la secuencia en la próxima iteración del lazo. Nos va a quedar algo como lo que se muestra en la siguiente figura:

Ahora veremos en detalle cómo configurar a cada uno de estos componentes:

    1. Para el componente digitsLoop de tipo “Loop” debemos configurar la propiedad “Condition” con la siguiente expresión:

LESS_THAN(callflow$.Index,LEN(callflow$.Digits))

Esta propiedad indica la condición que debe cumplirse para continuar iterando. Con el valor propuesto estamos diciendo que la iteración continúe mientras la posición actual (callflow$.Index) sea menor que la longitud de la secuencia de números que nos pasaron como parámetro (LEN(callflow$.Digits)).

    1. Para el componente playDigit de tipo “Prompt Playback” debemos abrir el editor de Prompts para indicar el mensaje a reproducir. En este caso necesitamos reproducir un archivo de audio cuyo nombre será el número y la extensión .WAV. Por ejemplo 0.wav, 1.wav, 2.wav, y así hasta 9.wav. Estos archivos de audio deben ser copiados a la carpeta Audio del proyecto, de modo que sean desplegados junto con los archivos de la aplicación. Para esto agregaremos un prompt de tipo “Dynamic Audio File Prompt” con la siguiente expresión para crear el nombre del archivo:

CONCATENATE(MID(callflow$.Digits,callflow$.Index,1),’.wav’)

Esta expresión nos permite extraer de la secuencia al número correspondiente a la posición de esta iteración, y concatenarlo a la extensión “.wav”.

  1. Para el componente incrementIndex de tipo “Increment Variable” debemos configurar la propiedad “VariableName” de modo de incrementar a la variable “Index” del componente:

callflow$.Index

Ya tenemos el componente listo. Ahora solo es necesario invocarlo.

Paso 2: Invocando al componente para reproducir dígitos

Ahora que tenemos el componente que nos permite reproducir una secuencia de números, podemos ponerlo en práctica en nuestra aplicación.

Abra el flujo de llamada principal haciendo doble clic sobre el ítem “Main.flow” en el Project Explorer. Agregue un componente de tipo “User Input” para solicitar el ingreso de dígitos al usuario. En la rama “Valid Input” agregue un componente del tipo que acaba de crear, que se encuentra en la barra de herramientas bajo la categoría “User Defined Components”. Debería ver algo como lo siguiente:

Ahora configure la propiedad Digits del componente que acaba de agregar, indicando que debe reproducir los dígitos ingresados por el usuario. Para eso utilice la siguiente expresión:

requestInput.Buffer

De ese modo estamos indicando que los dígitos a reproducir se obtienen del buffer de dígitos del componente “User Input”, es decir los dígitos ingresados por el usuario.

Conclusión

Además de la problemática concreta que resuelve este ejemplo, es interesante ver cómo pueden encapsularse determinados comportamientos comunes a una aplicación dentro de un componente definido por el usuario. Este es un concepto muy poderoso que nos brinda varios beneficios:

  • Permite desarrollar más rápidamente las aplicaciones por contar con bloques reusables.
  • Simplifica el diseño del callflow principal, y evita que el dibujo crezca a un punto donde se torne inmanejable.
  • Hace que la aplicación sea más fácil de comprender y mantener.

Mediante este concepto podemos crear componentes reutilizables que permitan por ejemplo reproducir fechas, reproducir horas, realizar la validación de una entrada de dígitos en forma genérica, etc.