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

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

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

26.03.2021 14:15:31 | Автор: admin

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

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

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

Введение

Меня зовут Глеб (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)

ГИТХАБ

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

Подробнее..

Помощь многим Android-приложение для людей с особыми потребностями

26.02.2021 20:18:58 | Автор: admin

Приветствую всех! Я Беглецов Глеб, учусь в 11 классе, летом прошлого года закончил программу IT Школа Samsung в г. Санкт-Петербург на площадке ФМЛ 239 под руководством Левина Михаила Константиновича. В качестве выпускной работы я разработал приложение, которое назвал Parus. Это мой первый большой проект под Android, и он мне принес ГРАН-ПРИ финала Всероссийского конкурса IT Школы Samsung (ролик). Хочу поделиться историей создания этого проекта.

Идея

Я иногда слышал среди своих одногруппников в IT Школе Samsung подобную фразу: Я не знаю, какое приложение мне написать. У меня не было сомнений. Моё приложение должно помочь людям с особыми потребностями полноценно общаться с миром, потому что данная проблема актуальна и в нашей стране, и в мире. И меня она лично касается. Есть много отдельных приложений: для синтеза речи, для искусственного зрения, для напоминаний и т.д. Мне хотелось объединить всё необходимое в одном приложении.

Начало

Учиться в IT Школе Samsung я начал в сентябре, а в начале ноября уже знал, какой проект буду разрабатывать. Но это же классика, откладывать всё на последний момент! В итоге апрель и май выдались очень напряженными. В тоже время это было очень увлекательное время. Я просыпался, кодил с перерывами на еду, ложился спать, просыпался и снова кодил, если не учился в школе. Вот такой был распорядок дня в течение двух завершающих месяцев обучения. Узнавал каждый день что-то новое. Несколько раз было такое: понимал, что написанное не годится и переписывал половину уже сделанной работы. Тогда, как понимаете, было не очень весело.

К началу апреля я освоил основы Java и Android. А за следующие два месяца добавил синтез речи, распознавание речи, компьютерное зрение, отслеживание пульса, создание ежедневных напоминаний (не todo list), связь аккаунтов человека с особыми потребностями и его помощником, чат и передачу данных между ними. Дальше подробнее про каждую функцию.

Говорить. Синтез речи

Данная функция помогает общаться людям с нарушением речи . Сам синтез речи самая лёгкая задача из всех. Подключил TextToSpeech и готово. Но такой функционал не слишком удобен для пользователя, поэтому я решил сделать систему частых фраз и тематические коллекции. Вот с этим уже начались первые проблемы.

Создавая систему коллекций и частых фраз, я не знал о существовании Snapshotов (обновление данных в реальном времени), поэтому обновление данных у меня было реализовано, как я позже понял, через очень шаткие костыли. Я читал данные из БД каждый раз, когда там, гипотетически, могли измениться какие-либо поля. И такая система была реализована ВЕЗДЕ. Вот это и был один из тех моментов, когда, узнав про что-то новое и полезное, обрадовался, а затем взялся за переписывание всего кода.

Смотреть

Компьютерное зрение должно помогать людям со слабым зрением распознавать текст или объект на фото. Но не всё так идеально, как хотелось бы. Firebase Ml Vision удобен и практичен, но бесплатная версия не распознает русский язык, а результаты распознавания объекта иногда выглядят по меньшей мере странно.

Вообще, при реализации многих задач мне очень помог Firebase, отличный инструмент. Для компьютерного зрения я поначалу попробовал использовать Tesseract, потому что была возможность подключить к нему файл с русским алфавитом для распознавания кириллицы. Оказалось зря. Потратив только на его установку в проект около недели, текст с русскими буквами так и не распознавался. Поэтому я стал искать другие варианты. И тут меня спас Firebase Ml Kit, который я настроил в 5 раз быстрей! Firebase даёт очень много плюшек, и без него я вряд ли бы всё сделал. По неопытности, конечно, не сразу все получалось, но я разобрался. Для текущей задачи пока я использую API от Firebase. Может, в будущем найду что-то более подходящее.

Слушать

Просто распознавание речи с помощью SpeechRecognizer API от Google и вывод результата на экран.

Пульс. Google Fit vs Samsung Health SDK

Отслеживание пульса полезная функция для людей с сердечными заболеваниями. С помощью неё пользователь может следить за своим сердцебиением. При обработке данных, если пульс вне нормального интервала (55 < x < 90), то на устройство приходит уведомление об этом.

Но над этой задачей тоже пришлось попыхтеть. Сначала разобрался, как читать данные из Google Fit. Потом прочитал про Samsung Health SDK и решил перейти на него. У S Health SDK есть очень удобное дополнение Data Viewer. С его помощью можно записывать данные в S Health без каких-либо трекеров. Это очень помогает при тестировании приложения, в этом SDK от Samsung выигрывает у GoogleFit. Также не надо делать привязку к аккаунту и подключать QAuth от Google, тоже плюс.

