Выполняется только первая голосовая команда
В данный момент я, с помощью библиотек SpeechRecognition pyttsx3 пытаюсь создать голосового ассистента, который будет выполнять некоторые команды (в данный момент их три) но несмотря на простоту кода, он почему-то работает неправильно.
Вот код...
import os
import sys
import webbrowser
import pyttsx3
def openFile_orProgram(dir):
try:
os.startfile(dir)
except Exception as e:
print(str(e))
def closeFile_orProgram(name_of_program):
try:
os.system("TASKKILL /F /IM " + name_of_program)
except Exception as e:
print(str(e))
def talk(word):
print("[log]Jarvis - " + word)
engine = pyttsx3.init()
engine.say(word)
engine.runAndWait()
def recognize_cmd():
r = sr.Recognizer()
m = sr.Microphone(device_index=1)
with m as source:
print("---------")
r.pause_threshold = 0.5
r.adjust_for_ambient_noise(source, duration=1)
audio = r.listen(source)
try:
cmd = r.recognize_google(audio, language='en-EN').lower()
print("[log]User - " + cmd + '\n---------')
except sr.UnknownValueError:
talk("Voice is not recognized!")
cmd = recognize_cmd()
return cmd
def execute_cmd(cmd):
if 'open google' or 'open chrome' or 'open google chrome' in cmd:
openFile_orProgram('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk')
elif 'close google' or 'close chrome' or 'close google chrome' in cmd:
closeFile_orProgram('chrome.exe')
elif 'stop' in cmd:
talk("Good bye...")
sys.exit()
talk('Good day my Master')
print('---------')
talk('Jarvis is listening and ready to do everything')
while True:
execute_cmd(recognize_cmd())
В функции execute_cmd() пока что есть только три команды, и в любом случаи выполняется только первый
Я это выяснил меняя череду if-ов в коде функции и каждый раз при любой команде, даже не существующей, выполнялась только первая команда.
Помогите исправить, заранее спасибо!
Ответы (2 шт):
Не верно пишите условия в execute_cmd, нужно так:
def execute_cmd(cmd):
if 'open google' in cmd or 'open chrome' in cmd or 'open google chrome' in cmd:
openFile_orProgram('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk')
elif 'close google' in cmd or 'close chrome' in cmd or 'close google chrome' in cmd:
closeFile_orProgram('chrome.exe')
elif 'stop' in cmd:
talk("Good bye...")
sys.exit()
p.s. вариант приведенный в вашем коде будет всегда возвращать первую строку из условия, например 'open google', которая в операторе if будет воспринята как True и соответственно всегда выполняется только первое условие
Или же ещё один способ реализации, чтобы не писать условие на каждую команду:
cmd = 'open google'
OPEN_GOOGLE_COMMANDS = ['open google', 'open chrome', 'open google chrome']
if any([(command in cmd) for command in OPEN_GOOGLE_COMMANDS]):
# open google chrome
pass
Можно сделать намного проще.
def execute_cmd(cmd):
if cmd in ['open chrome','open chrome','open google chrome':
openFile_orProgram('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk')
elif cmd in ['close google','close chrome','close google chrome']:
closeFile_orProgram('chrome.exe')
elif cmd in ['stop','good bye']:
talk("Good bye...")
sys.exit()
Таким образом вы ищите cmd в списке команд это удобнее