Прототип голосового списка покупок для WP8, Win8, Android c бекендом в Azure за 2,5 часаИсточник: habrahabr Atreides07
С 9 по 11 ноября проходил Windows 8 Хакатон RUWOWZAPP, куда я сначала зарегистрировался как участник, а потом удостоился чести присутствовать на мероприятии в качестве эксперта. Будучи в качестве эксперта я познакомиться со множеством замечательных людей и их проектов. Было настолько интересно что продолжал консультировать даже по ночам, и на сон оставалось 4-5 часов. Я настолько заразился позитивом и энергией и желанием людей создавать, что тоже не удержался от создания своего небольшого прототипа приложения - Списка покупок с поддержкой распознавания голоса. Мне не хотелось участвовать в конкурсе приложений с таким сырым прототипом, но мне очень хотелось показать то что я сделал за пару часов, и в последний момент, перед выступлением последнего участника встал в очередь на выступление, и ведущий позволил мне продемонстрировать свои поделки:
Приложение вызвало большой интерес у участников хакатона и фактически это обещанная статья со всеми ответами на вопросы, на которые тогда у меня не хватило времени. Для тех кто хочет сразу посмотреть код, исходники можно скачать здесь
Идея приложения.Фактически изначально я хотел наконец таки в деле попробовать распознавание голоса в WP8 которое стало доступна разработчикам. И мне хотелось сделать решение, которое бы дружило именно с русским языком. Я остановился на следующем наборе команд: Купить [продукт] - добавление продуктов в список Я посчитал что смогу сделать такое приложение для трех платформ за 6 часов, забегая вперед скажу что у меня оказалось меньше времени чем я рассчитывал и успел только первые 4 команды.
Распознавания голоса. - 1 час.WP8 очень хорошо работает с английским языком и хорошо распознает даже для моего акцента. Но при этом оказалось что возможности распознавания на русском языке гораздо ограничено. Для русского языка WP8 распознавать только заранее заданный словарь. Убил на это примерно полчаса. Мне очень хотелось сделать именно русский язык, и так как у меня был уже опыт работы с сервисами распознавания голоса, решил на время прикрутить какой нибудь коммерческий движок распознавания голоса. Однако с тех пор как я с ними работал последний раз у них ничего не изменилось и фактически ни у кого не было автоматизированного пробного или платного периода. И так как со всеми сервисами необходимо было общаться с менеджерами, решил прикрутить для демки распознавание голоса от гугла. Я специально поискал условия использования гугловского движка распознавания голоса и не смог найти, но помнил что где то видел что нельзя использовать в коммерческих целях (хотя, возможно, ошибаюсь). Огромное спасибо Yakhnev за прекрасную статью с исходниками на C#. Понадобилось всего 10 минут для того что бы сделать из его десктопного проекта веб проект, с API для распознавания голоса. Но так как у приложения не было возможности сохранять файл на диске, а времени на переделывания распознавания в памяти не было, пришлось отказаться от бесплатного Web Role в Azure. Благо у меня уже было развернуто пара виртуалок в Azure, переделать и залить проект на сервер не составило никаких проблем. В итоге поднял сервис распознавания с точкой доступа voice.akhmed.ru/recognize.ashx - куда POST Запросом заливаю WAV файл и на выходе получаю текст.
Приложение для WP7 - 30 минутБольше всего времени понадобилось для приложения на WP7. Но только потому что эта платформа была тестовым полигоном и за время разработки постоянно менял код. После того как поднял сервис распознавания голоса стал вопрос о распознавании голоса на устройстве. Так как, теперь нам не надо было делать приложение именно под WP8 я решил сделать версию на WP7, что давало дополнительное преимущество - прототип работает на любом WP устройстве. Запись микрофона достаточно нетревиальная задача на WP7, но у меня уже была моя библиотека WPExtensions которая позволяла легко записать голос в WAV файл. В AppBar добавил одну фиктивную кнопку добавления в список записей руками и добавил кнопку с микрофоном, который при первом нажатии начинал запись, а при повторном нажатии отправлял запись на сервер и обрабатывал результат:
Метод отправки тоже достаточно тривиален, в нем отправляю ответ на сервер и обрабатываю полученный ответ
Было очень много вопросов о том как именно осуществляется разбор команд, что за библиотеку использую для анализа текста, как фильтруются лишние слова типа "купить" или "и". Конечно в релизе надо делать гораздо более грамотное решение с морфологическим и синтаксическим анализом, но сейчас код до безобразия прост. Я просто использую первое слово в качестве команды и фильтрую все слова до двух букв.
Бекенд приложения - 20 минутДля того что бы обеспечить синхронизацию с другими устройствами, необходимо было сделать серверную часть. Конечно такой бекенд идеальный кандидат на размещение в Azure в качестве веб роли, но для прототипа можно было разместить на той же виртуалке в Azure, что и распознавание голоса. Так как у нас время сильно ограничено то имеет смысл сделать SOAP сервис, так как студия умеет генерировать быстро прокси на клиенте. Сервис тоже прост до безобразия. У меня есть один список покупок, который я перенес с клиента на сервер (для клиента будет сгенерирован в прокси).
Честно говоря два поля Price и Valute лишнее, так как я не успел их использовать, но привожу код "как есть".
Конечно в релизе должно быть не полное обновление списка как есть а частичное обновление измененных данных, но для прототипа и так сгодится.
В конечном итоге поднял этот сервис по адресу voicegrocery.akhmed.ru/GroceryService.asmx Теперь вопрос как доставлять обновления клиентам? Конечно же по PushNotification. Но его реализация могла отнять много времени, которого было в обрез и я сделал запрос с клиента в 5 секунд.
Логика обновления на/с клиента очень проста.
Портирование на Windows 8 - 10 минут.Портирование приложения на Win8 получилось очень просто. Я не стал реализовывать распознавание голоса на клиенте и получилось одностороняя синхронизация. XAML был скопирован практически без изменений, немножко пришлось подправить код отправки на сервер. Стал чуть проще - в один метод
Портирование приложения на Android - 15 минут.Я обожаю платформу моно. Код остался практически без изменений, осталось подправить UI. Так как для Android-а представление делать значительно сложнее, я не стал тратить много времени на создание кастомного адаптера и после 5 минут откатился и сделал простой текстовый список с текстовыми крестиком в скобках:
Портирование на iOS - отсутствуетКонечно же я думал о том что бы портировать на iOS, но так как у меня не было i-устройств
ИтогиЕсли не учитывать 40 минут которые были потрачены на исследования возможностей платформы WP8, то чуть менее чем за 2 часа с учетом затрат на заливку на сервер и мелкие багфиксы был реализован полноценный прототип, который показывает основную идею приложения и не жалко выкинуть и приступить к полноценной реализации. Конечно код получился очень грязный, неоптимальный, с кучей недостатков и недоделанных фич. Но функциональные прототипы как раз нужны для того что бы на "бумажном эскизе" - на черновике показать заказчику/начальству продукт который получится на выходе. |