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)

Ответы (0 шт):