Новая порция выпускных проектов, на этот раз — студентов нашего образовательного проекта в МГТУ им. Баумана. Ребята сами опишут свои разработки, а посмотреть видео с защиты можно здесь. Если вы хотите попасть на учебу в образовательные центры VK, информацию об открытых наборах и курсах можно найти здесь.

Угадай мелодию

Многим известны шоу на ТВ и в интернете, в которых игроки угадывают песни по коротким отрывкам. Наверное, всем хотя бы раз представляли себя участником этой игры. Поэтому мы разработали навык «Угадай мелодию» для Маруси. На��а музыкальная библиотека включает песни разных десятилетий и жанров. Вот пример игры:

Игрок 1: Маруся, запусти навык «Угадай мелодию».

Маруся: Выберите тип игры — индивидуальный или соревновательный.

Игрок 2: Соревновательный.

Маруся: <Три секунды играет музыка>.

Игрок 1: Это Джастин Бибер!

Маруся: Вы не угадали! Играю следующие пять секунд.

Игрок 3: Это Эд Ширан!

Маруся: Вы угадали исполнителя, а сможете угадать название?

Игрок 1: Маруся, это Shape of you.

Маруся: Вы угадали. А теперь наслаждаемся песней. <Игроки слушают песню, заходит Игрок 4. Все здороваются>. 

Игрок 4: О, уже играете? Я как раз собрал плейлист для игры. 

Игрок 2: Наверное, одного The Weekend засунул?

Игрок 4: Нуу, нет. Маруся, запусти игру с плейлистом.

Маруся: Запускаю игру по плейлисту. <Играет три секунды трека, группа The Weekend>.

Рассмотрим подробнее доступные режимы игры: 

  • Индивидуальный, или обычная игра. В этом режиме пользователю предлагается выбрать исполнителя или жанр, а затем отгадать треки по фрагментам 3, 5 и 8 секунд. При этом фрагменты отобраны так, что каждый последующий идёт сразу за предыдущим, таким образом пользователь может отгадать трек за 16 секунд.

  • Соревновательный режим. Задача пользователей — набрать больше всего баллов. Количество начисляемых баллов зависит количества попыток, был ли назван исполнитель и название песни, или что-то одно. 

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

Под капотом нашего приложения есть стандартное — Go, Python и Postgres, — и интересное. Во время разработки мы столкнулись с рядом задач, которые необходимо было решить. Одной из них был лексический анализ. Благодаря ему Маруся может распознавать ответы пользователя, не обращая внимания на окончания и ошибки произношения. 

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

Также при загрузке песен в базу мы автоматически проверяем названия и исполнителей. Система убирает или заменяет знаки пунктуации, разбивает дуэты на отдельных исполнителей, опускает такие слова, как feat и radio edit, которые пользователи редко произносят при угадывании трека.

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

ДруМер

Представим ситуацию из жизни: недавно вышел новый фильм, на который Женя давно хотел сходить. Он зовёт своих лучших друзей, но все заняты. Тогда Женя открывает приложение для проведения мероприятий, но и там тишина. В VK он находит множество групп фанатов кино, но либо на выбранный фильм идти не хотят, либо уже посмотрели. Жене приходит ссылка на группу студсовета, в которой должен быть пост с приглашением на киноночь. Но постов так много, что найти нужный трудно. Кажется, в кино Женя сегодня не идёт…

Жизнь Жени станет проще, если он и администраторы групп ВКонтакте воспользуются миниприложением «ДруМер». Оно позволяет: 

  • Подключить виджет в группе ВКонтакте и хранить в одном месте все мероприятия. 

  • Стать организатором собственного события. 

  • Быстро поделиться информацией о мероприятии со своими друзьями. 

  • Найти интересное событие в своем городе. 

  • Пообщаться в чате с участниками мероприятия. 

  • Прикрепить фотографии прошедшего события. 

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

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

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

Администраторы группы студсовета могли бы добавить виджет приложения, и Женя нашёл бы информацию о предстоящий киноночи. Через профиль приложения пользователь может добавить группу, в которой он является администратором, и страница этой группы появится в ДруМере. А на странице группы во ВКонтакте появится виджет-ссылка на приложение, которую администратор может настроить самостоятельно: изменить текст или картинку.

