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
- 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.
- El makefile necesita tababuladores antes de las líneas 6 y 9 o se producirá un error del tipo 'missing separator'
- 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:
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
por mis datos, mi pagina web es
hcs.ufl.edu\~berrocal
Cualquier cosa que pueda apoyarte, estoy para servirte.
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.
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
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.
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?
Alguien me puede informar el precio aproximado de la licencia, muchas gracias?
También estoy buscando una licencia, alguien me puede ayudar. Si cuesta indíqueme el precio y el procedimeinto.
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.
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