сделал своего голосового асистента но он частично не работает
для того, чтобы асистент работал постоянно я использовал метод 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
Но он работает только один два раза, а после не реагирует