Поскольку ДруМер — это миниприложение, мы можем легко интегрироваться с профилями пользователей и групп ВКонтакте. Для этого не нужна отдельная регистрация, достаточно перейти в наш сервис. Он доступен на всех платформах благодаря библиотеке VKUI. Серверная часть реализована с помощью Go и Postgres. Для сбора первоначального контента мы реализовали парсер групп VK, который преобразует информацию о мероприятиях в формат нашего приложения. 

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

SCG

SCG — это конструктор навыков для Маруси. Свой навык можно написать с нуля, потратив на это много времени, а можно воспользоваться уже готовым инструментом.

Нам было важно сделать конструктор простым в использовании и полезным для бизнеса. SCG избавит разработчиков от рутинных задач и поможет сосредоточиться на продумывании интересной бизнес-логики. Созданные навыки можно использовать для автоматизации работы сотрудников. SCG можно развернуть в приватном контуре организации, что позволит созданному навыку использовать информацию из корпоративной сети компании. А ещё конструктор подходит, для разработки как линейного, так и сложно-разветвлённого сценария общения Маруси с пользователем.

Рассмотрим подробнее работу SCG на примере навыка для приложения доставки пиццы, с помощью которого можно узнать, где находится курьер и когда он прибудет. Пропустим этап установки и разберём YAML-файл со сценарием. Описываем начальные параметры сценария, указываем сцену прощания и начальную сцену, а также названия кнопки, которая будет существовать в каждой сцене. При нажатии на неё мы провалимся в сцену прощания.

Опишем сцены, у нас их шесть:

  • Приветствие. 

  • Выбор действия помощника. 

  • Информация о курьере. 

  • Информация о доставке. 

  • Уточнение, требуется ли продолжение. 

  • И сцена прощания. 

В первой сцене есть два вида текста:

  • String — отображается на экране. 

  • Tts — его произносит Маруся. 

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

  • проверки пользовательского ввода, 

  • выбора информации о доставке и указания на переход на соответствующую сцену,

  • выбора информации о курьере. 

В конкретных сценах нужно указать тексты для кнопок. Кнопки поддерживают ссылки (при нажатии произойдёт переход) и передачу JSON-файла, который вернётся в запросе при нажатии на кнопку. Ещё мы должны указать, что сказать пользователю на его неожиданный ответ.

Программа поддерживает правила на основе совпадения с заданными словами или регулярными выражениями. Ещё одна интересная функция — добавление значений в текст. Вот сцена информации о доставки и в текст вставляет значение в минутах:

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

Человек: Привет.

Маруся: Привет! Я помощник пиццерии. Что ты хочешь узнать?

Человек: Когда придёт курьер?

Маруся: Курьер придёт через N минут Продолжим?

Человек: Нет.

Маруся: Пока.

SCG будет полезен малому бизнесу, он позволяет быстро сделать навык для голосового помощника для решения однообразных задач. Компания сэкономит на оплате колл-центра, интернета и электричества, покупке оборудования и найме сотрудников. Это позволит сократить расходы примерно на 70 %. Около 64 % разработчиков, внедривших голосового помощника, тратят большую часть своего времени на решение более сложных задач, а в остальных компаниях это удаётся лишь около 50 % разработчиков.

Расширение для людей с дислексией

Меня зовут Леля, и у меня дислексия — это распространённое нарушение способности к чтению и письму. Сегодня она встречается примерно у 15 % жителей планеты и создаёт им серьёзные проблемы в интеграции в повседневную жизнь, ведь всё-таки текст — одна из основных форм коммуникации в виртуальном пространстве. Людей с дислексией часто несправедливо обвиняют в лени или невнимательности, неграмотности или рассеянности. Важно понимать, что такие люди не могут просто исправить проблему — как минимум некоторые причины дислексии носят нейробиологический характер и не контролируются человеком. Некоторые симптомы дислексии могут быть не очевидны: быстрая утомляемость, проблемы с вниманием и ориентацией в пространстве, сложности с запоминанием. Многие люди могут даже не подозревать, что у них дислексия: Стивен Спилберг узнал об этом только в 60 лет. С похожими проблемами сталкивались и другие известные люди: Гай Ричи, Уолт Дисней, Стив Джобс, Генри Форд, Мухамед Али, Владимир Маяковский. Способа вылечить дислексию ученые пока не нашли. Но мы нашли способ облегчить её симптомы. С опорой на научные исследования мы создали расширение для браузера, который поможет людям с дислексией лучше и проще справляться с ежедневными задачами и быстрее интегрироваться в повседневную жизнь.

