Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Импорт всех необходимых модулей
- import speech_recognition as sr # Модуль для прослушивания микрофона
- import pyttsx3 # Модуль для воспроизведения текста в речь
- import datetime # Модуль для определения время
- from fuzzywuzzy import fuzz #модуль для сравнения текста
- import random #модуль для случайной выборки
- from pyowm import OWM #модуль для погоды
- from pyowm.utils.config import get_default_config #модуль для настроек погоды
- from os import system
- import sys
- import webbrowser
- owm_token = 'd08d7842d66c305cd6fb9d0023424dc4' # Ваш ключ с сайта open weather map
- class Assistant():
- def __init__(self):
- # Глобальные переменные
- self.rec = sr.Recognizer() # движок для распознавания речи
- self.engine = pyttsx3.init() # движок для синтеза речи
- self.voices = self.engine.getProperty('voices') # все доступные голоса
- self.asssistantVoice = 'Artemiy' # голос ассистента
- # настройки
- self.myCity = "нижний новгород"
- self.names = ['томас', 'томэс', 'помощник', 'ассистент']
- self.ndels = ['ладно', 'не могла бы ты', 'пожалуйста','сколько']
- self.cmds = {
- ('сейчас времени', 'который час', 'текущее время'): self.time,
- ('привет', 'добрый день', 'здравствуй'): self.hello,
- ('какая погода', 'погода', 'погода на улице', 'какая погода на улице'): self.weather,
- ('пока', 'вырубись'): self.quite,
- ('выключи компьютер', 'выруби компьютер'): self.shut,
- }
- def listen(self):
- text = ''
- with sr.Microphone() as source: # подключаемся к микрофону
- print("Скажите что-нибудь...") # запрашиваем текст
- self.rec.adjust_for_ambient_noise(source) # Этот метод нужен для автоматического понижени уровня шума
- audio = self.rec.listen(source) # сохраняем аудио
- try:
- text = self.rec.recognize_google(audio, language="ru-RU") # распознаём текст
- text = text.lower() # переводим в нижний регистр
- except sr.UnknownValueError:
- pass
- print(text) # выводим распознанный текст
- return text
- def cleaner(self, text):
- cmd = ''
- for name in self.names: # цикл по именам
- if text.startswith(name): # Проверка начинается ли фраза с имени Ассистента
- cmd = text.replace(name, '').strip() # записываем в команду текст без имени
- for i in self.ndels: # цикл по ненужным словам
- cmd = cmd.replace(i, '').strip() # удаляем слово
- cmd = cmd.replace(' ', ' ').strip() # удаляем лишние пробелы
- return cmd # возвращаем готовую команду
- def recognizer(self):
- text = self.listen() # слушаем речь
- cmd = self.cleaner(text) # очищаем речь от лишнего
- if cmd.startswith(('открой', 'запусти', 'зайди', 'зайди на')):
- self.opener(text)
- for tasks in self.cmds: # цикл по командам
- for task in tasks: # цикл по фразам
- if fuzz.ratio(task, cmd) >= 80: # Проверка: если фразы похожи на 80%
- self.cmds[tasks]() # запускаем функцию
- break
- def talk(self,speech):
- # устанавливаем параметры речи
- self.engine.setProperty('voice', 'ru') # язык речи
- self.engine.setProperty('rate', 150) # скорость речи
- self.engine.setProperty('volume', 0.7) # громкость
- self.engine.setProperty('stress_marker', True) # ударения
- # устанавливаем голос
- for voice in self.voices:
- if voice.name == self.asssistantVoice:
- self.engine.setProperty('voice', voice.id)
- self.engine.say(speech) # передаём текст, который нужно сказать
- self.engine.runAndWait() # запускаем озвучку
- print(speech) # Вывод сказанного текста на экран
- def time(self):
- now = datetime.datetime.now() # Сохраняем текущее время
- text = "Сейчас " + str(now.hour) + ":" + str(now.minute) # формируем тект для озвучки
- self.talk(text) # озвучиваем время
- def hello(self):
- text=['Привет, чем могу помочь?', 'Здраствуйте', 'Приветствую','Хеллоу'] #список приветсвий
- say = random.choice(text) #выбираем случайную фразу
- self.talk(say) #запускаем озвучку
- def weather(self):
- config_dict = get_default_config() #запрашиваем настройки
- config_dict['language'] = 'ru' #меняем язык
- owm = OWM(owm_token, config_dict) # подключаемся к серверу
- mgr = owm.weather_manager() # Инициализация owm.weather_manager()
- observation = mgr.weather_at_place(self.myCity) # подключаемся кпогоде конкретного города
- weather = observation.weather # запрашиваем погоду
- temp = weather.temperature('celsius')['temp'] # Узнаём температуру в градусах по цельсию
- feels= weather.temperature('celsius')['feels_like'] # Узнаём температуру "ощущается" в градусах по цельсию
- temp = round(temp) # округляем температуру до целых чисел
- feels= round(feels) # округляем температуру до целых чисел
- status = weather.detailed_status # Узнаём статус погоды в городе
- wind = weather.wind()['speed'] # Узнаем скорость ветра
- humidity = weather.humidity # Узнаём Влажность
- text = "В городе " + self.myCity + " сейчас " + str(status) + "\nТемпература " + str(temp) + " градусов по цельсию" +\
- "\nВлажность составляет " + str(humidity) + "%" + "\nСкорость ветра " + str(wind) + " метров в секунду"
- self.talk(text)
- def opener(self, task):
- #словарь с сайтами
- links = {
- ('youtube', 'ютуб', 'ютюб'): 'https://youtube.com/',
- ('вк', 'вконтакте', 'контакт', 'vk'): 'https:vk.com/feed',
- ('браузер', 'интернет', 'browser'): 'https://google.com/',
- ('insta', 'instagram', 'инста', 'инсту'): 'https://www.instagram.com/',
- ('почта', 'почту', 'gmail', 'гмейл', 'гмеил', 'гмаил'): 'http://gmail.com/',
- }
- if 'и' in task:#убираем из запроса "и"
- task = task.replace('и', '').replace(' ', ' ')
- task=task.split() #разделяем запрос на отдельные слова
- for t in task: #цикл по запросу
- for vals in links: #цикл по словарю со ссылками
- for word in vals: #цикл по словам для запуска
- if fuzz.ratio(word, t) > 75: #если слово похоже на запрос
- webbrowser.open(links[vals]) #открываем ссылку в браузере
- self.talk('Открываю ' + t) #сообщаем об открытии
- break
- def quite(self):
- text=['Надеюсь мы скоро увидимся', 'Рада была помочь', 'Пока пока', 'Я отключаюсь']#список прощальных слов
- say= random.choice(text) #выбираем случайную фразу
- self.talk(say)#запускаем озвучку
- self.engine.stop() #выключаем движок озвучки
- sys.exit(0) #выключаем программу
- def shut(self):
- self.talk("Подтвердите действие!") #запрашиваем подтверждение
- text = self.listen() #слушаем ответ
- print(text)#выводим ответ
- #запускаем проверку: если ответ похож на подтвердить или подтверждаю
- if (fuzz.ratio(text, 'подтвердить') > 60) or (fuzz.ratio(text, "подтверждаю") > 60):
- self.talk('Действие подтверждено')
- system('shutdown /s /f /t 10') #выключаем компьютер
- self.quite() #ассистент попрощался
- elif fuzz.ratio(text, 'отмена') > 60:
- self.talk("Действие не подтверждено")
- else:
- self.talk("Действие не подтверждено")
- def restart_pc(self):
- self.talk("Подтвердите действие!")
- text = self.listen()
- print(text)
- if (fuzz.ratio(text, 'подтвердить') > 60) or (fuzz.ratio(text, "подтверждаю") > 60):
- self.talk('Действие подтверждено')
- system('shutdown /r /f /t 10 /c "Перезагрузка будет выполнена через 10 секунд"')
- self.quite()
- elif fuzz.ratio(text, 'отмена') > 60:
- self.talk("Действие не подтверждено")
- else:
- self.talk("Действие не подтверждено")
- while True:
- tomas = Assistant() # создаём объект класса
- tomas.recognizer() # запускаем распознвание команд
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement