Делаем голосового помощника на питоне

Мне нужна помощь. Я следовал одному из руководств. У меня есть голосовой помощник, но он выполняет только одну команду и больше ничего не делает. Можешь помочь мне заставить его слушать вечно. Так вот, он всегда будет слушать, но выключится только тогда, когда я его закрою. PS: Пожалуйста, не обращайте внимания на другие языковые слова. Вот мой код:

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

opts = {
    "alias": ("петя", "петечка", "петюлечка", "петрович", "петич", "петр", "петька", "петь"),
    "tbr": ("скажи", "расскажи", "покажи", "сколько", "произнеси"),
    "cmds": {
        "ctime": ("текущее время", "сейчас времени", "который час"),
        "radio": ("включи музыку", "воспроизведи радио", "включи радио"),
        "stupid1": ("расскажи анекдот")
    }
}

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

def callback(recongizer, audio):
    try:
        voice = recongizer.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 = recongize_cmd(cmd)
            execute_cmd(cmd['cmd'])
    except sr.UnknownValueError:
        print("[log] Голос не распознан!")
    except sr.RequestError as e:
        print("[log] Неизвестная ошибка, проверьте интернет")
def recongize_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 == 'radio':
        # воспроизвести радио
        os.system("D:\\Jarvis\\res\\radio_record.m3u")
    elif cmd == 'stupid1':
        speak("Мой разработчик не научил меня анекдотам ... Ха ха ха")
    else:
        print('Команда не распознана, повторите!')

r = sr.Recognizer()
m = sr.Microphone(device_index=1)
with m as sourse:
    r.adjust_for_ambient_noise(sourse)



speak_engine = pyttsx3.init()

speak("Привет")
speak("Петя слушает")

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

person Resadesker    schedule 07.04.2020    source источник
comment
можно ссылку на учебник?   -  person gnahum    schedule 07.04.2020
comment
Это русский учебник youtube.com/watch?v=YeS755SPSI8&t=77s   -  person Resadesker    schedule 07.04.2020
comment
Ok. Позвольте мне попытаться воспроизвести это и вернуться к вам.   -  person gnahum    schedule 07.04.2020
comment
Под видео есть исходный код   -  person Resadesker    schedule 07.04.2020
comment
Здесь - pastebin.com/tPD0g802   -  person Resadesker    schedule 07.04.2020
comment
Вы просто раскомментируете некоторые # там   -  person Resadesker    schedule 07.04.2020
comment
В speak я не думаю, что вам нужен speak_engine.stop()   -  person gnahum    schedule 07.04.2020


Ответы (1)


Мне пришлось сделать speak_engine = pyttsx3.init() не почти в конце кода, а поместить его в speak()

person Resadesker    schedule 09.04.2020