Голосовой ассистент Виталий (школьный проект)

от автора

Предостережение

Данный пост создан исключительно для получения отзывов у специалистов, поэтому смело минусуйте его, дабы не засорять ленту школьными проектами.

Также не советую использовать пост как гайд, так как я сам учусь и собираю отзывы и советы от знающих людей.

Введение

Меня зовут Глеб (8 кл) и я задался целью сделать хорошую открывалку/закрывалку и немного говорилку для windows, в ообщем голосового ассистента на python.

На момент написания поста ассистент имеет версию alfa 4.0 и Не позиционирует себя как серьезный продукт или, не дай бог, конкурента Алисе или Siri.

Для ассистента был по-быстрому накидан сайт, где можно скачать exe или исходник на питоне, который вероятно вам и интересен. Гитхаб тоже в наличии.

Код

Так как я уже прикреплял гитхаб, предлагаю сакцентировать внимание на интересных, спорных или непонятных для меня моментах.

Распознавание речи

Для работы разпознавалки я выбрал speech recognition и в итоге был реализован такой код(сборная солянка из видеоуроков):

import speech_recognition as sr  #кортеж с предлжениями, каждую итерацию цикла ассистент дает рандомное предложение (Скажите что-нибудь например "открой браузер") recomend = ("Открой браузер", "Найди в интернете стихи А. Пушкина.", "Как дела?", "Что ты умеешь?", "Запомни код от домофона 495 544.", "Найди на ютубе котиков.")  #распознование (и не просите, в функцию не добавлю так, как оно все-равно нужно только раз за итерацию цикла)     rec1 = len(recomend) - 1     rec2 = recomend[random.randint(0, rec1)]     print('-------------------')     r = sr.Recognizer()     with sr.Microphone() as source: 	    print("Скажите что нибудь, например:", rec2) 	    r.pause_threshold = 1 	    #r.adjust_for_ambient_noise(source, duration=1) 	    audio = r.listen(source)     try: 	    #разпознаное сохраняется в переменную an (answer)       an = r.recognize_google(audio, language="ru-RU").lower() 	    print("Вы сказали: " + an)     except sr.UnknownValueError:         t = "Я вас не слышу, говорите громче!"         print("Сбой системы распознования речи. ")

Очень прошу в комментарии покидать более качественные аналоги speech recognition.

Синтез речи

Для синтеза речи я выбрал голос vokolizer, а также библиотеку pyttsx3. В коде это выглядит так:

import pyttsx3  #Настройка голоса, индекс голоса читаем из файла. f = open("tts.txt", "r") tts1 = int(f.read(1)) f.close() text = "" tts = pyttsx3.init() speak_engine = pyttsx3.init() voices = speak_engine.getProperty('voices') speak_engine.setProperty('voice', voices[tts1].id) #функция синтезы речи def run():     tts.say(t)     tts.runAndWait()     print("Виталий:", t)      #пример запроса t = "Привет мир" run()

Подбор фраз для красивого SMALLTALK

Тут я решил сделать возможность быстрого изменения фраз, поэтому сделал такой алгоритм:

import os  #читаем файл smalltalk и делаем 2 списка: 1 - с ключевыми словами, 2 - с ответами ассистента f = open("smalltalk.txt", "r", encoding="utf-8") smalltalkdialog = f.read()  asksmalltalk = smalltalkdialog[len("вопросы: "):smalltalkdialog.find(" | [конецстроки1]")].split(" | ")  answersmalltalk = smalltalkdialog[smalltalkdialog.find("ответы: ") + len("ответы: "):smalltalkdialog.find(" | [конецстроки2]")].split(" | ")  #подбор нужной фразы for word in range(len(asksmalltalk)):     if asksmalltalk[word] in an:         t = answersmalltalk[word]         run()         break

Тут тоже нужен ваш совет: подскажите пожалуйста более эфективный способ искать фразы.

К Dialog Flove у меня неприязнь. Личная.

Открытие программ, сайтов и поиск в интернете

import webbrowser #переменная error сообщает о том, нашла-ли программа ответ на фразу пользователя, если да, то error = 0 while условный True:     #поиск     elif "найди" in an:         error = 0         if "в интернете" in an:             t = "Начинаю поиск в интернете" + an[an.find("ете")+3:]             run()             sear = an[an.find("ете")+3:]             webbrowser.open("https://www.google.com/search?q=" + sear)          elif "youtube" in an:             sear = an[an.find("be")+2:]             t = "Начинаю поиск в ютубе " + sear             run()             webbrowser.open("https://www.youtube.com/results?search_query=" + sear)          else:             t = "Вы дали мало данных, скажите найди в интернете, либо найди в ютубе и ваш вопрос."             run()         continue     #функция на закрытие Тут мы берем 2 кортежа, в кортеже "listprogram" у нас ключевые слова, а в "listprogram2" команды.     elif "закрой" in an:         listprogram = ("steam", "skype", "браузер")         listprogram2 = ("TASKKILL /IM steam.exe", "TASKKILL /IM skype.exe", "TASKKILL /IM chrome.exe")         for net in range(len(listprogram)):             if listprogram[net] in an:                 program = listprogram2[net]                 os.system(program)                 os.system('cls' if os.name == 'nt' else 'clear')                 t = "Закрываю " + listprogram[net]                  run()                 error = 0         continue      #синтезатор речи     elif "текст" in an:         error = 0         t = "Вставьте сюда текст, который надо синтезировать. в конце текста напишите команду стопсинтез"         run()         t = ""         while True:             t = t + " " + str(input("Вставьте сюда текст > "))             if "стопсинтез" in t:                 break                 t = t[:t.find("стопсинтез")]         run()                #интернет Тут мы берем 2 кортежа, в кортеже "fordefweb" у нас ключевые слова, а в "fordefweb" ссылки.     fordefweb = ("youtube", "вконтакте", "браузер", "google", "новости", "окко", "хабр", "facebook", "wifmedia", "свой сайт")     fordefweb2 = ("https://www.youtube.com/", "https:/vk.com", "https://www.google.ru/", "https://www.google.ru/", "https://lenta.ru/", "https://okko.tv/", "https://habr.com/ru/feed/", "https://www.facebook.com/", "https://wifmedia.com/", "http://vitaliy.renderforestsites.com")     for net in range(len(fordefweb)):         if fordefweb[net] in an:             web = fordefweb2[net]             runweb()             error = 0       #программы Тут мы берем 2 кортежа, в кортеже "listprogram" у нас ключевые слова, а в "listprogram2" команды.     listprogram = ("проводник", "skype")     listprogram2 = ("explorer.exe", "start skype.exe")     for net in range(len(listprogram)):         if listprogram[net] in an:             program = listprogram2[net]             os.system(program)             t = "Открываю " + listprogram[net]              run()             error = 0

Опять же не могу найти ничего действеннее elif, но в этой версии и хотя бы меньше.

Остальное

Напоследок хочу похвастаться возможностью ассистента запоминать имя пользователя и хранить заметки, эти функции можно найти в полном коде проекта на гитхаб.

Материалы

САЙТ (просто дешевая одностраничка на renderforest)

ГИТХАБ

демонстрационный ролик

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


Комментарии

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

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