сделал своего голосового асистента но он частично не работает

для того, чтобы асистент работал постоянно я использовал метод Recognizer.listen_in_background() из библеотеки speech_recognition

вот весь код

import pyttsx3
import os
import webbrowser
import time
import datetime
from fuzzywuzzy import fuzz
import speech_recognition as sr

opts = {
    "alias": ("джарвіс"),
    "tbr": ("давай","підемо","зроби","скажи","буде","ти","можеш","яка","включи","відкрий","сказати","зараз","який"),
    "cmds":{
        "ctime":("час","година","зараз часу"),
        "data":("дату","зараз дата","дата"),
        "video":("відео","ролик","відео ролик",),
        "youtube":("ютуб","youtube")

    }
}


def speak(what):
    print(what)
    speak_engine.say(what)
    speak_engine.runAndWait()
    speak_engine.stop()


def callback(recognizer, audio):
    try:

        voice = recognizer.recognize_google(audio, language="uk-UA").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()
            print(cmd)

            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):
    print(cmd)
    if cmd == 'ctime':
        # сказать текущее время
        now = datetime.datetime.now()
        speak("Сейчас " + str(now.hour) + ":" + str(now.minute))

    elif cmd == 'data':
        # воспроизвести радио
        speak("Сьогодні {}".format(datetime.datetime.now()))

    elif cmd == 'youtube':
        speak("Відкриваю")
        webbrowser.open("https://www.youtube.com/")


    else:
        print('Команда не распознана, повторите!')



r = sr.Recognizer()
m = sr.Microphone(device_index=2)

with m as source:
    r.adjust_for_ambient_noise(source)

speak_engine = pyttsx3.init()


voices = speak_engine.getProperty('voices')
# for i in range(len(voices)):
#     print(voices[i])
speak_engine.setProperty('voice', voices[0].id)


speak("Джарвис слушает")
stop_listening = r.listen_in_background(m, callback)
while True:
    time.sleep(0.1) # infinity loop


Но он работает только один два раза, а после не реагирует


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