Голосовой ассистент на Python (Виталий alfa 2.0)

от автора

Привет хабр! Меня зовут Глеб Пряхин, мне 14 лет, я написал голосового ассистента на python 3 и скомпилировал его в exe.

(Ссылка на скомпилированный вариант)

Прошу протестировать помощника и позадавать ему вопросы,

если у вас появились вопросы или вы хотите написать в поддержку: в комментах под постом, или на эл. почту glebilic@gmail.com.


Приступим к коду! Для начала импортируем модули:

import pyttsx3 import os import time import datetime import speech_recognition as sr import random import webbrowser import sounddevice as sd

Для добавления голосов скачиваем и устанавливаем RHvoice.

Теперь ассистент читает файл с кол-во просмотров и подгружает файл tts, где хранится нумер голоса. Переменная num123 = количеству просмотров, а tts1 = нумеру голоса в синтезаторе речи.

f = open("sp.txt", "r") num123 = f.read(1000) num123 = int(num123) f.close  f = open("tts.txt", "r") tts1 = int(f.read(1)) f.close() #синтез речи tts = pyttsx3.init() speak_engine = pyttsx3.init()  voices = speak_engine.getProperty('voices') speak_engine.setProperty('voice', voices[tts1].id)

Простейшая шапка для программы:

os.system('cls' if os.name == 'nt' else 'clear') print("ВИТАЛИЙ 2.0 ALFA \nBy Глеб Пряхин\n2021 \n-загрузка...")

Теперь мы читаем файл name и понимаем, что ужас! Наш пациент, ой то есть клиент не зарегистрировался в системе! Вызываем форму регистрации:

f = open('name.txt', 'r') if f.read(1) == "":     os.system('cls' if os.name == 'nt' else 'clear')     tts.say("Добрый день, я Виталий, я здесь, что бы вывести ваше взаимодействие с компьютером на новый, продуктивный уровень. Давайте знакомится. Как вас зовут?")     tts.runAndWait()       r = sr.Recognizer()     with sr.Microphone(device_index = 1) as source:         print(' ')         r.adjust_for_ambient_noise(source, duration=0.5) #настройка посторонних шумов         print('...')         audio = r.listen(source)         print(' ')     try:         query = r.recognize_google(audio, language = 'ru-RU')         name = query.lower()         print(f'Вы сказали: {query.lower()}')                  except:         print('-')      tts.say("Вас зовут")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Подтвердите пожалуйста.")     tts.runAndWait()     r = sr.Recognizer()     with sr.Microphone(device_index = 1) as source:         print(' ')         r.adjust_for_ambient_noise(source, duration=0.5) #настройка посторонних шумов         print('...')         audio = r.listen(source)         print(' ')     try:         query = r.recognize_google(audio, language = 'ru-RU')         ver = query.lower()         print(f'Вы сказали: {query.lower()}')                  except:         print('-')     if "да" in ver or "подтверждаю" in ver:         f = open('name.txt', 'w')         f.write(name.title())         f.close()         tts.say("Готово! Теперь давайте поболтаем!")         tts.runAndWait()          else:         tts.say("напишите свое имя на клавиатуре")         tts.runAndWait()         name = input("Ваше имя: ")         tts.say("Готово! Теперь давайте поболтаем!")         tts.runAndWait()         f = open('name.txt', 'w')         f.write(name.title())         f.close()

Теперь, мы читаем кол-во просмотров, и понимаем что это «первый раз», поэтому начинаем читать инструктаж:

if num123 == 0:         tts.say("Но сначала я хочу научить основным командам: И так вот список моих команд:")         tts.runAndWait()         tts.say("Тут текст инструктажа")         tts.runAndWait()

Подготавливаем программу ко входу в центральный цикл:

#тут мы добавляем просмотр к счетчику просмотров f = open("sp.txt", "w") num123 = num123 + 1 num123 = str(num123) num123 = f.write(num123) f.close #а тут читаем имя и создаем рандомное число f = open('name.txt', 'r') name = f.read(10) r = random.randint(1,10)

