Как сделать так, чтоб функция работала вечно?

Хотел сделать код на sr pyttsx, используя библиотеку гугла, и пока успехи нормальные. Но хотелось бы, чтобы прослушивание после функции speak не останавливалась. Что я пробовал: Ставить while True:

Подробно: Когда я начинаю использовать данную программу, то даю команду, ну допустим, " вк " - он открывает вк. Если бы просто было open.web...(vk.com, new=2), то он открыл и продолжил работу, но вот если в выполнении используется функция speak, то в этом случае код останавливает работу.

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


opts = {
    "alias": ('ангелина', 'ангелин', 'анька', 'ангелюсик', 'анг', 'angelina'),
    "cmds": {
        "ctime": ('время', 'сколько время', 'часы', 'какой сейчас час'),
        "relax": ('я устал', 'боже я так устал', 'включи музыку', 'хочу отдохнуть', 
                    'вруби музыку', 'я хочу устать', 'хочу отдохнуть','я реально задолбался') , 
        "food": ('хочу приготовить курочку', 'хотел бы приготовить', 'может приготовить?' ) ,
        "vk": ('вк', 'включи вк', 'включить вк', 'зайди в вк', 'вконтакте'),
        "league": ('лига легенд', 'лол', 'лоляха', 'лолиха', 'лал', 'лул', 'включи лол', 'зайди в лол', 'включи лигу легенд'),       
        "search": ('найди', 'поиск', 'запусти поиск'),
        "bd": ('плохо прошёл день', 'плохо', 'ничего нового', 'плохой')                                     
        }
    }

def speak(what):
    print("[Keylin]" + what)
    speak_engine.say( what )
    speak_engine.runAndWait()
    speak_engine.stop()

def callback(recognizer, audio):
    try:
        voice = r.recognize_google(audio, language='ru-RU').lower()
        print('Услышала: ' + voice)
        if voice.startswith(opts["alias"]):
            cmd = voice
            for x in opts["alias"]:
                cmd = cmd.replace(x, "").strip()
            
            cmd = recognize_cmd(cmd)
            execute_cmd(cmd['cmd'])
    except sr.UnknownValueError:
        print("Неизвестная комманда")

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 == 'relax':
        webbrowser.open('https://www.youtube.com/watch?v=5qap5aO4i9A', new=2)

        speak ("Намёк понят, Никита")
    elif cmd == 'food':
        speak ("Эх, может быть, я когда нибудь попробую человеческую еду. А так незнаю.")
    elif cmd == 'vk':
        webbrowser.open('http://vk.com', new=2)
        speak("Открываю, сэр.")
    elif cmd == 'league':
        os.startfile(r'C:/Riot Games/League of Legends/LeagueClient.exe')
        speak('Запускаю.')
    elif cmd == 'search':
        text = input(str("Введите текст для перевода: "))
        webbrowser.open('https://translate.google.com/?hl=ru#view=home&op=translate&sl=en&tl=ru&text=' + text, new=2)
    elif cmd == 'bd':
        speak('Сочувствую. ')
    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()

speak("Приветствую хозяин, как прошёл день?")

stop_listening = r.listen_in_background(m, callback)
while True: time.sleep(0.1)

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