El 3CX Voice Application Designer versión 3 recientemente liberado, incluye una nueva funcionalidad que permite realizar síntesis de habla (TTS por sus siglas en inglés text-to-speech), es decir producir voz humana en forma artificial. Esto abre la puerta a infinitas nuevas posibilidades, ya que permite crear aplicaciones de voz que reproduzcan audio que no se encuentra pre-grabado, sino que se genera a cada momento según la necesidad.
Por ejemplo, podría utilizarse para crear una aplicación de voz que lea información de una base de datos y la reproduzca al usuario, o que consulte un servicio web y lea los resultados al usuario.
En este artículo mostraremos cómo utilizar esta nueva funcionalidad para crear poderosas aplicaciones, cómo agregar nuevas voces e idiomas, y cómo resolver algunos problemas comunes que pueden aparecer.
La funcionalidad de síntesis de habla (TTS)
Windows incluye el “Microsoft Speech Synthesizer” en sus versiones más modernas, una serie de componentes que permiten realizar la síntesis de habla. El 3CX Voice Application Designer utiliza estos componentes para sintetizar habla, y esto permite que sean utilizadas todas las funcionalidades que éstos proveen, e incluso que se haga uso de nuevas voces en distintos idiomas, que fueron creadas originalmente para Windows.
La lista de sistemas operativos Windows que incluyen “Microsoft Speech Synthesizer” al momento de escribir este artículo son:
- Windows 7
- Windows Vista SP1 or later
- Windows XP SP3
- Windows Server 2008 (Server Core not supported)
- Windows Server 2008 R2 (Server Core supported with SP1 or later)
- Windows Server 2003 SP2
Por el lado de la Central Telefónica 3CX, esta funcionalidad se encuentra disponible a partir de la versión 11.
Modos de realizar síntesis de habla
El 3CX Voice Application Designer provee dos formatos para realizar la síntesis de habla, uno sencillo denominado “Text” y otro más complejo denominado “SSML”.
- Modo “Text”: este modo es el más apropiado para la mayoría de los usuarios dado que es más sencillo. El texto es convertido a habla tal como se lo ingresa.
- Modo “SSML”: este modo permite controlar aspectos del audio sintetizado, como la pronunciación, el volumen, el tono, el ritmo, etc. El texto debe ser un XML conforme a la recomendación SSML (Speech Synthesis Markup Language) disponible en https://www.w3.org/TR/speech-synthesis/
Sintetizando habla mediante el modo “Text”
Paso 1 – Creando el proyecto
En primer lugar necesitamos crear un nuevo proyecto. Abra el 3CX Voice Application Designer y vaya a File -> New -> Project. Elija un nombre para el proyecto, por ejemplo “TTS Demo“ y guárdelo en la carpeta deseada. El callflow principal “Main.flow” se abrirá automáticamente.
Paso 2 – Definiendo algunas variables
A modo de ejemplo, vamos a definir algunas variables, y luego reproduciremos los valores de las mismas. Esto nos permitirá mostrar que los textos a reproducir pueden crearse en forma dinámica utilizando expresiones.
En el Project Explorer seleccione el nodo del callflow principal, luego vaya a la ventana de Propiedades y presione el botón a la derecha del ítem “Variables”.
Se abrirá el editor de la colección de variables. Vamos a agregar 2 variables, una conteniendo un nombre y otra conteniendo un importe. Para esto:
- Presione el botón “Add” para agregar la primera variable. Cambie el nombre por defecto “Variable1” por “Name”. Luego ingrese el valor ‘John Doe’ (incluyendo las comillas simples ya que es un string constante) en el campo InitialValue.
- Presione nuevamente el botón “Add” para agregar la segunda variable. Cambie el nombre por defecto “Variable1” por “Amount”. Luego ingrese el valor 120.45 en el campo InitialValue.
Ya tenemos definidas las dos variables, una con el nombre “John Doe” y otra con el importe “120.45”. A continuación crearemos una expresión que nos permita reproducir el siguiente mensaje: “Mr. John Doe has a balance of $ 120.45” (en español, El señor Juan Perez tiene un saldo de $120.45).
Paso 3 – Agregando el componente para sintetizar habla
Para sintetizar habla simplemente necesitamos agregar a nuestro callflow un componente de tipo Prompt Playback. Arrástrelo desde la barra de herramientas hacia el área de diseño de la aplicación. Cambiemos el nombre del componente por “playTTS”. Cambiemos la propiedad “AllowBargeIn” por False para que el mensaje se reproduzca por más que no se vayan a ingresar dígitos posteriormente (vea éste artículo para más información). Ahora presione el botón a la derecha de la propiedad “Prompts” para abrir el editor de mensajes a reproducir. Verá que a la derecha del botón “Add” hay una flecha apuntando hacia abajo que permite desplegar los distintos tipos de mensajes que pueden agregarse. En este caso elegiremos “TextToSpeechAudioPrompt”.
Ahora tenemos que configurar este mensaje. En primer lugar modifiquemos el nombre por “ttsPrompt”. Mantendremos el formato como “Text”, el nombre de la voz vacío para que se utilice la voz por defecto y el volumen en 100 (valor máximo). Ahora solo resta crear la expresión para la propiedad “Text”. Puede presionar el botón que se encuentra a la derecha de esta propiedad para abrir el editor de expresiones. Utilizaremos la función del VAD llamada “CONCATENATE” para concatenar las distintas partes del texto, y completaremos los campos de la siguiente forma:
- El primer texto a concatenar será ‘Mr. ‘. Recuerde ingresar las comillas simples para denotar string constante.
- Luego seleccionamos la variable callflow$.Name
- Como la función del VAD por defecto muestra dos partes a concatenar, debemos presionar el botón
a la derecha de la segunda parte concatenada para agregar una tercera. A continuación ingresamos ‘ has a balance of $ ‘. Recuerde ingresar las comillas simples para denotar string constante.
- Finalmente seleccionamos la variable callflow$.Amount
El valor final de la expresión quedará de la siguiente manera:
CONCATENATE(‘Mr. ‘,callflow$.Name,’ has a balance of $ ‘,callflow$.Amount)
Paso 4 – Compilar, desplegar y probar
El proyecto se encuentra listo. Ahora solo es necesario guardarlo, compilarlo, desplegarlo a su instalación de la Central Telefónica 3CX y realizar una llamada a la extensión asignada. Al realizar la llamada escuchará el mensaje sintetizado.
Sintetizando habla mediante el modo “SSML”
En caso de necesitar controlar con mayor detalle algunos aspectos de la sintetización del habla, deberá utilizarse el modo SSML. Este modo es más complejo que el modo Text, pero nos da mayor control. En este caso deberemos completar la propiedad “Text” del mensaje con un XML según la recomendación SSML disponible en https://www.w3.org/TR/speech-synthesis/.
Por ejemplo, para enfatizar ciertas partes de una frase podríamos utilizar el siguiente XML:
<?xml version=”1.0″?>
<speak version=”1.0″ xmlns=”http://www.w3.org/2001/10/synthesis”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://www.w3.org/2001/10/synthesis
http://www.w3.org/TR/speech-synthesis/synthesis.xsd”
xml:lang=”en-US”>
That is a <emphasis> big </emphasis> car!
That is a <emphasis level=”strong”> huge </emphasis>
bank account!
</speak>
Para ingresar un valor constante en la propiedad Text deben escapearse las comillas simples y dobles, caso contrario serán malinterpretadas y tendremos un error en tiempo de ejecución “ecmascript.semantic”. Por lo tanto, si quisiéramos modificar el proyecto creado anteriormente para ingresar el XML anterior como un valor constante, deberemos asignar a la propiedad Text del mensaje “ttsPrompt” el siguiente valor:
<?xml version=”1.0″?><speak version=”1.0″ xmlns=”http://www.w3.org/2001/10/synthesis” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis/synthesis.xsd” xml:lang=”en-US”>That is a <emphasis> big </emphasis> car! That is a <emphasis level=”strong”>huge</emphasis> bank account!</speak>
Al compilar, desplegar y llamar a la extensión asignada al callflow, podremos ver cómo se enfatizan las palabras indicadas.
Las posibilidades que ofrece SSML para controlar la generación del habla sintetizada son enormes, esto es solo un ejemplo sencillo. Para más información referirse a la recomendación citada anteriormente.
Agregando voces y soportando otros idiomas
El sistema operativo ofrece en forma predeterminada una voz, por ejemplo “Microsoft Anna”. Es posible instalar nuevas voces que luego pueden utilizarse para sintetizar el habla. Las nuevas voces podrán implementar la sintetización en diferentes idiomas, entonces por ejemplo podemos agregar una voz en español y tener así la funcionalidad de conversión de texto a voz en español.
Para consultar las voces que se encuentran instaladas y seleccionar la voz a utilizar en forma predeterminada, vaya al Panel de Control -> Reconocimiento de Voz -> Texto a Voz. La lista de selección de voz mostrará las opciones disponibles.
Allí se mencionan por ejemplo las voces de Cepstral, que incluyen voces en inglés americano, inglés británico, español, francés, alemán e italiano.
Luego de instalar las voces, es posible que sea necesario reiniciar el equipo para poder utilizarlas.
Resolviendo problemas
Al encontrarse con un problema, en primer término asegúrese de:
- Tener instalado el 3CX Voice Application Designer versión 3 con la licencia activada (la funcionalidad de sintetización de habla no se encuentra disponible en la versión gratuita).
- Tener instalada la Central Telefónica 3CX versión 11 con una licencia activada.
- Estar corriendo la Central Telefónica 3CX en uno de los sistemas operativos soportados (ver la lista en este artículo, más arriba).
Si al hacer una llamada a la extensión asignada al callflow que acabamos de crear, ésta se corta al llegar a la reproducción del audio sintetizado, y en los logs vemos que obtenemos un error de tipo “error.badfetch”, probablemente se deba a un problema en la configuración se seguridad del servidor web (Abyss o IIS). Esto suele suceder cuando utilizamos formato SSML, ya que en ese caso se envía el XML como parámetro entre las páginas web que componen el callflow, lo cual puede estar restringido en el servidor web para evitar ataques de inyección de código.
Para modificar la configuración del servidor web para permitir el pasaje de XML entre páginas haga lo siguiente:
- Vaya a la carpeta %ProgramData%3CXDataHttpInterfaceivr
- Abra el archivo web.config que se encuentra dentro de esa carpeta
- Busque el elemento <system.web>
- Debajo de ese elemento agregue lo siguiente:
<httpRuntime requestValidationMode=”2.0″ />
<pages validateRequest=”False” />
- Reinicie el servicio del servidor web (Abyss o IIS)
Conclusión
Mediante el uso de la sintetización del habla, la creación de aplicaciones de voz para la Central Telefónica 3CX es más simple que nunca. Tareas como la reproducción de números o fechas, que antes requerían la creación de componentes de usuario para lograrla, ahora son tan simples como colocar un componente Prompt Playback e ingresar el valor correspondiente, el sintetizador se ocupará de todos los detalles.
Esta nueva funcionalidad del Voice Application Designer abre la puerta a infinitas nuevas posibilidades, permitiendo crear aplicaciones de voz que reproduzcan mensajes que no necesariamente se encuentren pre-grabados, sino que se generen en forma dinámica a partir de la información obtenida desde las fuentes que se desee.








