Início > DSP, Programação > Accessing the Google Speech API + Python

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

Categorias:DSP, Programação Tags:,
  1. Alexandre
    janeiro 11, 2012 às 11:58 pm

    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

    • ederwander
      janeiro 12, 2012 às 8:24 am

      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

  2. Alexandre
    janeiro 12, 2012 às 10:58 am

    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.

  3. Alexandre
    janeiro 12, 2012 às 11:48 am

    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

  4. Alexandre
    janeiro 12, 2012 às 11:54 am

    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

  5. Alexandre
    janeiro 12, 2012 às 10:08 pm

    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é +

    • ederwander
      janeiro 12, 2012 às 10:28 pm

      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

  6. Alexandre
    janeiro 13, 2012 às 12:36 am

    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

  7. Thiago Ramalho
    março 26, 2012 às 11:05 am

    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

  8. Thiago Ramalho
    março 26, 2012 às 11:27 am

    O módulo AudioLab só está disponível para o Python2.6 ?

  9. Thiago Ramalho
    março 26, 2012 às 4:04 pm

    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

  10. Thiago Ramalho
    março 28, 2012 às 11:00 am

    Instalei todas as dependências, mas ainda está dando esse error:

    ImportError: DLL load failed: The specified module could not be found.

    • ederwander
      março 28, 2012 às 11:30 am

      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…

      • Thiago Ramalho
        março 28, 2012 às 2:34 pm

        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!

  11. Thiago Ramalho
    abril 2, 2012 às 5:49 pm

    This is possible in Java?

    • ederwander
      abril 2, 2012 às 6:53 pm

      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

  12. maio 15, 2012 às 2:55 pm

    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

    • ederwander
      maio 15, 2012 às 3:11 pm

      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”;
      🙂

  13. fernando
    agosto 17, 2012 às 12:57 pm

    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!!!

  14. Rubens Almeida
    outubro 9, 2012 às 2:33 pm

    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.

    • ederwander
      outubro 9, 2012 às 3:00 pm

      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

  1. janeiro 10, 2012 às 12:10 pm

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: