Делать голосовой помощник на python - PullRequest
0 голосов
/ 07 апреля 2020

Мне нужна помощь. Я следовал одному из руководств. У меня есть голосовой помощник, но он выполняет только одну команду, а затем ничего не делает. Можете ли вы помочь мне заставить его слушать вечно. Так что он всегда будет слушать, но выключать только, когда я его закрываю. 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)

1 Ответ

0 голосов
/ 09 апреля 2020

Я должен был сделать speak_engine = pyttsx3.init() не в почти конце кода, а поместить его в speak()

...