Arquivos
Google Speech + Python + Asterisk
Olá Povo que acompanha o blog
Ainda falando sobre reconhecimento da fala utilizando o google, enviei uma mensagem na lista AsteriskBrasil onde expressava minhas idéias de como utilizar o serviço de reconhecimento de fala do google em tempo real com o Asterisk, já se passou quase uma semana sem se quer um suspiro de interesse, então resolvi seguir sozinho !
A idéia é utilizar EAGI para controle do canal de entrada de áudio em conjunto com o File Descriptor, o Asterisk entrega o áudio em formato RAW diretamente no File Descriptor 3, então podemos utilizar esta informação da maneira que acharmos conveniente, para este caso a manipulação se torna muito prática, o que me desprende totalmente das APP’s prontas para gravações inseridas no Asterisk Ex. Record, nada melhor do que ser livre para voar, é claro várias análises se tornam possíveis com isso e o leque de aplicações possíveis se tornam infinitas.
Você certamente já pensou em ter um PABX com funcionalidade para reconhecimento da fala então certamente irá precisar partir para soluções cooporativas e caras certo???
A Partir de hoje não !
Tudo que irá precisar é ter internet para acessar o google o Script possue algumas dependencias:
https://github.com/ederwander/Asterisk-Google-Speech-Recognition/blob/master/README
Estou usando novamente o módulo audiolab para efetuar o encode do áudio em FLAC, caso exista alguma dificuldade para a instalação deste módulo poderei pensar em adaptar o código para uso externo do sox ou flac.
Como ele funciona?
- Atende uma ligação
- O usuário tem no máximo 10 segundos para efetuar a fala
- Caso nao encontre atividade de voz encerra com timeout
- Estratégia para atividade de voz verdadeira para os seguintes valores RMS > 15 e Pitch > 75
- Se atividade for encontrada o usuário poderá falar por no máximo 10 segundos
- O script verifica blocos em tempo real com amostras de 1 em 1 segundo e verifica se a fala cessou
- Caso sim o script interrompe a gravação automáticamente e envia o que foi gravado para o google
- Caso não o script continua o seu curso até seu máximo de 10 segundos
- Apos encontrada a resposta da fala no google o script seta a variável “GoogleUtterance”
Telas:
Source em:
https://github.com/ederwander/Asterisk-Google-Speech-Recognition
Simple VAD (Voice activity detection) Based in Threshold Energy
Fim das Férias…
Post passado mostrei um exemplo simples de como integrar o Voice Search do google usando Python, comentei que seria interessante desenvolver um VAD para automatizar o processo etc, e então no final do ano passado desenvolvi um novo protótipo, escrevi algo bem simples para adquirir o conceito, e em cada passo da implementação me deparava com um problema, a maneira mais básica para identificar a atividade de sons é por meio do RMS (Root mean square), com ele conseguimos medir a magnitude do sinal, isso nos dá a possibilidade de calcular o volume em um grupo de frames no sinal e o pesadelo começa aqui como encontrar um valor global para definir o que é silencio ou não ???
As Variáveis são muitas e mais uma vez qualquer componente externo pode atrapalhar nos resultados, Qualidade do Microfone, Nível do Volume e Boost configurados para o seu Microfone, etc.
Pensando em amenizar o problema inclui um Simples Extrator de Tom para tentar encontrar frequências maiores do que 80 Hz, a voz humana é capaz de reproduzir sons que vão de 80 até 1100Hz, para trabalhar em real-time o desempenho é fundamental então parti para um extrator de Freqüência bem veloz apesar de não funcionar com muita eficiência em ondas complexas utilizar zero-crossing se torna útil para este projeto.
No projeto passado para efetuar as conversões em .flac utilizei a biblioteca audiolab, o audiolab é excelente para Linux, mas neste novo projeto iniciei os testes em solo Windows e tive muitas incompatibilidades, resolvi então utilizar um binário externo para efetuar os encodes (flac.exe) você pode baixar no seguinte link.
Como o protótipo funciona?
- Ao Executar ele fica escutando o sinal de áudio do microfone
- Ao perceber atividade de voz inicia a gravação
- Ao iniciar a gravação continua analisando os últimos blocos dos frames para tomar a decisão se a fala cessou ou não
- Se cessou finaliza a entrada de áudio converte para .flac e envia para o google neste caso o framerate já esta no formato correto pois a gravação feita pelo microfone já se encontra em 16000.
Para o meu caso consegui melhores resultados configurando meu microfone no windows com 100% de nível e com boost de +10dB
Tela:
Source:
https://gist.github.com/1589531
Eng Eder de Souza


