Python: Runtime error: run loop already started
Я хочу написать для себя в качестве тренировки голосового ассистента, но столкнулся с проблемой - после того, как сказать ему какую-либо команду - он её не выполняет (хотя раньше выполнял), а после второй команды он выдаёт ошибку Python: Runtime error: run loop already started
Сам код:
def speak(what):
print( what )
speak_engine.say( what )
speak_engine.runAndWait()
#speak_engine.stop()
if speak_engine._inLoop:
speak_engine.endLoop()
def callback(recognizer, audio):
try:
voice = recognizer.recognize_google(audio, language = "ru-RU").lower()
print("[log] Распознано: " + voice)
if voice.startswith(opts["alias"]):
cmd = voice
for x in opts['alias']:
cmd = cmd.replace(x, "").strip()
for x in opts['tbr']:
cmd = cmd.replace(x, "").strip()
# распознаем и выполняем команду
cmd = recognize_cmd(cmd)
execute_cmd(cmd['cmd'])
except sr.UnknownValueError:
print("[log] Голос не распознан!")
except sr.RequestError as e:
print("[log] Неизвестная ошибка, проверьте интернет!")
def recognize_cmd(cmd):
RC = {'cmd': '', 'percent': 0}
for c,v in opts['cmds'].items():
for x in v:
vrt = fuzz.ratio(cmd, x)
if vrt > RC['percent']:
RC['cmd'] = c
RC['percent'] = vrt
return RC
def execute_cmd(cmd):
if cmd == 'ctime':
# сказать текущее время
now = datetime.datetime.now()
speak("Сейчас " + str(now.hour) + ":" + str(now.minute))
elif cmd == 'steam':
#запустить стим
speak("Запускаю стим")
os.system('D:/Steam/steam.exe')
elif cmd == 'discord':
#запустить дискорд
speak("Запускаю дискорд")
os.system('C:/Users/pk/AppData/Local/Discord/app-0.0.308/Discord.exe')
elif cmd == 'taskmgr':
#запустить диспетчер задач
speak("Запускаю диспетчер задач")
os.system('taskmgr.exe')
else:
print('Команда не распознана, повторите!')
# запуск
r = sr.Recognizer()
#m = sr.Microphone(device_index = 1)
with sr.Microphone(device_index = 1) as source:
r.adjust_for_ambient_noise(source)
speak_engine = pyttsx3.init()
voices = speak_engine.getProperty('voices')
speak_engine.setProperty('voice', voices[1].id)
# forced cmd test
#speak("looooool")
speak("Добро пожаловать, сэр")
speak("Слушаю.")
stop_listening = r.listen_in_background(sr.Microphone(device_index = 1), callback)
while True:
with sr.Microphone(device_index = 1) as source:
audio = r.listen(source)
callback(r, audio)
time.sleep(5)