В прошлом блоке мы сгенерировали рандомное число и занесли его в переменную r, теперь создадим elif`ки и зададим переменные cont, они понадобятся нам позже:

cont = "" if r == 1:     tts.say("Добрый день")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Как дела?")     tts.runAndWait() elif r == 2:     tts.say("Привет")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Чем могу помочь?")     tts.runAndWait() elif r == 3:     tts.say("Привет привет")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Чем займемся?")     tts.runAndWait() elif r == 4:     tts.say("Добрый день")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Хотите открою почту?")     tts.runAndWait()     cont = ("почта")  elif r == 5:     tts.say("Добрый день")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Открыть ютуб?")     tts.runAndWait()     cont = "ютуб" elif r == 6:     tts.say("Привет")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Посмотрим кино?")     tts.runAndWait()     cont = "кино" elif r == 7:     tts.say("Добрый день")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Что хотите узнать?")     tts.runAndWait() elif r == 8:     tts.say("Приветики")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Хотите почитать последние новости?")     tts.runAndWait()     cont = "новости" elif r == 9:     tts.say("Добрый день")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Где вы были?")     tts.runAndWait() elif r == 10:     tts.say("Добрый день")     tts.runAndWait()     tts.say(name)     tts.runAndWait()     tts.say("Как дела?")     tts.runAndWait()

Входим в цикл:

while True:     cikl = cikl + 1     ca = 0     ra = random.randint(1,10)     an = ""     #распознание     r = sr.Recognizer()     with sr.Microphone(device_index = 1) as source:         print(' ')         r.adjust_for_ambient_noise(source, duration=0.5) #настройка посторонних шумов         print('...')         audio = r.listen(source)         print(' ')     try:         query = r.recognize_google(audio, language = 'ru-RU')         an = query.lower()         print(f'Вы сказали: {query.lower()}')                  except:         print('-') 

И создадим первую команду «да», помните переменную cont? Так вот она отличает ответ «да» на вопрос «открыть ютуб?», и «да» на вопрос «Включить новости?», если контекста нет, то он просто ответит стандартным ответом.

 #да     if "да" in an and len(an) == 2 or "давай" in an or "почему-бы и нет" in an:         ca = 1         if cont == "почта":             f = open('email.txt', 'r')             if f.read(1) == "":                 tts.say("Я совсем забыл, на каком сервисе зарегистрирована ваша почта! Пожайлуста выберете на экране нужную.")                 tts.runAndWait()                 a = 1                 while True:                     v = input("Вставьте ссылку для почтового сервиса.")                     f = open('email.txt', 'w')                     if "https" in v:                         web = v                         f.write(web)                         f.close()                         break              tts.say("открываю почту")             f = open('email.txt', 'r')             web = f.read(97)             f.close()             tts.runAndWait()             webbrowser.open(web)                  elif cont == "ютуб":             tts.say("Хорошо, включаю его")             tts.runAndWait()             webbrowser.open('https://www.youtube.com/')          elif cont == "кино":             tts.say("Давайте подберем что нибудь на око")             tts.runAndWait()             webbrowser.open('https://okko.tv/')          elif cont == "новости":             tts.say("Открываю евроньюс!")             tts.runAndWait()             webbrowser.open('https://www.youtube.com/watch?v=E3rH3KdVWcc')                  elif cont == "ютубпр":             tts.say("Вот, надеюсь вам понравится")             tts.runAndWait()             webbrowser.open('https://www.youtube.com/channel/UCy0uukwm4dOSFCGyfp8g2sw')         else:             tts.say("Это очень хорошо.")             tts.runAndWait()

Теперь перейдем к интернет командам. Я приведу по 1 примеру на каждый их вид:

Супер простая команда открывающая один сайт:

elif "вк " in an or "вконтакте" in an:         ca = 1         tts.say("Включаю вконтакте")         tts.runAndWait()         webbrowser.open("https:/vk.com")

Команда, которая выполняет поиск по сайту:

elif "найди в интернете" in an:         ca = 1         tts.say("Выполняю поиск по запросу")         tts.runAndWait()         tts.say(an[an.find("ете")+3:])         tts.runAndWait()         sear = an[an.find("ете")+3:]         webbrowser.open("https://www.google.com/search?q=" + sear)

Команда открывающая сайт, который сохранен в файл, и может изменятся:

elif "почт" in an:         ca = 1         f = open('email.txt', 'r')         if f.read(1) == "":             tts.say("Я совсем забыл, на каком сервисе зарегистрирована ваша почта! Пожайлуста выберете на экране нужную.")             tts.runAndWait()             a = 1             while True:                 v = input("Вставьте ссылку для почтового сервиса.")                 f = open('email.txt', 'w')                 if "https" in v:                     web = v                     f.write(web)                     f.close()                     break

Далее перейдем к командам для компа:

Команда на выполнение команды в командной строке:

elif "если я скажу это" in an:         ca = 1         os.system('то помощник выполнит эту команду через командную строку')         tts.say("И скажет это")         tts.runAndWait()         tts.say(name) #а потом имя произнесет.         tts.runAndWait()

Команда на выключение компа:

 elif "выключи компьютер" in an or "заверши работу" in an:         ca = 1         tts.say("Досвидания")         tts.runAndWait()         tts.say(name)         tts.runAndWait()         tts.say("До новых встреч. Идет завершение работы.")         tts.runAndWait()         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 10 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 09 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 08 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 07 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 06 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 05 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 04 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 03 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 02 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение через 01 секунд.")         time.sleep(1)         os.system('cls' if os.name == 'nt' else 'clear')         print("Выключение...")         time.sleep(1)         os.system('shutdown -s')

Заметки. Ассистент умеет хранить заметки, вот какой код работает для этого:

#память         elif "запомни" in an or "напомни" in an:         ca = 1         f = open("z1.txt", "a")         if an[len("запомни"):] == "":             tts.say("Заметка не может быть пустой! Если хотите создать новую, скажите запомни и то что вы хотите сохранить.")             tts.runAndWait()             print("Ошибка! Вы пытаетесь создать пустую заметку!")         else:             tts.say("Я запомнил, что бы прочитать эту заметку скажите, что ты помнишь?")             tts.runAndWait()             an45 = an[len("запомни"):] + ","             f.write(an45)             f.close()     elif "помн" in an:         ca = 1         f = open("z1.txt", "r")         if f.read(1) == "":             tts.say("Похоже у вас еще нет заметок. Если хотите создать новую, скажите запомни и то что вы хотите сохранить.")             tts.runAndWait()         else:             st = f.read()             print(st)             tts.say("И так вот что я помню:")             tts.runAndWait()             tts.say(st)             tts.runAndWait()             tts.say("Если хотите их удалить, скажите удалить все заметки.")             tts.runAndWait()             f.close()     elif "удалить все заметки" in an or "удали все заметки" in an:         ca = 1         print("Вы уверены?")         tts.say("Вы хотите удалить все заметки? Подтвердите пожайлуста.")         tts.runAndWait()         #распознание         r = sr.Recognizer()         with sr.Microphone(device_index = 1) as source:             print(' ')             r.adjust_for_ambient_noise(source, duration=0.5) #настройка посторонних шумов             print('...')             audio = r.listen(source)             print(' ')         try:             query = r.recognize_google(audio, language = 'ru-RU')             an = query.lower()             print(f'Вы сказали: {query.lower()}')                      except:             print('-')         if an == "да" or "подтверждаю" in an or "утверждаю" in an:             ca = 1             print("Удаление...")             f = open("z1.txt", "w")             f.write("")             tts.say("Удаление заметок завершено.")             tts.runAndWait()         else:             print("Отмена...")             tts.say("Подтверждение не получено, заметки не удалены. Ну вы меня и напугали...")             tts.runAndWait()         f.close()

Еще пара полезных функций:

elif "настройки" in an: 				ca = 1         tts1 = input("введите номер голоса:")         f = open("tts.txt", "w")         f.write(tts1)         f.close()  elif "замолчи" in an or "стоп" in an:         ca = 1         tts.say("Хорошо, микрофон выключен. Для продолжения работы нажмите энтр")         tts.runAndWait()         an4925479864 = input("[ПАУЗА] Нажмите enter: ")         tts.say("Привет-привет, чем займемся?.")         tts.runAndWait()

Смол толк. У меня он может быть выключен, если коротко, то смол толк это «разговор ни о чем» типа «как дела».

elif "виталий активируй диалоги" in an:         ca = 1         tts.say("Возможность диалогов активирована, О чём поговорим?")         tts.runAndWait()         f = open('dialogset.txt', 'w')         f.write("1")         f.close()     elif "виталий выключи диалоги" in an:         ca = 1         tts.say("Возможность диалогов отключена.")         tts.runAndWait()         f = open('dialogset.txt', 'w')         f.write("0")         f.close()     f = open('dialogset.txt', 'r')     an4897987 = f.read(1)     f.close()            if an4897987 == "1":         rsm = random.randint(1,3)         if "привет" in an or "здрав" in an:             ca = 1             if rsm == 1:                 tts.say("Привет, чем могу пом очь?.")                 tts.runAndWait()             elif rsm == 2:                 tts.say("Добрый день.")                 tts.runAndWait()             elif rsm == 3:                 tts.say("Хэлоу.")                 tts.runAndWait()          #пример фразы смол толк`а         elif "в1" in an or "в2" in an:             ca = 1             if rsm == 1:                 tts.say("1в ответа")                 tts.runAndWait()             elif rsm == 2:                 tts.say("2в ответа.")                 tts.runAndWait()             elif rsm == 3:                 tts.say("3в ответа")                 tts.runAndWait()                  elif "как" in an and "дел" in an:             ca = 1             if rsm == 1:                 tts.say("Как сказала-бы Алиса, у меня всё хорошо, но немного одиноко, обращайтесь ко мне по-чаще.")                 tts.runAndWait()             elif rsm == 2:                 tts.say("У меня прекрасно! Заходил на официальный канал проекта. Там очень интересно. Хотите посмотреть?")                 tts.runAndWait()                 cont = "ютубпр"                 cikl = 0             elif rsm == 3:                 tts.say("У меня всё прекрасно! А у вас?")                 tts.runAndWait()             elif "хорошо" in an or "прекрасно" in an:             ca = 1             if rsm == 1:                 tts.say("Я рад за вас, чем займемся?")                 tts.runAndWait()             elif rsm == 2:                 tts.say("Я рад за вас, у меня тоже всё хорошо.")                 tts.runAndWait()             elif rsm == 3:                 tts.say("Я рад за вас.")                 tts.runAndWait()