Но если Google Fit может встроить в свой проект любой желающий, то для использования Samsung Health необходимо, чтобы приложение получило статус партнёрского. Без такого статуса приложение будет полноценно работать только в режиме разработчика. К сожалению, на данный момент приостановлен приём заявок на статус партнёрского приложения в связи с обновлением партнёрской программы. Поэтому я был вынужден вернуться обратно к GoogleFit.

Напоминания

Я знаю, что существует множество приложений по типу todo list, но, как говорится, это другое Во-первых, пользователь может установить несколько часов (12:50, 13:10 и 18:30, например) на одну задачу. Во-вторых, есть возможность установить напоминанию интервал времени и повторение: с 12:00 до 20:00 каждый час, например. Напоминания каждый день перезагружаются и начинают всё по новой, как обычный будильник. Это может быть полезно людям, которым надо каждый день сделать что-то важное. Например, люди с диабетом могут установить время для инсулиновых уколов.

Безусловно, что человек может установить множество будильников, которые будут выполнять ту же задачу. Моя программа просто упрощает это. Для напоминаний с 9:00 до 21:00 с регулярностью в полчаса, необходимо установить либо 24 обычных будильника, либо 1 напоминание с интервалом в Parus. Думаю, что второй вариант легче.

Напоминания не сильно тратят заряд батареи, потому что они реализованы за счёт WorkManagerов. Я долго думал между Alarm и WorkManager, потому что первое слишком сильно нагружает телефон и батарею (+на некоторых телефонах ограничен), а второе имеет один весомый минус из-за сверхоптимизации напоминание может не отобразиться, если телефон долго находился в режиме сна. Я около 100 раз протестил данный случай, и 3-5 раз напоминание не срабатывало до выхода из режима сна. На сайте Android developers читал, что Google работает над этим, так что буду надеяться, что скоро это исправят.

Связь с помощником

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

  • Передача данных
    Помощнику будет спокойнее, если он будет иметь информацию о пульсе своего подопечного и его местоположении. Кроме того, помощник может редактировать в приложении напоминания человека с ограниченными возможностями здоровья. А еще всегда можно посмотреть, когда связанный пользователь заходил в последний раз в Parus.

  • Кнопка вызова
    При связывании аккаунтов, у человека с особыми потребностями появляется быстрая кнопка Позвать помощника. При нажатии на неё на устройство помощнику отправляется уведомление.

  • Чат
    Иногда случается так, что твой помощник это не родной и не близкий человек, а волонтёр или социальный работник. Чтобы не общаться с ним в различных мессенджерах, можно общаться с ним отдельно в чате Parusa.

Samsung Android Bootcamp. Заключение

Выше я описал основные возможности своего приложения на момент участия в конкурсе выпускных проектов IT Школы Samsung. Я совсем не упоминал архитектуру приложения или паттерны, которые я использовал. Знаете почему? Потому что этого не было на момент финала конкурса. Проект состоял из классов, разложенных по пакетам. И всё. Я подозревал, что это ужасно, но не знал, как исправить. И тут нам сказали, что сразу после конкурса пройдет летний Android Bootcamp для выпускников IT Школы Samsung. Я решил, что мне явно туда.

За две недели интенсива я узнал безумно много полезных вещей. Например, зацепился за MVVM + Data Binding + Material Design. Стало понятно, что Parus выпускать в таком виде нельзя. Предстоящая работа: сначала архитектура, потом дизайн, после чего можно и в Google Play. В августе уже не было такого запала, как в конце весны, к середине сентября я почти переделал всё под MVVM архитектуру и все

С октября по январь я ни разу не открыл Android Studio. Мне совсем не хотелось программировать и вообще как-либо доделывать свой проект. Одним словом, пропал весь энтузиазм. Я начал думать, что на самом деле проект ни о чём, что я не способен сделать достойное приложение. Не знаю из-за чего, наверное я устал и понял, что доводить проект до идеального состояния можно бесконечно.

Прошел Новый год. Parusa так и нет в Google Play. Я открыл Android Studio и вдруг почувствовал, что есть силы завершить проект. Я дал себе обещание, что в феврале Parus появится в Play Market. За две недели доделал всё, что планировал, и 4 февраля загрузил проект в Google Play.

Вот такая история моего первого большого проекта. Да, Parus не идеален, но у меня получилось довести его до законченного состояния. Надеюсь, что он окажется полезным кому-нибудь. Буду рад, если вы скачаете приложение и напишете свои предложения. Особенно, если вы моя целевая аудитория - человек с особыми потребностями или заботитесь о таком человеке.

Спасибо, что прочитали статью до конца.

Пока!

Глеб Беглецов

Ученик 11 класса, школа Озерки

г. Санкт-Петербург

Подробнее..

Категории

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

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