· 4 years ago · Jun 01, 2021, 10:36 AM
1import pyttsx3
2import speech_recognition as sr
3import colorama
4from fuzzywuzzy import fuzz
5import datetime
6from os import system
7import sys
8from random import choice
9from pyowm import OWM
10from pyowm.utils.config import get_default_config
11import webbrowser
12import configparser
13
14
15class Assistant:
16
17 settings = configparser.ConfigParser()
18 settings.read('settings.ini')
19
20 config_dict = get_default_config() # Инициализация get_default_config()
21 config_dict['language'] = 'ru' # Установка языка
22
23 def __init__(self):
24 self.engine = pyttsx3.init()
25 self.r = sr.Recognizer()
26 self.text = ''
27
28 self.cmds = {
29 ('текущее время', 'сейчас времени', 'который час'): self.time,
30 ('привет', 'добрый день', 'здравствуй'): self.hello,
31 ('пока', 'вырубись'): self.quite,
32 ('выключи компьютер', 'выруби компьютер'): self.shut,
33 ('какая погода', 'погода', 'погода на улице', 'какая погода на улице'): self.weather,
34 }
35
36 self.ndels = ['морган', 'морген', 'моргэн', 'морг', 'ладно', 'не могла бы ты', 'пожалуйста',
37 'текущее', 'сейчас']
38
39 self.commands = [
40 'текущее время', 'сейчас времени', 'который час',
41 'открой браузер', 'открой интернет', 'запусти браузер',
42 'привет', 'добрый день', 'здравствуй',
43 'пока', 'вырубись',
44 'выключи компьютер', 'выруби компьютер',
45 'какая погода', 'погода', 'погода на улице', 'какая погода на улице',
46 ]
47
48 self.num_task = 0
49 self.j = 0
50 self.ans = ''
51
52 def cleaner(self, text):
53 self.text = text
54
55 for i in self.ndels:
56 self.text = self.text.replace(i, '').strip()
57 self.text = self.text.replace(' ', ' ').strip()
58
59 self.ans = self.text
60
61 for i in range(len(self.commands)):
62 k = fuzz.ratio(text, self.commands[i])
63 if (k > 70) & (k > self.j):
64 self.ans = self.commands[i]
65 self.j = k
66
67 return str(self.ans)
68
69 def recognizer(self):
70 self.text = self.cleaner(self.listen())
71 print(self.text)
72
73 if self.text.startswith(('открой', 'запусти', 'зайди', 'зайди на')):
74 self.opener(self.text)
75
76 for tasks in self.cmds:
77 for task in tasks:
78 if fuzz.ratio(task, self.text) >= 80:
79 self.cmds[tasks]()
80
81 self.engine.runAndWait()
82 self.engine.stop()
83
84 def time(self):
85 now = datetime.datetime.now()
86 self.talk("Сейчас " + str(now.hour) + ":" + str(now.minute))
87
88 def opener(self, task):
89 links = {
90 ('youtube', 'ютуб', 'ютюб'): 'https://youtube.com/',
91 ('вк', 'вконтакте', 'контакт', 'vk'): 'https:vk.com/feed',
92 ('браузер', 'интернет', 'browser'): 'https://google.com/',
93 ('insta', 'instagram', 'инста', 'инсту'): 'https://www.instagram.com/',
94 ('почта', 'почту', 'gmail', 'гмейл', 'гмеил', 'гмаил'): 'http://gmail.com/',
95 }
96 j = 0
97 if 'и' in task:
98 task = task.replace('и', '').replace(' ', ' ')
99 double_task = task.split()
100 if j != len(double_task):
101 for i in range(len(double_task)):
102 for vals in links:
103 for word in vals:
104 if fuzz.ratio(word, double_task[i]) > 75:
105 webbrowser.open(links[vals])
106 self.talk('Открываю ' + double_task[i])
107 j += 1
108 break
109
110 def cfile(self):
111 try:
112 cfr = Assistant.settings['SETTINGS']['fr']
113 if cfr != 1:
114 file = open('settings.ini', 'w', encoding='UTF-8')
115 file.write('[SETTINGS]\ncountry = UA\nplace = Kharkov\nfr = 1')
116 file.close()
117 except Exception as e:
118 print('Перезапустите Ассистента!', e)
119 file = open('settings.ini', 'w', encoding='UTF-8')
120 file.write('[SETTINGS]\ncountry = UA\nplace = Kharkov\nfr = 1')
121 file.close()
122
123 def quite(self):
124 self.talk(choice(['Надеюсь мы скоро увидимся', 'Рада была помочь', 'Пока пока', 'Я отключаюсь']))
125 self.engine.stop()
126 system('cls')
127 sys.exit(0)
128
129 def shut(self):
130 self.talk("Подтвердите действие!")
131 text = self.listen()
132 print(text)
133 if (fuzz.ratio(text, 'подтвердить') > 60) or (fuzz.ratio(text, "подтверждаю") > 60):
134 self.talk('Действие подтверждено')
135 self.talk('До скорых встреч!')
136 system('shutdown /s /f /t 10')
137 self.quite()
138 elif fuzz.ratio(text, 'отмена') > 60:
139 self.talk("Действие не подтверждено")
140 else:
141 self.talk("Действие не подтверждено")
142
143 def hello(self):
144 self.talk(choice(['Привет, чем могу помочь?', 'Здраствуйте', 'Приветствую']))
145
146 def weather(self):
147
148 place = Assistant.settings['SETTINGS']['place']
149 country = Assistant.settings['SETTINGS']['country'] # Переменная для записи страны/кода страны
150 country_and_place = place + ", " + country # Запись города и страны в одну переменную через запятую
151 owm = OWM('ВАШ API KEY') # Ваш ключ с сайта open weather map
152 mgr = owm.weather_manager() # Инициализация owm.weather_manager()
153 observation = mgr.weather_at_place(country_and_place)
154 # Инициализация mgr.weather_at_place() И передача в качестве параметра туда страну и город
155
156 w = observation.weather
157
158 status = w.detailed_status # Узнаём статус погоды в городе и записываем в переменную status
159 w.wind() # Узнаем скорость ветра
160 humidity = w.humidity # Узнаём Влажность и записываем её в переменную humidity
161 temp = w.temperature('celsius')[
162 'temp'] # Узнаём температуру в градусах по цельсию и записываем в переменную temp
163 self.talk("В городе " + str(place) + " сейчас " + str(status) + # Выводим город и статус погоды в нём
164 "\nТемпература " + str(
165 round(temp)) + " градусов по цельсию" + # Выводим температуру с округлением в ближайшую сторону
166 "\nВлажность составляет " + str(humidity) + "%" + # Выводим влажность в виде строки
167 "\nСкорость ветра " + str(w.wind()['speed']) + " метров в секунду") # Узнаём и выводим скорость ветра
168
169 def talk(self, text):
170 print(text)
171 self.engine.say(text)
172 self.engine.runAndWait()
173
174 def listen(self):
175 with sr.Microphone() as source:
176 print(colorama.Fore.LIGHTGREEN_EX + "Я вас слушаю...")
177 self.r.adjust_for_ambient_noise(source)
178 audio = self.r.listen(source)
179 try:
180 self.text = self.r.recognize_google(audio, language="ru-RU").lower()
181 except Exception as e:
182 print(e)
183 return self.text
184
185
186Assistant().cfile()
187
188
189while True:
190 Assistant().recognizer()
191