Biblioteca de reconocimiento de voz de Python – ¿Siempre escucha?

Recientemente he estado trabajando en el uso de una biblioteca de reconocimiento de voz en Python para iniciar aplicaciones. Tengo la intención de usar la biblioteca para la automatización del hogar activada por voz utilizando la Raspberry Pi GPIO.

Tengo este trabajo, detecta mi voz y lanza la aplicación. El problema es que parece colgar de la palabra que digo (por ejemplo, digo internet y se lanza un número infinito de veces)

Este es un comportamiento inusual de lo que he visto mientras bucles. No puedo averiguar cómo detenerlo en bucle. ¿Necesito hacer algo fuera del circuito para que funcione correctamente? Por favor, consulte el código de abajo.

http://pastebin.com/auquf1bR

import pyaudio,os import speech_recognition as sr r = sr.Recognizer() with sr.Microphone() as source: audio = r.listen(source) def excel(): os.system("start excel.exe") def internet(): os.system("start chrome.exe") def media(): os.system("start wmplayer.exe") def mainfunction(): user = r.recognize(audio) print(user) if user == "Excel": excel() elif user == "Internet": internet() elif user == "music": media() while 1: mainfunction() 

    Por si acaso, este es el ejemplo sobre cómo escuchar continuamente las palabras clave en pocketsphinx, esto va a ser mucho más fácil que enviar audio a Google continuamente. Y podrías tener una solución mucho más flexible.

     import sys, os, pyaudio from pocketsphinx import * modeldir = "/usr/local/share/pocketsphinx/model" # Create a decoder with certain model config = Decoder.default_config() config.set_string('-hmm', os.path.join(modeldir, 'hmm/en_US/hub4wsj_sc_8k')) config.set_string('-dict', os.path.join(modeldir, 'lm/en_US/cmu07a.dic')) config.set_string('-keyphrase', 'oh mighty computer') config.set_float('-kws_threshold', 1e-40) decoder = Decoder(config) decoder.start_utt('spotting') stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024) stream.start_stream() while True: buf = stream.read(1024) decoder.process_raw(buf, False, False) if decoder.hyp() != None and decoder.hyp().hypstr == 'oh mighty computer': print "Detected keyword, restarting search" decoder.end_utt() decoder.start_utt('spotting') 

    El problema es que solo escuchas el habla una vez al principio del progtwig y luego simplemente llamas a recognize en el mismo bit de audio guardado. Mueve el código que realmente escucha la voz en el bucle while:

     import pyaudio,os import speech_recognition as sr def excel(): os.system("start excel.exe") def internet(): os.system("start chrome.exe") def media(): os.system("start wmplayer.exe") def mainfunction(source): audio = r.listen(source) user = r.recognize(audio) print(user) if user == "Excel": excel() elif user == "Internet": internet() elif user == "music": media() if __name__ == "__main__": r = sr.Recognizer() with sr.Microphone() as source: while 1: mainfunction(source) 

    He pasado mucho tiempo trabajando en este tema.

    Actualmente estoy desarrollando un progtwig de asistente virtual multiplataforma de código abierto de Python 3 llamado Athena Voice: https://github.com/athena-voice/athena-voice-client

    Los usuarios pueden usarlo como Siri, Cortana o Amazon Echo.

    También utiliza un sistema de “módulo” muy simple donde los usuarios pueden escribir fácilmente sus propios módulos para mejorar su funcionalidad. Déjame saber si eso podría ser de utilidad.

    De lo contrario, recomiendo buscar en los paquetes de voz a texto / texto a voz de Pocketsphinx y Python de Google.

    En Python 3.4, Pocketsphinx se puede instalar con:

     pip install pocketsphinx 

    Sin embargo, debe instalar la dependencia de PyAudio por separado (descarga no oficial): http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio

    Ambos paquetes de google se pueden instalar usando el comando:

     pip install SpeechRecognition gTTS 

    Google STT: https://pypi.python.org/pypi/SpeechRecognition/

    Google TTS: https://pypi.python.org/pypi/gTTS/1.0.2

    Pocketsphinx debe usarse para el reconocimiento de palabras despertadas fuera de línea, y Google STT debe usarse para escuchar de forma activa.

    Eso es triste, pero tienes que inicializar el micrófono en cada bucle y, desde entonces, este módulo siempre tiene r.adjust_for_ambient_noise(source) , lo que garantiza que entiende tu voz también en una habitación ruidosa. Establecer el umbral lleva tiempo y puede omitir algunas de sus palabras, si está dando órdenes continuamente

     import pyaudio,os import speech_recognition as sr r = sr.Recognizer() def excel(): os.system("start excel.exe") def internet(): os.system("start chrome.exe") def media(): os.system("start wmplayer.exe") def mainfunction(): with sr.Microphone() as source: r.adjust_for_ambient_noise(source) audio = r.listen(source) user = r.recognize(audio) print(user) if user == "Excel": excel() elif user == "Internet": internet() elif user == "music": media() while 1: mainfunction()