Русский
Русский
English
Статистика
Реклама

Распознование голоса

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

14.01.2021 20:16:39 | Автор: admin

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

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

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

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


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

import pyttsx3import osimport timeimport datetimeimport speech_recognition as srimport randomimport webbrowserimport sounddevice as sd

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

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

f = open("sp.txt", "r")num123 = f.read(1000)num123 = int(num123)f.closef = 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 + 1num123 = 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.

Пока!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru