Распознавание, синтез и понимание смысла речи в Processing и YandexSpeechKit

Тема в разделе "Глядите, что я сделал", создана пользователем okuznetcov, 19 сен 2015.

  1. okuznetcov

    okuznetcov Нерд

    С месяц назад в разделе "Rasberry Pi" форума Амперки я начал тему на предмет распознавания речи. Тогда я хотел создать голосовой интерфейс, который просто реагировал на такие команды как: свет, температура, жалюзи и т.д. Прошло больше месяца, стало куда интереснее...

    Надо сказать, сначала я планировал делать систему на базе BitVoicer. Это программа распознавания под Windows, которая позволяет с легкостью создавать собственные голосовые интерфейсы. В программе из коробки доступна связь с Arduino по COM-порту, голосовая активация, и довольно удобный интерфейс. Минус у такого решения один: отсутствие поддержки Linux, OS X, и других UNIX-подобных платформ. Покупать здоровый компьютер, пусть и m-ITX не как не хотелось. Нужно было что-то другое. Далее я наткнулся на решение от девелопера с никнеймом "Getflourish". Этот разработчик написал библиотеку под Processing, которая позволяет прикрутить к нему распознавание речи от Google. Вся проблема в том, что Google заблокировал доступ к их API. В общем, пришлось делать свое.

    Начал я с поиска платформы распознавания. По началу я не мог найти подходящую мне систему и думал писать собственную нейронную сеть. Благо я нашел в интернете подробную инструкцию как это сделать. Однако потом я как-то случайно наткнулся на решение Яндекса. Оно было идеально: вы просто отправляете POST-запрос с аудиофайлом и индефикационными данными на сервер и через секунду получаете текст. Я начал писать программу под это дело. Долго не мог понять как прикрутить отправку запросов в Яндекс. Честно сказать, так и не понял. Я просто автоматизировал открытие cURL-скрипта из терминала. Затем я написал программу, которая получает результат и сохраняет его в переменную. Я решил что я уже добился какого-либо результата, и решил снять небольшую демонстрацию. Через несколько дней я увидел что тема действительно заинтересовала людей. Счетчик просмотров показывал 180, что для маленького раздела "Raspberry Pi" было весьма неплохо. Еще через несколько дней мне написал человек и попросил поподробнее рассказать о проекте. Надо сказать, это было чертовски приятно. Я пообещал, что в скором времени расскажу о нем поподробнее. Обещание я сдержал ;).

    Двигаемся дальше. У нас уже есть алгоритм, который умеет преобразовывать текст в речь. Далее нам необходимо каким-либо образом понять, какую смысловую нагрузку несет этот текст. В начале я использовал функцию .equals(), которая сравнивает результат с эталонным и выдает true или false. Однако этого было мало. Например, смысловую нагрузку "включить свет" может одновременно нести десяток фраз. Не говоря уже о неточности распознавания. Вывод был очевиден: был необходим инструмент, который смог бы работать с распознанным текстом. После плодотворного поиска ответа в Google, я нашел два варианта. Первый представлял собой бинарную программу, которая приводила все слова к начальному виду и ставила между ними разделители. Второй вариант принадлежал семейству YandexSpeechKit и позволял извлекать только определенные виды информации. Совсем отчаявшись, как-то случайно, в комментариях на Хабре я наткнулся на сервис Wit.ai. Этот сервис представляет собой удобный набор инструментов, который позволяет с помощью HTTP-запросов или мобильных SDK взаимодействовать с их серверами. После регистрации вы получаете абсолютно пустую консоль, в которой вам предстоит ввести вашу первую команду. После данной процедуры система включает режим обучения, и где-то через минуту сообщает об окончании обучения. После этого разработчик может сформировать HTTP-запрос через тот же cURL и протестировать работу сервиса. За день-два я научил Wit.ai извлекать текст и смысл из запросов. Я также реализовал дистанционное программирование ассистента с помощью веб-интерфейса через xml-файл.

    Последнее что нам нужно для действительно полноценного ассистента- синтез речи. Изначально я планировал разрабатывать модуль синтеза на базе технологий Google, однако оказалось, что они поставили капчу на их сервис. Начался поиск альтернативы. Следующим вариантом стал Яндекс опять же с их технологиями SpeechKit. После первых тестов окончательно решил: для синтеза все что угодно, кроме Яндекса. Голос был настолько ужасный что к программе появлялось отвращение. Через несколько дней после ударного поиска других систем синтеза я нашел идеальный вариант. Им стал сервис "Ivona" компании Amazon. На выбор предоставляется два голоса: мужской и женский. В отличие от остальных систем синтеза, здесь голоса были записаны в HD-качестве. Буквально за полчаса я написал код, который смог бы говорить любой текст, и что более интересно, самообучаться. Оставалось только написать несколько функций для простого программирования.

    На этом история разработки не заканчивается, у меня есть еще много планов по поводу этого проекта. В ближайшем будущем я собираюсь интегрировать ассистент с IFTTT и Arduino. Как всегда я снял небольшую видео-демонстрацию, в которой вы можете взглянуть на новый функционал.


    Если у вас есть какие-либо вопросы по поводу моего проекта, пишите на okuznetcov@me.com
     
    Последнее редактирование: 20 сен 2015
    yul-i-an и Tomasina нравится это.
  2. EvgenJekson

    EvgenJekson Нерд

    Я для подобного купил EasyVR Shield 3.0. Правда пока еще не подключал...
    Но ваше решение в закладки. Есть проект полузапущенный, где тоже произвожу анализ голоса. Правда там было на гугле. Не знал, что они лавочку прикрыли...

    Хочу собаку сделать с выполнением команд типа "фас", "ко мне", "место" и так далее. Ваше решение наверное будет инетереснее, чем EasyVR Shield 3.0, если команд будет много. На EasyVR Shield 3.0 ограниченное кол-во команд (что то около 20 или 30). Да и у вас бесплатно.

    Кстати, зря вы так про неприятие команд активации. Выглядит это лучше, чем "микрофоном пошуршать", удобнее и можно удаленно от устройства активировать.
     
    Последнее редактирование: 23 дек 2015
  3. okuznetcov

    okuznetcov Нерд

    Спасибо за фидбэк. Для вашего проекта безусловно лучше подойдет EasyVR Shield. Мое решение имеет несколько недостатков, и самый главный — задержка в 1,5 - 2 секунды. Побороть эту проблему возможно только разместив нейронную сеть локально. Сейчас я приостановил проект (но не забыл о нем!), занимаюсь собственной разработкой умного дома. Думаю разместить пост на форуме.
    Снимок экрана 2015-12-23 в 12.53.34.png Снимок экрана 2015-12-23 в 12.53.43.png Снимок экрана 2015-12-23 в 12.53.51.png IMG_1002.JPG IMG_1003.JPG IMG_1008.JPG
     
  4. EvgenJekson

    EvgenJekson Нерд

    На счет умных домов я пока не понимаю для чего это может быть нужно кроме как для прокачки своих способностей в построении подобных систем. Ну правда? Зачем иметь возможность выключить ту или иную розетку? Или переключить канал телевизора? Фан?
     
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Плюс стопятьсот! Дом должен сам решать что делать а не "включаться" разными прикольными способами.
     
  6. okuznetcov

    okuznetcov Нерд

    Разумеется, кроме банального ВКЛ/ВЫКЛ реализованны правила, которые в зависимости от входных данных каким-либо образом влияют на тот или иной параметр. Ну и без фана конечно некуда ;) Однако зачастую необходимо именно ручное управление. Надо сказать, проект получился реально классный. Интерфейс управления, кстати, самописный (реализован на HTML, CSS и JS) и доступен из любой точки мира (okuznetcov.ru/control/)
     
  7. sonoleo

    sonoleo Нуб

    Доброго времени суток! Во-первых по ссылке okuznetcov.ru/control/ перехода нет. Тема понимания речи давно меня интересует (более 40 лет, тогда деревья (и компьютеры) были большими). Если у Вас были определенные успехи, то почему в Умном Доме использовали именно ручное управление, а не голосовое? Совсем здорово было бы общаться с Умным Домом через диалог на естественном языке. Например, я прошу включить торшер, а он мне в ответ - не могу, лампочка перегорела или электричество закончилось.
    О нас. В нашей группе несколько человек. Каждый занимается своим направлением - механика, голосовое сопровождение, компьютерное зрение и обучение. И там свои подразделы. Почитать и поучаствовать можно на нашем форуме http://www.ego-info.ru/forum/viewforum.php?f=3.
    Однорукий бандит уже хулиганит на столе (несколько моторчиков успело сгореть). В этом ему помогает ардуино. Имеется Raspberry Pi 2. На ней уже работаем с фотографиями. Впоследствии соединим ардуины с малиной и ноутбуком помощнее. И питание станет автономное.
    Сейчас попытался подключить к малине наушники и микрофон. И споткнулся. Малина в упор не видит микрофон. Наушники и динамики самые разные видит и работает через аналог. В HDMI контакт не имею. Проговаривает WAV файлы. Эти я сам создавал давно своей программой.
    Может окажете помощь в чём проблема с подключением (распознаванием) микрофона :(. Операционка у нас Rasbian.
    Мой мэйл miup@ego-info.ru. Если у Вас есть интерес, то общаться можно здесь, через мой мэйл или на нашем форуме.
     
    Последнее редактирование: 24 июн 2016