├── PyAudio-0.2.11-cp38-cp38-win32.whl ├── README.md ├── chromedriver.exe ├── libraries.bat ├── main.py └── start.bat /PyAudio-0.2.11-cp38-cp38-win32.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paveldat/Dobbie/a51a7fa681a71ae02dbbcb6464b17f408dd6d79a/PyAudio-0.2.11-cp38-cp38-win32.whl -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dobbie 2 | The essence of the project is to create a voice assistant to help students. Often, in addition to educational sites, students visit sites for leisure activities (YouTube and others). This assistant will make it easier and more comfortable (as well as the transition to strange sites like the muddle of your institute). 3 | 4 | 5 | First of all, you need to download all the files from github or from the archive. Unpack everything into one folder (the name does not matter). 6 | The next step is to run the bat file. Open the libraries.bat file. The console should open and the installation of all the necessary libraries will start downloading. After installation, the console should automatically close (if not, close it yourself). 7 | Now you need to familiarize yourself with Dobby's commands, they are written in the readme (there is also a guide for installing and running there). 8 | Run start.bat and talk to Dobby. 9 | 10 | # Instalation 11 | 1. Move all files to one directory 12 | 2. Start libraries.bat for installation all libraries you need 13 | 3. Start start.bat and enjoy :) 14 | 15 | # Author 16 | Pavel Dat 17 | -------------------------------------------------------------------------------- /chromedriver.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paveldat/Dobbie/a51a7fa681a71ae02dbbcb6464b17f408dd6d79a/chromedriver.exe -------------------------------------------------------------------------------- /libraries.bat: -------------------------------------------------------------------------------- 1 | python -m pip install -U pip 2 | pip install pyttsx3 3 | pip install SpeechRecognition 4 | pip install fuzzywuzzy 5 | pip install PyAudio-0.2.11-cp38-cp38-win32.whl 6 | pip install wikipedia 7 | pip install opencv-python 8 | pip install PyAutoGUI 9 | pip install selenium -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import pyttsx3 2 | import webbrowser 3 | import smtplib 4 | import random 5 | import speech_recognition as sr 6 | import wikipedia 7 | import datetime 8 | import os 9 | import sys 10 | import requests 11 | import math as mt 12 | import cv2 13 | import pyautogui 14 | import time 15 | from selenium import webdriver 16 | from selenium.common.exceptions import NoSuchElementException 17 | from selenium.webdriver.common.by import By 18 | from selenium.webdriver.support.ui import WebDriverWait 19 | from selenium.webdriver.support import expected_conditions as EC 20 | 21 | 22 | engine = pyttsx3.init('sapi5') 23 | 24 | def speak(audio): 25 | print('Добби: ' + audio) 26 | engine.say(audio) 27 | engine.runAndWait() 28 | 29 | def greetMe(): 30 | currentH = int(datetime.datetime.now().hour) 31 | if currentH >= 0 and currentH < 12: 32 | speak('Доброе утро, хозяин!') 33 | 34 | if currentH >= 12 and currentH < 18: 35 | speak('Добрый день, хозяин!') 36 | 37 | if currentH >= 18 and currentH !=0: 38 | speak('Добрый вечер, хозяин!') 39 | 40 | greetMe() 41 | 42 | speak('Добби слушает твои указания') 43 | 44 | def myCommand(): 45 | 46 | r = sr.Recognizer() 47 | with sr.Microphone() as source: 48 | print("Слушаю...") 49 | r.pause_threshold = 1 50 | audio = r.listen(source) 51 | try: 52 | query = r.recognize_google(audio, language='ru-RU') 53 | print('Хозяин: ' + query + '\n') 54 | 55 | except sr.UnknownValueError: 56 | speak('Добби не понял, повтори') 57 | query = myCommand() 58 | 59 | return query 60 | 61 | 62 | if __name__ == '__main__': 63 | 64 | while True: 65 | #получаем команду с микрофона и сразу ставим в нижний регистр 66 | query = myCommand(); 67 | query = query.lower() 68 | 69 | 70 | 71 | #ютуб 72 | if 'открой youtube' in query or 'youtube' in query: 73 | speak('открываю') 74 | webbrowser.open('www.youtube.com') 75 | 76 | elif 'открой тренды youtube' in query: 77 | speak('открываю тренды') 78 | webbrowser.open('https://www.youtube.com/feed/trending') 79 | 80 | elif 'открой мои подписки youtube' in query or 'открой подписки youtube' in query: 81 | speak('открываю подписки') 82 | webbrowser.open('https://www.youtube.com/feed/subscriptions') 83 | 84 | elif 'открой библиотеку youtube' in query: 85 | speak('открываю библиотеку') 86 | webbrowser.open('https://www.youtube.com/feed/library') 87 | 88 | elif 'открой историю youtube' in query or 'что я последнее смотрел на youtube' in query or 'что я последнее смотрела на youtube' in query: 89 | speak('открываю историю') 90 | webbrowser.open('https://www.youtube.com/feed/history') 91 | 92 | elif 'открой мои видео в youtube' in query: 93 | speak('открываю ваши видео') 94 | webbrowser.open('https://www.youtube.com/feed/my_videos') 95 | 96 | elif 'открой мои покупки в youtube' in query: 97 | speak('открываю ваши покупки') 98 | webbrowser.open('https://www.youtube.com/feed/purchases') 99 | 100 | elif 'открой понравившиеся видео в youtube' in query: 101 | speak('открываю ваши понравившиеся видео') 102 | webbrowser.open('https://www.youtube.com/playlist?list=LLdg_gMmvyZBmkyOi50B7OTg') 103 | 104 | elif 'открой мой аккаунт youtube' in query: 105 | speak('открываю аккаунт') 106 | webbrowser.open('https://www.youtube.com/account') 107 | 108 | #гугл 109 | elif 'открой google' in query or 'google' in query: 110 | speak('открываю') 111 | webbrowser.open('www.google.co.in') 112 | 113 | elif 'открой google картинки' in query: 114 | speak('открываю') 115 | webbrowser.open('https://www.google.ru/imghp?hl=ru&tab=wi&ogbl') 116 | 117 | elif 'открой аккаунт google' in query: 118 | speak('открываю аккаунт') 119 | webbrowser.open('https://myaccount.google.com/') 120 | 121 | #инфоормацию по университету 122 | elif 'открой сайт политеха' in query or 'открой сайт политехничсекого университета' in query: 123 | speak('открываю сайт Политеха') 124 | webbrowser.open('https://www.spbstu.ru/') 125 | 126 | elif 'институты в политехе' in query or 'какие бывают институты в политехе' in query: 127 | speak('институт компьютерных наук и технологий, ') 128 | speak('институт прикладной математики и механики, ') 129 | speak('инженерно-строительный институт, ') 130 | speak('высшая школа техносферной безопасности, ') 131 | speak('институт энергетики, ') 132 | speak('университетский политехнический колледж, ') 133 | speak('гуманитарный институт, ') 134 | speak('институт промышленного менеджмента, экономики и торговли, ') 135 | speak('институт биомедицинских систем и биотехнологий, ') 136 | speak('институт физики, нанотехнологий и телекоммуникаций, ') 137 | 138 | elif 'открой расписание пар в институте компьютерных наук и технологий' in query: 139 | speak('открываю расписание в институте компьютерных наук и технологий') 140 | webbrowser.open('https://ruz.spbstu.ru/faculty/95/groups') 141 | 142 | elif 'открой расписание пар в институте прикладной математике и механике' in query: 143 | speak('открываю расписание в институте прикладной математике и механике') 144 | webbrowser.open('https://ruz.spbstu.ru/faculty/99/groups') 145 | 146 | elif 'открой расписание пар в инженерно-строительном институте' in query: 147 | speak('открываю расписание в инженерно-строительном институте') 148 | webbrowser.open('https://ruz.spbstu.ru/faculty/92/groups') 149 | 150 | elif 'открой расписание пар в высшей школе техносферной безопасности' in query: 151 | speak('открываю расписание в высшей школе техносферной безопасности') 152 | webbrowser.open('https://ruz.spbstu.ru/faculty/96/groups') 153 | 154 | elif 'открой расписание пар в институте энергетике' in query: 155 | speak('открываю расписание в институте энергетике') 156 | webbrowser.open('https://ruz.spbstu.ru/faculty/93/groups') 157 | 158 | elif 'открой расписание пар в университетском политехническом колледже' in query: 159 | speak('открываю расписание в университетском политехническом колледже') 160 | webbrowser.open('https://ruz.spbstu.ru/faculty/117/groups') 161 | 162 | elif 'открой расписание пар в гуманитарном институте' in query: 163 | speak('открываю расписание в гуманитарном институте') 164 | webbrowser.open('https://ruz.spbstu.ru/faculty/101/groups') 165 | 166 | elif 'открой расписание пар в институте промышленного менеджмента, экономики и торговли' in query: 167 | speak('открываю расписание в институте промышленного менеджмента, экономики и торговли') 168 | webbrowser.open('https://ruz.spbstu.ru/faculty/100/groups') 169 | 170 | elif 'открой расписание пар в институте биомедицинских систем и биотехнологий' in query: 171 | speak('открываю расписание в институте биомедицинских систем и биотехнологий') 172 | webbrowser.open('https://ruz.spbstu.ru/faculty/119/groups') 173 | 174 | elif 'открой расписание пар в институте физики, нанотехнологий и телекоммуникаций' in query: 175 | speak('открываю расписание в институте физики, нанотехнологий и телекоммуникаций') 176 | webbrowser.open('https://ruz.spbstu.ru/faculty/98/groups') 177 | 178 | elif 'открой сайт первокурсника' in query: 179 | speak('открываю сайт первокурсника') 180 | webbrowser.open('https://www.spbstu.ru/freshman/') 181 | 182 | elif 'открой информацию по общежитию' in query: 183 | speak('открываю ифнормацию по общежитию') 184 | webbrowser.open('https://www.spbstu.ru/freshman/dormitory/dormitory.html') 185 | 186 | elif 'открой информацию по банковским картам' in query: 187 | speak('открываю ифнормацию по банковским картам') 188 | webbrowser.open('https://www.spbstu.ru/freshman/card/card.html') 189 | 190 | elif 'открой информацию по собранию первокурсников' in query: 191 | speak('открываю ифнормацию по собранию') 192 | webbrowser.open('https://www.spbstu.ru/freshman/meeting/meeting.html') 193 | 194 | elif 'открой информацию по пропуску' in query: 195 | speak('открываю ифнормацию по пропуску') 196 | webbrowser.open('https://www.spbstu.ru/freshman/skip/skip.html') 197 | 198 | elif 'открой информацию по студенческому билету' in query: 199 | speak('открываю ифнормацию по студенческому билету') 200 | webbrowser.open('https://www.spbstu.ru/freshman/studentcard/studentcard.html') 201 | 202 | elif 'открой информацию для первокурсников' in query: 203 | speak('открываю ифнормацию для первокурсников') 204 | webbrowser.open('https://www.spbstu.ru/freshman/files/booklet_web.pdf') 205 | 206 | 207 | 208 | #почта 209 | elif 'открой почту' in query: 210 | speak('открываю') 211 | webbrowser.open('www.mail.ru') 212 | 213 | elif "как дела" in query or 'как ты' in query: 214 | stMsgs = ['Лучше всех', 'Все хорошо'] 215 | speak(random.choice(stMsgs)) 216 | 217 | elif 'ничего' in query or 'забей' in query or 'отдыхай' in query: 218 | speak('Буду ждать') 219 | speak('Пока') 220 | sys.exit() 221 | 222 | elif 'привет' in query or 'салам' in query: 223 | if 'привет' in query: 224 | speak('Привет') 225 | else: 226 | speak('Салам алейкум, хозяин') 227 | 228 | #вконтакте 229 | elif 'войти вконтакт' in query: 230 | speak('Напиши логин') 231 | login_ = str(input()) 232 | speak('Напиши пароль') 233 | password_ = str(input()) 234 | driver = webdriver.Chrome() 235 | driver.implicitly_wait(10) 236 | driver.get ('https://www.vk.com/login') 237 | driver.find_element_by_id('email').send_keys(login_) 238 | driver.find_element_by_id('pass').send_keys(password_) 239 | driver.find_element_by_id('login_button').click() 240 | isContinue = True 241 | while driver.find_elements_by_xpath("//*[@id='login_message']/div/div"): 242 | driver.find_element_by_id('email').clear() 243 | speak('Не удаётся войти. Попробовать снова?') 244 | answer = myCommand(); 245 | answer = answer.lower() 246 | if answer == 'да' or answer == 'конечно': 247 | speak('Напиши логин') 248 | login_ = str(input()) 249 | speak('Напиши пароль') 250 | password_ = str(input()) 251 | driver.find_element_by_id('email').send_keys(login_) 252 | driver.find_element_by_id('pass').send_keys(password_) 253 | driver.find_element_by_id('login_button').click() 254 | else: 255 | isContinue = False 256 | driver.quit() 257 | break 258 | if isContinue == True: 259 | speak('Напиши код') 260 | code_ = str(input()) 261 | code = driver.find_element_by_id('authcheck_code') 262 | code.send_keys(code_) 263 | button = driver.find_element_by_id('login_authcheck_submit_btn') 264 | button.click() 265 | while driver.find_element_by_id('login_authcheck_submit_btn'): 266 | speak('Неверный код. Попробовать снова?') 267 | answer = myCommand(); 268 | answer = answer.lower() 269 | if answer == 'да' or answer == 'конечно': 270 | code.clear() 271 | speak('Напиши код') 272 | code_ = str(input()) 273 | code.send_keys(code_) 274 | button.click() 275 | else: 276 | driver.quit() 277 | break 278 | 279 | #одноклассники 280 | elif 'войти в одноклассники' in query: 281 | speak('Напиши логин') 282 | login_ = str(input()) 283 | speak('Напиши пароль') 284 | password_ = str(input()) 285 | driver = webdriver.Chrome() 286 | driver.implicitly_wait(10) 287 | driver.get ('https://ok.ru/') 288 | driver.find_element_by_id('field_email').send_keys(login_) 289 | driver.find_element_by_id('field_password').send_keys(password_) 290 | driver.find_element_by_xpath('//*[@id="anonymPageContent"]/div[2]/div/div[3]/form/div[5]/div[1]/input').click() 291 | #isContinue = True 292 | while driver.find_elements_by_xpath('//*[@id="anonymPageContent"]/div[2]/div/div[3]/form/div[3]/div'): 293 | driver.find_element_by_id('field_email').clear() 294 | speak('Не удаётся войти. Попробовать снова?') 295 | answer = myCommand(); 296 | answer = answer.lower() 297 | if answer == 'да' or answer == 'конечно': 298 | speak('Напиши логин') 299 | login_ = str(input()) 300 | speak('Напиши пароль') 301 | password_ = str(input()) 302 | driver.find_element_by_id('field_email').send_keys(login_) 303 | driver.find_element_by_id('field_password').send_keys(password_) 304 | driver.find_element_by_xpath('//*[@id="anonymPageContent"]/div[2]/div/div[3]/form/div[5]/div[1]/input').click() 305 | else: 306 | #isContinue = False 307 | driver.quit() 308 | break 309 | 310 | 311 | #скриншот 312 | elif 'скрин' in query: 313 | pyautogui.screenshot('image.png') 314 | 315 | #включает камеру и делает фотку (фото сохраняется в папке с Добби) 316 | elif 'сделай фото' in query: 317 | cap = cv2.VideoCapture(0) 318 | for i in range(30): 319 | cap.read() 320 | ret, frame = cap.read() 321 | cv2.imwrite('cam.png', frame) 322 | cap.release() 323 | 324 | #создает папку по указанному пути(главное без ошибок) 325 | elif 'создай папку' in query: 326 | speak('Напиши путь') 327 | a = str(input()) 328 | speak('Как назвать папку') 329 | b = str(input()) 330 | way = a+b 331 | os.mkdir(way) 332 | speak('Сделано') 333 | 334 | #удалить папку 335 | elif 'удали папку' in query: 336 | speak('Напиши путь') 337 | a = str(input()) 338 | os.rmdir(a) 339 | speak('Сделано') 340 | 341 | #время 342 | elif 'который час' in query or 'время' in query: 343 | d = datetime.datetime.today() 344 | res = str(d.hour) + " " + str(d.minute) 345 | speak(res) 346 | 347 | #дата 348 | elif 'какое сегодня число' in query or 'дата' in query: 349 | d = datetime.datetime.today() 350 | res = str(d.day) 351 | speak(res) 352 | 353 | #создать файл 354 | elif 'создай файл' in query: 355 | end_ = '.txt' 356 | speak('Скажи какой формат?') 357 | speak('Автоматически стоит формат txt, чтобы был докс скажи один') 358 | answer = myCommand(); 359 | answer = answer.lower() 360 | if answer == '1': 361 | end_ = '.docx' 362 | speak('Напиши путь') 363 | s = str(input()) 364 | speak('Как назвать?') 365 | name = myCommand(); 366 | name = name.lower() 367 | s+=name+end_ 368 | file = open(s,"w") 369 | file.close() 370 | speak('Готово') 371 | 372 | 373 | elif 'открой тренды youtube' in query: 374 | webbrowser.open('www.youtube.com/feed/trending') 375 | #заполнить файл 376 | elif 'заполни файл' in query: 377 | speak('Что написать?') 378 | text = myCommand(); 379 | speak('В какой файл записать?') 380 | way = str(input()) 381 | file = open(way, "w") 382 | file.write(text) 383 | file.close() 384 | speak('Записал') 385 | 386 | #удалить файл 387 | elif 'удали файл' in query: 388 | speak('Укажи путь') 389 | way = str(input()) 390 | size_ = os.path.getsize(way) 391 | if size_== 0: 392 | os.remove(way) 393 | else: 394 | speak('Файл не пустой, уверен?') 395 | answer = myCommand(); 396 | answer = answer.lower() 397 | if answer == 'да' or answer == 'конечно': 398 | os.remove(way) 399 | speak('Закончил') 400 | else: 401 | speak('Правильно, лучше оставить') 402 | 403 | #калькулятор 404 | elif 'посчитай' in query: 405 | speak('Скажи выражение') 406 | expression = myCommand() 407 | expression = expression.lower() 408 | #корень 409 | if expression.startswith('корень из'): 410 | newExp = expression.replace('корень из', '') 411 | newExp.strip() 412 | answer = mt.sqrt(int(newExp)) 413 | speak(str(answer)) 414 | #возведение в степень 415 | elif expression.startswith('возведи'): 416 | newExp = expression.replace('возведи','') 417 | newExp = newExp.replace('число','') 418 | newExp = newExp.replace('в','') 419 | newExp = newExp.replace('степень','') 420 | newExp = newExp.replace('степени','') 421 | newExp = newExp.strip() 422 | x,newX,i = [],[],0 423 | x.extend(newExp) 424 | while i35: 486 | spaek('На улице ужасно жарко') 487 | 488 | 489 | if 'дождь' in data['weather'][0]['description']: 490 | speak('Также учти, на улице дождь') 491 | elif 'облачно' in data['weather'][0]['description']: 492 | speak('На улице облачно, может пойти дождь') 493 | else: 494 | speak('Сегодня, ' + str(data['weather'][0]['description']) + ' и '+ str(data['main']['temp']) + ' градусов') 495 | 496 | 497 | elif 'пока' in query: 498 | speak('Пока') 499 | sys.exit() 500 | 501 | elif 'что ты умеешь' in query or 'твои возможности' in query: 502 | speak('Открывать ютуб, гугл и почту. Создавать и удалять папки. Создавать, заполнять и удалять файлы.') 503 | speak('Разговаривать с тобой. Говорить который час и какое число. То, что я не знаю, я ищу в гугле и вывожу тебе на экран') 504 | 505 | 506 | 507 | else: 508 | query = query 509 | speak('Ищу...') 510 | webbrowser.open('www.google.com/search?q='+query) 511 | speak('Что делать дальше?') 512 | -------------------------------------------------------------------------------- /start.bat: -------------------------------------------------------------------------------- 1 | python main.py --------------------------------------------------------------------------------