Text To Speech E Reconhecimento De Voz Do Google No Asterisk
Estava procurando sobre TTS na internet quando achei o site abaixo:
http://zaf.github.com/asterisk-googletts/
Achei a ideia fantástica apesar de não saber sobre as implicações de licenças que a cercam.
Fui tentar colocar o script para funcionar no meu LAB mas tive diversos problemas que resolvi e listo aqui as soluções.
1) O modo como acessei o proxy:
1
$ua->proxy('http','http://dominio\\\usuario:senha@ip:80');
2) O Asterisk não conseguia achar o mpg123 em /usr/local/bin não descobri a causa. O usuário asterisk conseguia e executava normal no shell, mas dentro do programa não.
Esse foi um dos maiores problemas. Se alguém souber como corrigir isso bem eu agradeço, uso o elastix como base.
Fiz um link simbólico em /usr/bin:
1
2
3
4
5
6
7
cd /usr/bin/
ln -s /usr/local/bin/mpg123 mpg123
3) o meu teste não estava correto tinha 2 erros:
a) faltava ": ".
b) o idioma é no formato do google não do Asterisk, portanto "pt-BR" não "pt_BR".
Arquivo ./googletts.agi
1
2
3
4
agi_request: googletts.agi
agi_arg_1: Teste
agi_arg_2: pt-BR
agi_arg_3: any
4) Existe uma linha no código que penso que foi colocada para testar passar argumentos na linha de comando e isso acaba limpando os args
Comentem com #.
Antes:
1
($AGI{arg_1}, $AGI{arg_2}, $AGI{arg_3}) = @ARGV;
Depois:
1
#($AGI{arg_1}, $AGI{arg_2}, $AGI{arg_3}) = @ARGV;
Para fazer o Reconhecimento de voz os mesmos problemas incluindo a instalação do FLAC que é necessário, mas nenhuma dificuldade adicional.
Fiz 2 alterações para atender minhas necessidades:
1) Ele fazia RecVoz só de 2 números. Não era o que eu queria.
Antes:
1
2
# Remove spaces between digits #
$response{utterance} =~ s/(\d)\s(\d)/$1$2/g;
Depois:
1
2
# Remove spaces between digits #
# $response{utterance} =~ s/(\d)\s(\d)/$1$2/g;
2) Não sendo números existia o problema da codificação em utf-8.
Antes:
1
2
$response{utterance} = "$1";
$response{confidence} = "$2";
Depois:
1
2
3
$response{utterance} = "$1";
utf8::decode($response{utterance});
$response{confidence} = "$2";
Também me ajudou muito na linha de comando executar:
1
*CLI> agi set debug on
Enquanto depurava o código acabei criando um problema, eu colocava pontos com:
1
2
print "NoOp $variavel \n";
checkresponse();
E me esquecia de colocar em baixo checkresponse();
Quando chegava por exemplo no:
1
2
print "STREAM FILE $file \"$keys\"\n";
@response = checkresponse();
Voltava rápido pro extension e não tocava. Ai eu colocava um sleep(4) funcionava e eu não entendia o por que. Então a cada NoOp coloque checkresponse(); pois fica a resposta no buffer. Uma melhoria que caberia no código é a cada warn colocar um NoOp. Afinal no Asterisk não da pra ver o warn. Isso teria me ajudado a saber da dificuldade em achar o mpg123.