Привет хабр! Меня зовут Глеб Пряхин, мне 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.

Пока!

Let’s block ads! (Why?)

Read More

Recent Posts

Apple возобновила переговоры с OpenAI и Google для интеграции ИИ в iPhone

Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…

1 день ago

Российская «дочка» Google подготовила 23 иска к крупнейшим игрокам рекламного рынка

Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…

1 день ago

Google завершил обновление основного алгоритма March 2024 Core Update

Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…

1 день ago

Нейросети будут писать тексты объявления за продавцов на Авито

У частных продавцов на Авито появилась возможность составлять текст объявлений с помощью нейросети. Новый функционал доступен в категории «Обувь, одежда,…

2 дня ago

Объявлены победители международной премии Workspace Digital Awards-2024

24 апреля 2024 года в Москве состоялась церемония вручения наград международного конкурса Workspace Digital Awards. В этом году участниками стали…

2 дня ago

Яндекс проведет гик-фестиваль Young Con

27 июня Яндекс проведет гик-фестиваль Young Con для студентов и молодых специалистов, которые интересуются технологиями и хотят работать в IT.…

3 дня ago