После выхода iPhone 4S с Siri на борту владельцы других гаджетов Apple почувствовали себя немного обделенными.
Apple даже не включила Siri в свой новый iPad. Разработчики по всему миру предпринимают попытки портировать Siri на другие устройства или написать аналогичные аналоги.
И только русскоязычный App Store хранил молчание.
Наверное, все разработчики очень заняты, подумал я и решил исправить это досадное недоразумение.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:
1. Слово «аналог» не просто так взято в кавычки.Мое приложение — вовсе не аналог Siri, а любительская поделка.
Я прекрасно понимаю, что для создания чего-то действительно похожего на Siri нужны огромные ресурсы и много денег.
2. Да, я знаю, что Apple объясняет, что не поддерживает другие iPhone из-за какого-то специального чипа шумоподавления, встроенного в 4S. Но я в это не очень верю, скорее всего их сервера не выдержат нагрузки от 4S. А если подключить к Siri все гаджеты Apple, серверы просто рухнут. 3. Приложение создано просто для развлечения и не преследует никаких практических целей.
А кроме этого была проделана и основная работа.
Почему 7 дней?
Изначально я решил не тратить много времени на этот проект по нескольким причинам.Во-первых, я читал много статей, где писалось, что Apple не допускает в App Store программы, похожие на Siri. Более того, пытается удалить из App Store существующие, например Evi. Поэтому есть большая вероятность, что мою программу не пропустят. Как, кстати, произошло с клиентом, который я писал для rutracker.org. Я 4 раза отправлял приложение на рассмотрение, исправлял всё, что мне сказали цензоры, но в App Store программа так и не попала (впоследствии я отказался от этого дела и выложил урезанную версию на 4PDA, не не теряйте время).
Во-вторых, у меня естественно нет ресурсов для написания полноценной программы.
День 1. Дизайн
Сначала я продумал саму логику приложения.Естественно, все преобразования текста в речь и речи в текст должны выполняться на сервере.
А само приложение — это всего лишь интерфейс.
В этом случае решение будет работать даже на самых слабых устройствах, а также будет кроссплатформенным.
Для переносимости на Android и Windows Phone вам просто нужно написать интерфейс для этих платформ.
Таким образом, логика приложения получилась такой: А) записываем речь собеседника и передаем на сервер для распознавания; Б) получаем распознанную строку с сервера и проводим легкую первичную обработку.
Это ответы на наиболее часто задаваемые вопросы, отсекание нецензурной лексики и матерных слов, перехват слов для поиска в Яндексе и поиска прогнозов погоды.
Другие команды вроде отправки СМС или проверки почты я решил пока не встраивать, опасаясь не пройти проверку; В) отправляем отфильтрованную строку на наш сервер для распознавания.
И получаем в ответ строку с ответом; Г) отправить ответ на сервер для преобразования в речь, получить ссылку на mp3-поток и воспроизвести ответ; Да, получается медленно, но другого варианта, кроме как объединить все это на одном из своих серверов, я пока не вижу.
Но это совсем другой порядок затрат: выделенный мощный сервер, скорее всего, не один; покупка и лицензирование движка распознавания речи для преобразования текста в речь и т. д. Итак, остановимся пока на этой логике.
Второй день.
Поиск в системе Ищу двигатели.
Это оказалось немалой проблемой.
Во-первых, большинство из них платные и стоят более 50 долларов за 1000 слов, во-вторых, русскую речь распознают очень немногие, в-третьих, качество распознающих русский язык просто ужасное.
Я остановился на движке ispeech.org. Во-первых, он позволяет одновременно выполнять два преобразования «речь в текст» и «текст в речь».
Во-вторых, у него есть SDK для iPhone и при использовании этого SDK выдается бесплатный ключ и распознавание происходит бесплатно.
Естественно, ради «мяча» приходилось чем-то жертвовать.
Он плохо узнает русские города.
Поэтому узнать прогноз погоды в каком-то труднопроизносимом городе не представляется возможным.
В Москве проблем нет. Я изучаю его API. Я остановился на формате JSON. Я передаю на сервер ключ, язык, который необходимо распознать, служебные поля, такие как формат аудиофайла и саму речь, закодированную в base64encode, файл .
wave. Получаю ответ, тоже в формате JSON, ошибка, если есть ошибка.
И текстовая строка и точность распознавания, в случае успеха.
Обратное преобразование производится таким же образом.
Я отправляю на сервер строку с полями произношения, языка и обслуживания и получаю в ответ mp3-поток, который воспроизвожу.
День 3. Начинаю писать приложение.
Дизайн Я пытаюсь сделать так, чтобы это было похоже на Siri, но не совсем так, иначе цензоры меня убьют. Это то, что произошло.
Ну я вообще не дизайнер.
День потрачен впустую.
День четвертый.
Написание логики приложения Ничего сложного, просто обычные HTTP POST-запросы.
Я встраиваю API. Первое тестирование.
Ура!!! Это работает, но не очень быстро.
С WI-FI все в порядке, хотя и медленнее, чем у настоящей Siri. Тормозит на 3G. С GPRS это просто пытка, и ответа не дождешься.
Я быстро понял причину.
На сервер передается волновой файл, сжатый кодеком ULAW с частотой дискретизации 44 кГц.
Файл получается гигантский, его нужно сжимать как для голоса в 8 КГц.
Что-то невозможно сжать.
Отмечаю себе, что проблема есть, забываю о ней и иду дальше.
Я фильтрую нецензурную лексику и ругательства.
День 5. Интеграция поиска Яндекса и погоды.
Отправка в App Store Выделяю ключевые поля типа «поиск», «поиск», «найти», «погода» и т. д. Для достоверности приходится переспрашивать, что именно мы ищем и в каком городе нам нужен прогноз погоды.
Кажется, всё получается.
Вот и получается, что города плохо изучены.
Много работы потрачено впустую, но я решил не выбрасывать эту функцию, на случай, если движок со временем научится лучше понимать города.
Я тестирую снова и снова и снова.
Я доволен результатом.
Выкладываю приложение в App Store, пусть ждет обзора, пока напишу свой сервер.
День 6. Лингвистика и анализ речи.
Написание сервера Изучаю литературу по искусственному интеллекту и анализу речи.
Я тихо схожу с ума.
Я изучаю основы.
Я решаю пока не заморачиваться с искусственным интеллектом, а просто разобрать приложение на фразы, сделать простой анализ, выделить ключевые слова и выполнить поиск по базе данных по ним.
Намечаю краткую идею, в каком направлении двигаться.
Это означает, что я составляю базу знаний, использую поиск для сравнения ключевых слов, выбранных из предложения, с базой данных и создаю запись, которая наиболее точно соответствует вопросу.
Словари для программ-собеседников я нахожу в открытых источниках, но качество их конечно недостаточное и надо будет улучшать.
Но для начала это хорошо.
Я пишу простую программу на PHP для поиска ответов на своем сервере.
Чтобы посторонние не смогли получить доступ к серверу и не повредить его, я предусмотрел в телефоне передачу токена, который зашит в приложение.
Я пока решил особо не заморачиваться с авторизацией.
Я тоже решил пока не передавать GPS-координаты телефона на GPS-сервер, хотя сама идея мне нравится.
Зная координаты телефона, вы можете использовать API любого метеосервера для выдачи прогноза погоды.
Вы также можете использовать координаты своего телефона, чтобы найти ближайшие бары, кафе и магазины.
Но опять же нужен ресурс с нормальным API, на который вы отправляете запрос и координаты и получаете внятный ответ. Я записал эту идею и отложил на потом, если напишу новую версию приложения.
Все задаваемые вопросы и ответы на них заносятся в базу данных, кстати, и UDID [IMEI] телефона тоже.
Да-да, «Большой Брат» следит за тобой (шутка).
На самом деле это необходимо для развития программы.
Зная задаваемые вопросы, я могу быстро обновлять базу знаний и ловить глюки программы.
UDID необходим для будущего развития.
Я планирую, что программа запомнит предыдущие вопросы, поэтому для идентификации телефона использую UDID. Зная предыдущие вопросы, вы сможете сделать поведение приложения еще более разумным.
Интересно, учитывает ли Siri предыдущие вопросы при построении диалога? При поиске ответов в базе знаний используется полнотекстовый поиск ПОИСКПОЗ-ПРОГ.
Обычные SQL-запросы, ничего особенного.
День седьмой.
Сегодня Протестировал, как работает поиск по базе знаний.
Я был рад. Я сел писать статью на Хабр, и мой 12-летний сын изъявил желание обучить базе знаний.
Он нашел в Интернете информацию о том, какие вопросы Сири задают чаще всего, и долго смеялся.
В данный момент я пишу эту статью, а он закладывает свое понимание этого мира «в голову» машины.
Что ВКонтакте лучше Одноклассников и не только.
Я, конечно, потом проверю все, что он внес в базу.
Нижняя граница
Что случилось.За семь дней вполне можно написать простого виртуального собеседника, который сможет вести беседу и отвечать на некоторые вопросы.
Конечно, Siri ему ни на что не похожа, но в качестве небольшого развлечения вполне подойдет. Именно в категорию «Развлечения» если цензоры пропустят приложение, оно попадет. Легко портируется на Android и Windows Phone. Недостатки программы.
1. Отправка речи на сервер занимает много времени из-за волнового формата.
Я планирую снизить частоту дискретизации до 8 кГц, но пока не знаю, как это сделать.
2. Не очень хорошее распознавание речи, особенно российских городов, движком распознавания.
Возможно воспользуюсь движком Гугла, говорят он лучше.
Но для этого нужно перекодировать речь в формат FLAC, что я тоже пока не умею делать.
Нам нужно искать подходящую библиотеку.
И, конечно, остается вопрос о лицензионной чистоте этого пути.
.
3. Работает медленнее, чем Siri. Решить эту проблему можно только купив механизм распознавания речи и установив его на выделенный сервер.
Не уверен, что пойду по этому пути, это очень дорого.
4. Многое из того, что Siri не умеет. Что ж, эта проблема решается выпуском обновлений и развитием базы знаний.
Это лишь вопрос времени и средств, выделенных на это.
Если я упустил какие-то моменты, готов ответить в комментариях.
УПД: По просьбе Хабражителя и во избежание недомолвок добавил видео.
www.youtube.com/watchЭv=UzFGgH741Cw УПД2: Добавил еще одно видео.
www.youtube.com/watchЭv=LVlllVSyln8 UPD3: Предварительная версия здесь www.youtube.com/watchЭv=JlkJva-TGfY Теги: #разработка для iOS #Siri #распознавание речи #разработка для iOS
-
Алюминиевая Промышленность
19 Oct, 24 -
Ниренберг, Маршалл Уоррен
19 Oct, 24 -
Бюджетный Мультирум На Базе Snapcast
19 Oct, 24 -
Диалоги О Письмах
19 Oct, 24