Есть несколько подвидов дислексии, каждый из которых имеет специфические проблемы и способы борьбы с ними. Большая часть людей с дислексией испытывает сложности при чтении — мы предлагаем им набор специальных шрифтов. Их характерные черты: асимметричные знаки, утолщения нижней части букв и различное написание похожих знаков. Всё это помогает визуально отличать буквы и слова друг от друга.

Мы учли рекомендации по дружелюбному к дислексии дизайну: помимо настройки шрифта наше приложение позволяет настраивать такие параметры текста, как толщина начертания и расстояние между строками. Однако дислексия — это не только про чтение и визуальное восприятие информации. Некоторые люди также подвержены синдрому гиперактивности и недостатка внимания. Чтобы помочь сосредоточиться на тексте, мы разработали режим линейки: человек может следить за тем, какую строчку он читает. 

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

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

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

Xartis

Любителям ролевых настольных игр знают, насколько долго и муторно рисовать игровые карты. Большинство доступных инструментов для создания городов и подземелий либо сложны в освоении, либо не подходят вовсе. И мы рады представить новый инструмент — Xartis (читается как Хартис).

На главной странице вас встречает уютный лендинг с краткой информацией о сервисе и документацией. Сердце нашего приложения — редактор игровой карты. Он оперирует тайлами — небольшими плитками изображений. 

Такая пиксельная графика знакома многим, она упрощает создание вашего мира. Слева находится панель инструментов для редактирования карты и тайлов. Мы реализовали исчерпывающий набор из 14 инструментов, среди которых генератор городов и подземелий. Редактор поддерживает слои, импорт изображений, пользовательских наборов и многое другое. При этом он остаётся производительным благодаря технологии Webassembly, надёжным благодаря React и узнаваемым благодаря компонентам MUI. 

У бэкенда микросервисная архитектура. Сервисы написаны на Go и каждый из них запускается в отдельном Docker-контейнере. Для хранения данных мы используем Redis и Postgres, для отдачи фронтенда, статичных данных и маршрутизации запросов — nginx. Для удобства разработки мы настроили авторазвёртывание с оповещением в Telegram и сбор метрик в Prometheus. Подняли Graphana и захостили собственный git. 

Но главная фишка нашего сервиса — автоматическое генерирование на карте основных сюжетов, облегчающая жизнь гейм-мастерам. Мы написали алгоритм пошагового заполнения карты объектами выбранного сюжета. Допустим, гейм-мастер захотел сгенерировать средневековый город. Исходя из текущего размера карты сервис определяет возможный размер города. Затем он создаёт ключевые узлы — площади и важные перекрёстки. После этого генерирует сетку дорог и выполняет её постобработку: удаляет близко проходящие маршруты и сглаживает углы между дорогами. После чего сервис наполняет город объектами по мере снижения значимости: начиная с домов и крупных зданий до заборов, ворот и т.д. А в завершение опоясывает город крепостной стеной. Многие из этих шагов нам удалось распараллелить и ускорить ответ клиенту. На финальном этапе объектам го��ода назначаются текстуры и результат отправляются на фронтенд.

KIRU

KIRU — это платформа для быстрого поиска одежды и готовых образов. Каждый, из вас хотя бы раз испытывал трудности при выборе одежды. Например, подолгу стоял у шкафа и думал: «Что же надеть?» Мы решили эту проблему с помощью электронного гардероба. 

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

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

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

Также мы опросили более 300 стилистов и fashion—блогеров, и оказалось, что проблема создания образов и их охватывают весь рынок одежды и моды. Людям нужна специальная платформа, на котором можно делиться своими идеями с аудиторией. В KIRU бренды и стилисты смогут выходить на свою целевую аудиторию без таргетированной рекламы. Система подтверждения через TG-бота позволяет любому пользователю получить статус стилиста. 

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

На фронтенде мы использовали React Native, что делает приложение кросс-платформенным. Основной API написан на Go. Для хранения пользовательских сессий используется Redis, а в качестве основного хранилища — Postgres. Для KIRU мы дополнительно разработали три микросервиса: 

  1. Для модерации стилистов написан Telegram-бот на Go. 

  2. Сервис удаления фона с фотографий, написан на Python с использованием openCV. 

  3. Классификатор вещей. Представляет собой gRPC API к нейронной сети ResNet34, которую мы дообучили на наборе данных DeepFashion.