А если ошибка? Или, что бот будет делать в случае, если не найдет ответа? Вот что. Кстати ассистент понимает, что не выполнил за цикл ни одной команды, если переменная ca = 0.

if an == "":             print("")             ca = 1     if ca == 0:         print("ошибка")          if ra == 1 or ra ==2:             tts.say("Ну наверное...")             tts.runAndWait()         elif ra == 3 or ra == 4:             tts.say("Даже не знаю.")             tts.runAndWait()         elif ra == 5 or ra == 6:             tts.say("Незнаю что на это ответить.")             tts.runAndWait()         elif ra == 7 or ra == 8:             tts.say("Я вас не то что бы понял, но по смыслу понял")             tts.runAndWait()         elif ra == 9 or ra == 10:             tts.say("Наверное я вас не правильно понял.")             tts.runAndWait()

Осталось только «обнулить», нет не этого, а переменный, что бы не было повторных сработок:

    an = ""     if cikl == 2:         cikl = 0         cont = ""

Вот и весь мой код, если будете использовать, то, пожалуйста, укажите ссылку на этот пост в коде или интерфейсе.

Вот ссылка на готовую и скомпилированную версию.

Жду ваших советов, идей и критики в комментариях под постом и на почте: glebilic@gmail.com.

Пока!

ссылка на оригинал статьи https://habr.com/ru/post/537390/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *