Asterisk TTS: Usar Loquendo con un AGIscript

El uso de un TTS en asterisk es algo casi imprescindible cuando vamos a realizar una aplicación que tome dato sde un sistema externo. Ya que es la forma de convertir esos datos a algo que el usuario pueda entender.

Loquendo tts es un producto comercial que tiene voces en multitud de idiomas, voces de una calidad bastante alta y que he usado en alguna instalaci'on con unos resultados muy buenos.

Existen otros metodos para conectar loquendo con asterisk, pero hoy me voy a centra en el mas sencillo, que es usar un AGIscript directamente en el dialplan de asterisk. Bueno, sencillo del todo no es, pero incluyo un programita en C llamado txt2audio que facilitará mucho la labor.

Instalar

Paso 1: Instalar Loquendo TTS siguiendo la sinstrucciones del paquete. (Habitualmente se instalará en: /opt/Loquendo/LTTS7/)

Paso 2: Installar Asterisk con soporte para AGI. Si usáis asterisk, me imagino que no habrá problemas con este paso. El soporte para AGI, es opción por defecto.

Paso 3: Instalar es soporte Asterisk::AGI en perl usando cpan:

Primero actualicemos CPAN


perl -MCPAN -e shell
cpan> install MD5
cpan> install CPAN
cpan> reload cpan


Y luego instalemos el módulo Asterisk::AGI


cpan> install Asterisk::AGI


Script AGI

Crearemos el script loquendo.agi con el código que muestro a continuación en el directorio por defecto para los scripts AGI . (Habitualmente en: /var/lib/asterisk/agi-bin/)


#!/usr/bin/perl

use Asterisk::AGI;
use File::Basename;
use Digest::MD5 qw(md5_hex);

$AGI = new Asterisk::AGI;

my %input = $AGI->ReadParse();
my ($text)=@ARGV;
my $hash = md5_hex($text);
my $voice= "Leonor";
my $sounddir = "/var/lib/asterisk/sounds/tts";
my $wavefile = "$sounddir/"."tts-$hash-$voice.sln";
my $loquendoDir= "/opt/Loquendo/LTTS7/bin/";

unless (-f $wavefile) {
open(fileOUT, ">$sounddir"."/say-text-$hash.txt");
print fileOUT "$text";
close(fileOUT);

my $execf=$loquendoDir."txt2audio $sounddir/say-text-$hash.txt $wavefile $voice";
system($execf);
unlink($sounddir."/say-text-$hash.txt");
}
$AGI->stream_file('tts/'.basename($wavefile,'.sln'));


Programa txt2audio

Nos resta crear el programita que pase de texto a audio usando el api de loquendo. En si no es muy difícil, y cualquiera puede hacerlo basándose en los ejemplos que vienen con Loquendo TTS.

Para empezar, crearemos el directorio /opt/Loquendo/LTTS7/samples/c/txt2audio e incluiremos en él los dos ficheros que adjunto a continuación.

txt2audio.c


#include <stdio.h>
#include "loqtts.h" /* Loquendo TTS include file */

int main(int argc, char *argv[]) {

ttsHandleType hSession, hReader; /* Reader handle */
ttsResultType r; /* Error code returned by TTS APIs */
const char* p = "Ludoviko";

if(argc == 4) {
p = argv[3];
} else if(argc !=3) {
fprintf(stderr, "Run '%s <textfile> <wavfile> [<voicename>] '\n", argv[0]);
return -1;
}

fprintf(stderr, "Using voice %s\n", p);

/* Initializes a LoquendoTTS Reader using the implicit session */
r = ttsNewSession(&hSession,"/opt/Loquendo/LTTS7/bin/default.session");
if (r != tts_OK) {
fprintf(stderr, "%s\n", ttsGetErrorMessage(r));
ttsDeleteSession(NULL); /* deallocates all tts resources */
return r;
}

r = ttsNewReader(&hReader, hSession);
if (r != tts_OK) {
fprintf(stderr, "%s\n", ttsGetErrorMessage(r));
ttsDeleteSession(NULL); /* deallocates all tts resources */
return r;
}

/* Sets the persona parameters using mother tongue and default style */
r = ttsLoadPersona(hReader, p, NULL, NULL);
if(r != tts_OK) {
fprintf(stderr, "%s\n", ttsGetErrorMessage(r));
ttsDeleteSession(NULL); /* deallocates all tts resources */
return r;
}

/* Sends samples directly to the audio board */
r = ttsSetAudio(hReader, "LTTS7AudioFile", argv[2], 8000, tts_LINEAR, tts_MONO, 0);
if(r != tts_OK) {
fprintf(stderr, "%s\n", ttsGetErrorMessage(r));
ttsDeleteSession(NULL); /* deallocates all tts resources */
return r;
}

/* Converts text to speech */
r = ttsRead( hReader, argv[1], ttsFALSE, ttsTRUE, NULL); /* ttsRead keeps control until the end */
if (r != tts_OK) {
fprintf(stderr, "%s\n", ttsGetErrorMessage(r));
}

ttsDeleteSession(NULL); /* deallocates all tts resources */
return 0;
}


