Accessing the Google Speech API + Python
Olá Pessoal…
Se você possue um iphone 4S já ouviu falar do SIRI, ele é um assistente pessoal que lhe auxilia respondendo questões, tudo isso é feito por meio de Voz utilizando-se o reconhecimento da Fala, suas perguntas são transcritas em texto e analisadas pelo Siri que lhe responde por meio de um TTS (Text-To-Speech) , desenvolvedores do Android logo apareceram com um rival chamado de IRIS (Intelligent Rival Imitator of Siri), quando se utiliza destas aplicações sentimos que algo mágico acontece, como ambos reconhecem com tamanha precisão uma frase inteira?? Certamente ambos os métodos possuem modelos baseados em Hidden markov model (HMM), algo que demanda muito tempo, pesquisa e estudo para classificar padroes previamente treinados.
Mas espere os desenvolvedores do IRIS dizem que a aplicação para o Android foi feita em apenas 8 horas de trabalho, humm, olhando mais a fundo você logo percebe que o aplicativo acessa a API do google para reconhecimento de fala, até então este recurso do google chamado de “Voice Search” disponível apenas para navegadores Chrome funciona como um complemento onde se disponibiliza um ícone (microfone) nos campos de busca do navegador para efetuar qualquer tipo de procura utilizando a fala.
Claro que os mais observadores logo pensam “um complemento é capaz de fazer tudo isso??”, mas é claro que não, ele apenas grava o sinal capturado pelo microfone e envia para um servidor central do google. Tudo é gravado em um formato .flac com um sample rate de tamanho 16000.
Fiz algo bem simples em python nao gastei nem 2 horas de brincadeira o script pega um arquivo pré-gravado .wav converte para o frame rate utilizado pelo google de 16000, logo após converte o arquivo em formato .flac, envia para o google e pega a resposta da frase ou palavra que você falou no arquivo. Quiz deixar o scrpit o mais independente possível sem precisar de programas externos para conversões.
O proximo passo é fazer tudo isso em realtime sem necessitar de arquivos pré-gravados, o correto é fazer um algoritmo para VAD (Voice activity detection) que inicia o processo de gravação do audio em realtime quando alguma atividade de voz é encontrada, assim será necessário sempre verificar a energia do sinal para saber o momento que a uma palavra ou frase acaba para encerrar o processo de gravação, quem sabe se tiver tempo posso escrever, por enquanto fiquem com a minha primeira versão.
Source em:
https://gist.github.com/1342497
Update Python Google Speech API and VAD here !
Eng Eder de Souza
Olá alguem pode me ajudar?
Tentei rodar o script https://gist.github.com/1342497 so que não estou conseguindo, quando executo o script aparece o seguinte erro:
Traceback (most recent call last):
File “xx.py”, line 13, in
from scikits.samplerate import resample
ImportError: No module named scikits.samplerate
Acredito que seja alguma dependencia mas nao consegui resolver, alguem pode me ajudar no momento estou utilizndo Fedora 16
Obrigado
Olá Alexandre Realmente a mensagem de erro indica que está faltando o módulo “samplerate” mais informações sobre a instalação em http://scikits.scipy.org/samplerate e local para download http://pypi.python.org/pypi/scikits.samplerate/0.3.3.
Você vai precisar instalar também o módulo AudioLab para python Download em http://pypi.python.org/pypi/scikits.audiolab/ página com informações sobre a instalação aqui http://cournape.github.com/audiolab/installing.html#download repare que existem algumas dependências necessárias para a instalação correta do AudioLab (python-dev python-numpy python-setuptools libsndfile-dev).
Se Você reparar no código na linha 18 verá que tem a seguinte linha comentada “import scipy.signal” esta linha substitui módulo “samplerate”, para tal comente a linha 13 e a linha 37 e descomente a linha 18 e linha 40, pelos meus testes o scipy neste caso é bem mais lento para efetuar o “resample” do sinal do que o módulo “samplerate”.
Nota: o passo acima apenas substitui o módulo “samplerate” portanto o módulo Audiolab tem que estar corretamente instalado!
Eng Eder de Souza
Muito obrigado pela resposta e ajuda, tentei instalar mas não deu muito certo depois irei tentar com mais calma. Então gravei um som em flac com um sample rat de 16000 e deixei seu codigo assim:
import urllib2
import sys
url = “https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=pt-BR”
flac=open(“xx.flac”,”rb”).read()
header = {‘Content-Type’ : ‘audio/x-flac; rate=16000′}
req = urllib2.Request(url, flac, header)
data = urllib2.urlopen(req)
print data.read()
E funcionou embora a qualidade do meu arquivo de audio nao tenha ficado boa funciona perfeitamente,
Agora outra pergunta será que é possivel usar esse script em conjunto com o asterisk ?
Obrigado.
É sim !!
Eu ainda não tive tempo de fazer, eu fiz um post na lista-asterisk esta semana e parece que ninguém teve interesse!
http://www.mail-archive.com/asteriskbrasil@listas.asteriskbrasil.org/msg55878.html
A minha ideia é tornar tudo real-time e seria possível fazer reconhecimento de palavras ou frases em conjunto com URA’s!
Eng Eder de Souza
Obrigado pela resposta acho isso muito legal , não entendo muito de programação sei um pouco de python, estou a disposição se eu puder ajudar em alguma coisa
Se conseguissemos usar o Google Speech API e tambem o tts do google junto com asterisk acredito que erá ficar muito bom
Talvez poderiamos fazer um projeto com a comunidade para fazer isso funcionar , o que você acha?
Grato
Vi seu post na lista-asterisk não tenho muitos conhecimentos em asterisk começei a usa-lo recentemente consegui configurar ramais, vono, ura e etc.. sei um pouco de python gostaria de ajudar se for possivel me mande algumna material para ler…algo para fazer estou a disposição
Opa eu denovo, tava pesquisando um pouco sobre o assunto e olha o que encontrei pareçe que ja tem pronto o que queremos fazer segue o link:
https://github.com/zaf/asterisk-speech-recog
com mais calma irei tentar fazer funcionar, como disse não tenho muita pratica com asterisk
Até +
Existem outros por ae, mas todos eles são engessados, nenhum deles é realtime, este por exemplo obriga o usuário a ficar 10 segundos gravando, ou seja não é nenhum pouco dinâmico para o usuário final, imagine que o usuário fale algo que demore no máximo 3 segundos, neste caso o usuário ficará esperando na linha mais 7 segundos pois ele usa a APP Record do Asterisk….
Minha idéia é construir um AGI integrado com o file descriptor 3 na qual qual poderia manipular o RAW audio em tempo real assim poderei criar um VAD que inicia a gravação da voz após encontrar indicios de atividades de voz na linha e que automaticamente para de gravar após encontrar silêncio !
Hoje de tarde fiz uns testes e já terminei metade de todo o Script
Só falta realmente testar e integrar algumas funções que escrevi mas aparentemente minha idéia irá funcionar, assim que terminar irei tornar publico o source…
Eng Eder de Souza
Ok, muito obrigado pela resposta eu tava testando e consegui usar o tts do google no asterisk bem legal e o incrivel que com uma banda larga de apenas 2MB nem pareçe que ele acessa o google, o tempo de resposta é muito rapido
Se precisar de qualquer ajuda to ai..
faloww
Ola Eder,
lendo seu post vi o seguinte parágrafo :
“Fiz algo bem simples em python nao gastei nem 2 horas de brincadeira o script pega um arquivo pré-gravado .wav converte para o frame rate utilizado pelo google de 16000, logo após converte o arquivo em formato .flac, envia para o google e pega a resposta da frase ou palavra que você falou no arquivo. Quiz deixar o scrpit o mais independente possível sem precisar de programas externos para conversões.”
Estou realmente querendo isso. Tem como você disponibilizar o código?
[]‘s
Olá o link do código esta no final do Post!
aqui esta https://gist.github.com/1342497
O módulo AudioLab só está disponível para o Python2.6 ?
2.6 e 2.7
http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikits.audiolab
Já instalei tanto o samplerate como o audiolab, mas continua a dá erro:
Traceback (most recent call last):
File “C:\Users\trp\workspace\Reconhecimento\negocio\reconhecedor.py”, line 7, in
import scikits.audiolab as audiolab
File “C:\Python27\lib\site-packages\scikits\__init__.py”, line 1, in
__import__(‘pkg_resources’).declare_namespace(__name__)
ImportError: No module named pkg_resources
Agradeço a ajuda.
[]‘s
Leia Atentamente a documentação do AudioLab, este erro é característico de alguma dependeica, neste caso me parece estar faltando a instalação do “setuptools”.
Verifique e instale corretamente as dependencias para o Audiolab
“audiolab requires the following softwares:
a python interpreter.
libsndfile
numpy (any version >= 1.2 should work).
setuptools
”
Site com as informações que vc precisa ….
http://www.ar.media.kyoto-u.ac.jp/members/david/softwares/audiolab/sphinx/installing.html#install-from-binaries
Instalei todas as dependências, mas ainda está dando esse error:
ImportError: DLL load failed: The specified module could not be found.
Este erro é clássico, ocorre nos casos de incompatibilidade de versões, as vezes pode estar ligado a sua arquitetura de pacotes instalados no sistema, se estiver em solo Windows verifique se o libsndfile (http://www.mega-nerd.com/libsndfile/) esta corretamente instalado ele é o ponto chave para o bom funcionamento do AudioLab …
Em geral instale a ultima versão do libsndfile (http://www.mega-nerd.com/libsndfile/files/) procure pela arquitetura correta, apos a instalação copie o libsndfile-1.dll para “C:\Python2XXXXXX\Lib\site-packages\scikits\audiolab\pysndfile” ou adicione o .dll ao PATH do windows…
Eder muito obrigado pela sua ajuda. Funcionou perfeitamente para alguns áudios que tenho gravados. Outros onde a vocalização é rápida ele traduz 80%. Obrigado!
This is possible in Java?
Mas é claro porque não seria ??
o que vai te dar mais trabalho será efetuar o resample, um pouco de matemática faz bem, faça o resample efetuando uma interpolação linear até conseguir 16000 de frame rate, codifique o seu áudio com o javaflacencoder http://javaflacencoder.sourceforge.net/, envie o arquivo resampleado e encodado para o google e depois capture a resposta utilizando o módulo “java.net.URL”.
Eng Eder de Souza
i am getting an error….
Traceback (most recent call last):
File “voice.py”, line 50, in
afile.write_frames(Signal)
File “_sndfile.pyx”, line 728, in scikits.audiolab.pysndfile._sndfile.Sndfile.write_frames (scikits/audiolab/pysndfile/_sndfile.c:6610)
ValueError: Expected 1 channels, got 2
hello !
it appearing that your audio file are in stereo, you can change it to mono or just change in the source the variable “nchannels = 1″ to “nchannels = 2″;
Olá, teria interesse em expandir seu scipt para um programa completo de reconhecimento de voz? Se quiser, me add no msn, eu estou planejando um software mais ou menos como uma cpu inteligente, apenas com o reconhecimento de voz, se quiser me ajudar, ficaria grato!!!
Boa tarde Eder… estou usando o seu script e realmente dá asas a liberdade. Estou testando uma URA com reconhecimento de voz e, se tudo der certo, vou tentar criar meio que uma pagina onde receberá a gravação do audio + a resposta do google para que seja realizada uma sintonia fina e as opções da URA ler esse banco. Isso seria para no caso de um usuario falar atendimento e o google entender atende mentos, receber esse log da gravação+responsta e cadastrar em uma base que isso quer dizer atendimento, fazendo com que o gotoif leia essa base para saber para onde encaminha, compreendeu? Vamos nos falando e parabens pelo trabalho.
Perfeito Rubens bom saber !
Não sei se você sabe mas o asterisk tem uma função regex que pode te ajudar no que você precisa !
Vamos lá olha só, usando o seu exemplo “atendimento” …
exten=>_11111111,1,Answer()
exten=>_11111111,n,eagi(pahh.py)
exten=>_11111111,n,GotoIf($[${EXISTS(${GoogleUtterance})}]?hello:bye)
exten=>_11111111,n(hello),NoOP(You Said = ${GoogleUtterance})
exten=>_11111111,n,Set(foo=${REGEX(“atend” ${TOLOWER(${GoogleUtterance})})})
exten=>_11111111,n,GotoIf($["${foo}" = "1"]?teste,s,1)
exten=>_11111111,n(bye),Hangup()
[teste]
exten => s,1,Playback(beep)
Veja que estou usando a função “REGEX” e “TOLOWER” do asterisk, a regex procura por expressões regulares estipuladas por você, neste caso eu coloquei “atend” então será uma expressão válida qualquer palavra derivada de “atend” ou seja (atendimento, atendi, atendo, atenda, etc, etc)
o tolower é usado para garantir que a frase do google fique em minusculo !
Eng Eder de Souza