from gtts import gTTS
import random
import time
import playsound
import speech_recognition as sr
import pyautogui as pg
def listen_command():
# obtain audio from the microphone
r = sr.Recognizer()
with sr.Microphone() as source:
print("Скажите вашу команду: ")
audio = r.listen(source)
# recognize speech using Google Speech Recognition
try:
our_speech = r.recognize_google(audio, language="ru")
print("Вы сказали: " + our_speech)
return our_speech
except sr.UnknownValueError:
return "ошибка"
except sr.RequestError:
return "ошибка"
class VoiceCommandList: # класс управляет списком голосовых команд
def __init__(self):
self.actions = list() # список известных классу команд
def on(self, condition): # декоратор, подписывает функцию на голосовую команду
if isinstance(condition, str):
condition = condition.lower()
predicate = lambda text: condition in text # если условие - строка, она должна входить в текст
elif callable(condition):
predicate = condition # если условие - функция, она должна вернуть истину для текста
else: # ни то ни другое - ошибка
raise TypeError('Condition must be either string or function!')
# эта функция - декоратор, она будет помечать функции-команды.
# она описана именно внутри метода on()!
def decorator(command_func):
self.actions.append((predicate, command_func))
return command_func
return decorator
def run_command(self, text): # функция получает строку, определяет и вызывает соотв. её команду
text = text.lower()
for predicate, command in self.actions:
if predicate(text): # текст соответствует известной команде
try:
response = command(text) # пытаемся выполнить команду
if response is None: # если команда не сообщила нам, что ответить
response = "Команда выполнена"
except Exception as err: # не получилось
response = "Ошибка при выполнении команды"
print(err)
if response: # если есть какой-то ответ
say_message(response) # то произносим его
break # выполняем не более одной команды за раз
else: # этот else относится к for, не к if! Если не нашли ни одной похожей команды
say_message("Неизвестная команда")
vcl = VoiceCommandList() #экземпляр списка команд
#опишем реакцию на простую строку типа "привет".
@vcl.on('привет') #если передаём в декоратор строку - это означает, что строка должна содержаться в тексте
def hello(text): #функция-команда принимает аргумент - сказанный пользователем текст
return "Доброе время суток" #она должна вернуть текст, который скажет бот
@vcl.on('открой оперу')
def start_opera(text):
operaopen() #выполняем действие
return "Браузер запущен" #возвращаем текст ответа
@vcl.on('напиши')
def write_message(text):
print(text)
#если ничего не вернём, будет отклик по умолчанию
@vcl.on(lambda text: ('влево' in text) and ('вправо' in text)) #можно делать сложные условия!
def what(text):
return "Так влево или вправо?"
def right_mouse_control():
pg.move(300, 0, 0.5)
def left_mouse_control():
pg.move(-300, 0, 0.5)
def down_mouse_control():
pg.move(0, 300, 0.5)
def up_mouse_control():
pg.move(0, -300, 0.5)
def operaopen():
pg.leftClick(-1872, 249)
pg.doubleClick(-1872, 249, 0.5)
def operaclose():
pg.leftClick(-20, 130)
def say_message(message):
voice = gTTS(message, lang="ru")
file_voice_name = "_audio_" + str(time.time()) + "_" + str(random.randint(0, 100000)) + ".mp3"
voice.save(file_voice_name)
playsound.playsound(file_voice_name)
print("Голосовой ассистент: " + message)
def pos():
print(pg.position())
if __name__ == '__main__':
while True:
command = listen_command()
vcl.run_command()