makefile


CC = gcc
CFLAGS = -O -Wall
PROG_NAME = txt2audio

../../../bin/$(PROG_NAME): $(PROG_NAME).c
cd ../../../bin && $(CC) $(CFLAGS) -I ../include libLoqTTS7.so ../samples/c/$(PROG_NAME)/$^ -Wl,--rpath,. -o $(PROG_NAME)

clean :
rm -f ../../../bin/$(PROG_NAME)


Parece obvio, pero lo digo: hay que compliar.


cd /opt/Loquendo/LTTS7/samples/c/txt2audio
make


Usarlo en el dialplan

Fianlmente ya podemos usar nuestro flamante TTS en el dialplan:

AGI(loquendo, 'Hello world')


NOTAS

  1. txt2audio.c necesita ser parcheado si la instalación de loquendo se realiza en un lugar diferente del mostrado pro defecto /opt/... Se puede hacer de dos formas, o parcheando la línea 20 para establecer la ruta correcta, o establecer la variable a NULL y desde el sistema, exportar la variable de entorno LTTS7_DEFAULTSESSION ante sde usar el programa.

  2. El makefile necesita tababuladores antes de las líneas 6 y 9 o se producirá un error del tipo 'missing separator'

  3. Escribí este artículo originalmente en http://www.voip-info.org/wiki/view/Loquendo+TTS hace unos meses. Hoy lo pego aquí traducido al español.

10 comentarios:

Abelardo dijo...

Hola, ante todo muchas gracias por tu articulo, he estado tratando de instalar Loquendo pero me pide un archivo de licencia, lo baje el loquendo de internet, queria pedirte, POR favor, si me pudieras ayudar a conseguir un archivo de licencia gratis. Te lo agradeceria mucho. Mi nombre es Abelardo Jara.
Muchos saludos y sobre todo Muchas gracias

Abelardo dijo...

por mis datos, mi pagina web es

hcs.ufl.edu\~berrocal

Cualquier cosa que pueda apoyarte, estoy para servirte.

Ricardo Peironcely dijo...

Hola Abelardo. NO te puedo hacer llegar un archivo de licencia de Loquendo. Pero te recomiendo que te pongas en contacto con ellos y les solicites una licencia de prueba.

assanta dijo...

Hola
He estado buscando el Loquendo en internet (página de Loquendo y P2P), pero no lo he encontrado, me podríais ayudar?

gracias
assanta

Jose dijo...

Hola ya instale la licencia de loquendo pero cuando voy a darle el make me aparece un error tipo:
makefile:6: *** falta un separador. Alto.

andres dijo...

Hola Jose, tienes que modificar el archivo make y colocar un TAB en la linea que te da el error en tu caso seria la 6, Un apregunta estoy en el mismo paso que tu, pero no tengo la licencia, como la conseguiste?

andres dijo...

Alguien me puede informar el precio aproximado de la licencia, muchas gracias?

afuentes dijo...

También estoy buscando una licencia, alguien me puede ayudar. Si cuesta indíqueme el precio y el procedimeinto.

Ian dijo...

Hola Ricardo.
Dices que "Existen otros metodos para conectar loquendo con asterisk".

Puedes decirme cuáles son y dónde puedo encontrar información sobre ello?

Algo sobre MRCP bien documentado?

Muchas gracias.
Un saludo.

assanta dijo...

Hola Ricardo

Haciendo pruebas, me han surgido un par de dudas:

- Quiero devolver la voz por streaming, en vez de en un fichero, supongo que lo que tendría que modificar es "LTTS7AudioFile" por "LTTS7AudioAsf", pero todavía no he llegado a hacer la prueba. Es posible hacerlo en Linux? porque el asf es de origen windows

- También quiero intentar peticiones a un Loquendo en servidor remoto al Asterisk, algún consejo sobre esto?

saludos
assanta

Publicar un comentario en la entrada