我最近一直在使用python中的语音识别库来启动应用程序。我打算最终使用Raspberry Pi GPIO将库用于语音激活的家庭自动化。
我有这个工作,它检测我的声音并启动应用程序。问题是它似乎挂在我说的一个词上(例如,我说互联网并且它无限次地启动了chrome)
这是我在while循环中看到的异常行为。我无法弄清楚如何阻止它循环。我是否需要在循环中做一些事情以使其正常工作?请参阅下面的代码。
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()
答案 0 :(得分:9)
以防万一,以下是如何在pocketsphinx中持续监听关键字的示例,这比连续向谷歌发送音频更容易。 而且你可以采用更灵活的解决方案。
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')
答案 1 :(得分:8)
问题是你实际上只在程序开始时听一次语音,然后只是在保存的音频的同一位上反复调用recognize
。将实际侦听语音的代码移动到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)
答案 2 :(得分:2)
我花了很多时间研究这个问题。
目前我正在开发一个名为Athena Voice的Python 3开源跨平台虚拟助手程序: https://github.com/athena-voice/athena-voice-client
用户可以像Siri,Cortana或Amazon Echo一样使用它。
它还使用了一个非常简单的"模块"用户可以轻松编写自己的模块以增强其功能的系统。如果可能有用,请告诉我。
否则,我建议您查看Pocketsphinx和Google的Python语音转文本/文本转语音包。
在Python 3.4上,Pocketsphinx可以安装:
pip install pocketsphinx
但是,您必须单独安装PyAudio依赖项(非官方下载): http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio
可以使用以下命令安装两个Google软件包:
pip install SpeechRecognition gTTS
Google STT:https://pypi.python.org/pypi/SpeechRecognition/
Google TTS:https://pypi.python.org/pypi/gTTS/1.0.2
Pocketsphinx应该用于离线唤醒 - 单词识别,Google STT应该用于主动聆听。
答案 3 :(得分:0)
这很可悲,但是您必须在每个循环中初始化麦克风,因为此模块始终具有r.adjust_for_ambient_noise(source)
,这可以确保它也能在嘈杂的房间中理解您的声音。如果您不断发出命令,设置阈值会花费一些时间,并且可能会跳过您的某些话
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()