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.

