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

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

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

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

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

Введение

Меня зовут Глеб (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 = 0while условный 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/", "http://personeltest.ru/aways/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)

ГИТХАБ

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

Источник: habr.com
К списку статей
Опубликовано: 26.03.2021 14:15:31
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Голосовые интерфейсы

Проект

Виталий

Помощник

Ассистент

Школьный проект

Категории

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

  • Имя: Макс
    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