Разработка русскоговорящего «аналога» Siri за 7 дней

    После выхода iPhone 4S с Siri «на борту», владельцы остальных гаджетов Apple, чувствовали себя немного обделенными. Даже в свой новый iPad Apple не включила Siri. Разработчиками по всему миру были предприняты попытки портировать Siri на другие устройства или написать похожие аналоги. И только русскоязычный App Store хранил молчание. Наверно все разработчики очень заняты, подумал я, и решил исправить это досадное недоразумение…

    DISCLAIMER:


    1. Слово «аналога» не зря взято в кавычки. Мое приложение ни капельки не аналог Siri, а любительская поделка. Я прекрасно понимаю, что для создания действительно чего то похожего на Siri, нужны гигантские ресурсы и много средств.
    2. Да я знаю что Apple объясняет, что не поддерживает другие iPhone, из за какого то специального чипа шумоподавления, встроенного в 4S. Но я не сильно в это верю, скорее всего их сервера не выдерживают нагрузки и от 4S. И если подключить к Siri все гаджеты Apple, сервера просто рухнут.
    3. Приложение создавалось как Just for fun и не преследовало ни каких практических целей. И кроме этого работалась еще и основная работа.

    Почему за 7 дней?


    Я, изначально, решил не тратить на этот проект много времени по нескольким причинам. Во первых, я прочел много статей где было написано, что Apple не пропускает программы, похожие на Siri в App Store. Более того пытается удалить из App Store уже существующие, например Evi. По этому, есть большая вероятность, что и мою программу не пропустят. Как кстати и случилось, с написанным мной, клиентом для rutracker.org. Я 4 раза отправлял приложение на ревю, исправлял все что говорили мне цензоры, но в App Store прога так и не попала (я потом плюнул на это дело и выложил урезанную версию на 4PDA, не пропадать же труду). Во вторых ресурсами, для написания полноценной программы, я, естественно, не обладаю.

    День 1-й. Проектирование


    Вначале я продумал саму логику приложения. Естественно все преобразования text to speech и speech to text, должно выполняться на сервере. А само приложение быть всего лишь интерфейсом. В этом случае, решение будет работать даже на самых слабых устройствах, а также обладать кроссплатформенностью. Для переносимости на Android и Windows Phone, потребуется всего лишь написать интерфейс на эти платформы.

    Таким образом логика приложения получилась такая:
    А) записываем речь собеседника и передаем на сервер для распознания;
    Б) получаем с сервера распознанную строку, и проводим легкую начальную обработку. Это ответы на самые частые вопросы, отсекаем маты и ругательства, перехватываем слова для поиска в Яндексе и поиска прогноза погоды. Другие команды типа отправь СМС или проверь почту, решил пока не встраивать из за опасения не пройти ревю;
    В) отфильтрованную строку посылаем на свой сервер для распознавания. И получаем в ответ строку с ответом;
    Г) посылаем ответ на сервер для преобразования в речь, получаем ссылку на поток mp3 и воспроизводим ответ;

    Да получается медленно, но пока другого варианта, кроме как объединить все это на одном своем сервере я не вижу. Но это уже совсем другой порядок затрат: выделенный мощный сервер, скорее всего не один; покупка и лицензирование движка распознавания речи преобразования текста в речь и др. Так что остановимся, пока на такой логике.

    День второй. Поиск движка


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

    Остановился я на движке ispeech.org. Во первых, он позволяет делать сразу два преобразования «речи в текст» и «текста в речь». Во вторых, он имеет SDK для iPhone и при использовании этого SDK выдается бесплатно ключ и распознавание бесплатно. Естественно, ради «шары» пришлось кое чем пожертвовать. Он отвратительно распознает русские города. По этому узнать прогноз погоды в каком то сложно произносимом городе не реально. В Москве без проблем.

    Изучаю его API. Я остановился на формате JSON. Передаю на сервер ключ, язык который надо распознать, служебные поля типа формата звукового файла и саму речь, закодированный в base64encode, .wave файл. Получаю ответ, так же в формате JSON, error, если ошибка. И строку текста и точность распознавания, если успех.
    Точно так же делается обратное преобразование. Посылаю на сервер строку для проговаривания, язык, и служебные поля и получаю в ответ mp3 поток, который и воспроизвожу.

    День 3-й. Начинаю писать приложение. Дизайн


    Стараюсь чтоб получилось что то похожее на Siri, но не повторяло в точности, а то цензоры зарубят.
    Вот что получилось.

    Ну совсем я не дизайнер. День потрачен зря.

    День четвертый. Пишу логику приложения


    Ничего сложного обычные http POST запросы. Встраиваю API. Первое тестирование. Ура!!! Работает, но не очень быстро. При WI FI нормально, хотя медленнее настоящей Siri. При 3G подтормаживает. При GPRS просто пытка, и ответа можно не дождаться. Причину понял быстро. На сервер передается файл wave, сжатый кодеком ULAW, дискретизация 44 КГц. Файл получается гигантский, надо пережать как для голоса на 8 КГц. Что то пережать не получается. Помечаю себе, что есть проблема, забиваю на это и двигаюсь дальше. Фильтрую маты и ругательства.


    День 5-й. Интегрирование поиска в Яндексе и погоды. Отправка в App Store


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


    День 6-й. Лингвистика и анализ речи. Написание сервера


    Штудирую литературу по искусственному интеллекту и анализу речи. Тихо офигеваю. Осваиваю азы. Решаю пока не заморачиваться на искусственном интеллекте, а просто разобрать приложение на фразы, сделать простейший анализ, выделить ключевые слова и уже по ним производить поиск в базе.
    Набрасываю краткую идею, в каком направлении двигаться. Значит составляю базу знаний, поиском сравниваю выделенные из предложения ключевые слова с базой и выдаю ту запись которая наиболее соответствует вопросу.
    Нахожу в открытых источниках словари для программ- собеседников, конечно качество их недостаточно и надо будет дорабатывать. Но для старта подойдет.

    Пишу не сложную программу на PHP для поиска ответов на своем сервере. Чтоб к серверу не обращались посторонние и не уронили его, предусмотрел передачу телефоном токена, который жестко зашит в приложении. Пока на авторизации решил сильно не заморачиваться.
    Так же решил пока не передавать на сервер GPS координаты телефона, хотя сама идея мне нравится. Зная координаты телефона можно использовать API какого либо погодного сервера, для выдачи прогноза погоды. Еще можно использовать координаты телефона для нахождения ближайших баров, кафе, магазинов. Но опять же нужен ресурс с нормальным API, на который послал запрос и координаты и получил внятный ответ. Записал эту идею и отложил на потом, если буду писать новую версию приложения.

    Все, заданные вопросы, и ответы на них заносятся в базу данных, кстати UDID [IMEI] телефончика тоже. Да да «Большой Брат» следит за вами (шутка). На самом деле это нужно для развития программы. Зная вопросы, которые задают, я смогу оперативно пополнять базу знаний и отлавливать глюки программы. UDID нужен для развития в дальнейшем. Я планирую чтоб программа помнила предыдущие вопросы, вот я и использую UDID для идентификации телефона. Зная предыдущие вопросы можно сделать поведение приложения еще более интеллектуальным. Интересно а Siri учитывает предыдущие вопросы при построении диалога?
    При поиске ответов по базе знаний, используется полнотекстовый поиск MATCH-AGAINST. Обычные SQL запросы, ничего особенного.

    День седьмой. Сегодня


    Протестировал как работает поиск по базе знаний. Остался доволен. Я сел писать статью на Хабр, а мой 12-ти летний сын изъявил желание по обучать базу знаний.
    Он нашел в интернет информацию, какие вопросы чаще всего задают Siri, и я долго смеялся. В данный момент я пишу эту статью, а он вкладывает «в голову» машине свое понимание этого мира. Что «ВКонтакте» лучше чем «Одноклассники» и другое. Я, конечно, потом все проверю, что он там занес в базу.


    Итог


    Что получилось.
    За семь дней вполне реально написать простейшего виртуального собеседника, который сможет поддержать беседу и отвечать на некоторые вопросы. Конечно до Siri ему как для луны, но как небольшое развлечение вполне годится. Именно в категорию «Развлечения», если цензоры пропустят приложение, оно и попадет.
    Легко можно портировать под Android и Widows Phone.

    Недостатки программы.
    1. Долгая отсылка речи на сервер из-за формата wave.
    Планирую уменьшить дискретизацию до 8 КГц, но пока не знаю как.

    2. Не очень хорошее распознавание речи, особенно русских городов, движком распознавания.
    Может воспользуюсь гугловским движком, он говорят лучше. Но для него нужно перекодировать речь в формат FLAC, что тоже пока не знаю как сделать. Надо искать соответствующую библиотеку. И, конечно, остается вопрос лицензионной чистоты такого пути.

    3. Работает медленнее чем Siri.
    Это решается только покупкой движка распознавания речи и установкой его на свой выделенный сервер. Не уверен, что пойду по такому пути, уж очень он затратный.

    4. Не может многое из того что может Siri.
    Ну эта проблема решается выпуском апдейтов и развитием базы знаний. Это всего лишь вопрос времени и выделенных на это средств.

    Если какие то моменты упустил, готов ответить в комментариях.

    UPD: По просьбам Хабражителей и во избежание недомолвок добавил видео.
    www.youtube.com/watch?v=UzFGgH741Cw

    UPD2: Добавил еще одно видео.
    www.youtube.com/watch?v=LVlllVSyln8

    UPD3: Предрелизная версия тут
    www.youtube.com/watch?v=JlkJva-TGfY
    Поделиться публикацией

    Похожие публикации

    Комментарии 67

      +2
      Судя по по чужому опыту, цензура не пропустит
        +1
        Надеюсь, что пропустят. Та программа, просто использует тот же движок, что и Siri. Да и американцы не сильны в русском.
          0
          Ну да, может дело и в вольфраме. Желаю удачи!
        0
        Вы упустили видео-демонстрацию.
          0
          Сейчас попробую на айпаде запустить, а на айфон заснять. Если получится, выложу ссылку на youtube.
            0
            Добавил видео, глядите.
              0
              Это видео c ограниченным доступом.
                0
                Как его расшарить, подскажите?
                  0
                  ХЗ честно говоря. Сам не сталкивался ни разу.
                    0
                    Все, уже исправил. Смотрите.
            0
            Добавил еще одно видео
            +21
            А как же чисто отечественное «Вы что, не видите, я занята!» и «Для обработки этого запроса возьмите талон в соседнем окне в пятницу утром после полнолуния»? По-моему, весьма оригинальные сообщения об ошибках выйдут
              +5
              Тогда уж «у меня голова болит»
                +21
                image
                +1
                Идея красивая. Когда ждать версию для дроида?
                  0
                  Вначале надо, чтоб эту apple пропустил. А там посмотрим.
                    +9
                    Да даже если apple и не пропустит. Точнее — как раз если не пропустит, то будет особенно уместно выпустить для андроида. Дескать, не хотите конкуренции — так получите ;-).
                      +4
                      Выпущу. Просто буду решать проблемы по мере их возникновения. Сначала завершу эпопею с Apple, потом займусь андроидом. А там, глядишь, и да windows phone дело дойдет.
                      +1
                      Могу помочь в портировании на Android )
                        0
                        Не хочу загадывать наперед. Не уверен, что сервер выдержит реализацию под iPhone. Если не упадет, то буду думать про андроид.
                        0
                        Мм, на андроид маркет легче пролезть)
                        0
                        Под андроид могу порекомендовать play.google.com/store/apps/details?id=com.luitech.remindit&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5sdWl0ZWNoLnJlbWluZGl0Il0.

                        Записывает todo голосом и напоминает в нужное время. Супер программа. Вечером еду в авто — надиктовываю голосом задачи на следующий день. Она распознает и напоминает в нужное время.
                          0
                          спасибо, завтра попробую!
                            0
                            Спасибо большое, офигеный софт :)
                              0
                              Да, отличная вещь. Особенно если докупить функцию синхронизации с гугл-календарем.
                              +2
                              под Андроид есть Кири (Kiri)
                                +2
                                Под Android есть практически все, но это не значит, что разрабатывать для него не стоит.
                                  0
                                  Вероятно, надо добавить «в том или ином виде». Много сталкивался, что программа «почти хороша», но — все же без блеска. В т.ч. и потому, что разработчик подчас — не многомиллиардная корпорация, а отдельный человек/группа, и у них нет дизайнера, нет (как в случае с голосовым движком) отряда лингвистов. С другой стороны, сравниваешь продукты одиночки и мегакорпорации, и порой обидно за корпорацию — «с такими-то ресурсами, и всего настолько лучше получилось?»
                              0
                              Ох, классная реализация! Я полгода назад мучался со Sphinx4 (и его упрощённой версией), в итоге забил.
                              Попробую ispeech
                                0
                                Чат-бота прикрутите, чтобы можно было «просто поболтать» :)
                                  +1
                                  Прикручу, конечно. Вот как раз с просто поболтать нет проблем, а вот чтоб полезную информацию выдавала- это труднее.
                                    +1
                                    Ага, едешь в машине, в пробке скучаешь — есть с кем поговорить.

                                    А еще можно ГИБДДнику в окно выставить, если что — пусть друг друга лечат.
                                    0
                                    А во сколько обошлась лицензия на технологии ispeech.org?
                                      0
                                      Для iphone бесплатно (хотя наверняка есть какие ограничения), но при использовании их SDK.
                                      +1
                                      Как раз сегодня по теме видел
                                      Youtube
                                      На 99% уверен, что фейк.

                                      А вот Ваша работа впечетляет. Отлично! Продолжайте развиваться :)

                                        0
                                        Может и не фейк, но путь ему в App Store закрыт. Они просто ломанули сири.
                                        0
                                        Слишком много думает)
                                          0
                                          Да, есть такое. В процессе формирования ответа задействованы 3 сервера. Из за этого и «тормоза».
                                          +1
                                          Почему бы не попробывать ответы бота, отправлять cылку на translate.google.com, там можно вытянуть файлик с произношением.
                                          Тобишь посылаем ответ на клиент текстом, а клиент уже формирует ссылку и забирает файлик с гугла. Конечно рано или поздно прикроют, но разгрузить свой сервер на время можно и повысить скорость ответа можно.
                                            0
                                            Можно попробовать. Но (1) Там ограничение 100 символов. (2) Остается вопрос о лицензионной чистоте такой операции. Да и скорости такое решение не прибавит.
                                            Нужно читать пользовательское соглашение с гуглом.
                                            Но если уж развивать по серьзному то нужен свой выделенный сервер и покупка речевого движка под него. Тогда скорость существенно возрастет. Но это не малые затраты.
                                            –4
                                            «И если подключить к Siri все гаджеты Apple, сервера просто рухнут.»
                                            — смеялся с этого до слез. Чего чего, а уж серверов думаю Эпл не жалко :)
                                              +2
                                              Гуглу — может быть, у них отлаженная инфраструктура
                                              А вот у Яббла специализация чуточку другая. Они вроде пока только собирались строить вычислительный центр к 2013 году. Да и вообще, пожизненное право пользование Siri при единовременной оплате — это весьма существенная уступка
                                              +1
                                              А не подскажете, где словари для программ-болталок брали?
                                              0
                                              Вообще, в iOS 5.1 уже вроде встроили API speech-to-text, может так проще будет. Не уверен насчёт русского.
                                                0
                                                Помоему, только на iPhone 4S эта фича будет работать (незнаю насчет The new iPad). В доке про это сказано.
                                                +1
                                                Может стоило к ней еще wikipedia прикрутить?
                                                  +1
                                                  Попробуйте для синтезации голоса VitalVoice, у него более вменяемое произношение, а то у Кати оно немного походит на дислексичку.
                                                    0
                                                      0
                                                      Спасибо, отправил им запрос. А какие у них расценки?
                                                        –2
                                                        Расценки у нас простые: 1 доллар = 1 минута речи.
                                                        Этот тариф подходит для наших основных клиентов — call-центров.
                                                        Но поскольку к нам сейчас обращается множество стартапов, объем трафика которых не всегда предсказуем, — общаемся в индивидуальном порядке, что конечно не есть хорошо…

                                                        Типичный пример коммуникации выглядит следующим образом:
                                                        — Дайте ключ API!
                                                        — Для каких целей?
                                                        — Хочу озвучивать свое шоу/видео/аналог siri/переводчик и т.п. Я даже готов платить. Сколько стоит?
                                                        — Есть стандартный тариф — доллар минута. Но в зависимости от ваших нагрузок, мы можем сделать для вас индивидуальный тариф.
                                                        — Вы офигели?! Для меня это дорого.
                                                        — Спрогнозируйте ваши приблизительные месячные нагрузки.
                                                        — …

                                                        обычно на этом этапе коммуникация обрывается.

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

                                                        Стараемся разрулить…
                                                        0
                                                        Спасибо большое сейчас протестирую.
                                                        Надо просто скорость речи увеличить немного.
                                                          0
                                                          Знаете, я попал впросак. Около трёх месяцев назад там была тестовая страничка, где можно было набрать текст не более 250 символов длиной. Думаю, вам бы сгодилось, дал ссылку, а там, оказывается, уже API для разработчиков без теста.
                                                            0
                                                            Ничего, я им запрос отправил.
                                                            0
                                                            Произвольный текст можно ввести на сервисе открыток. Используется обязательная музыкальная подложка и ограничение по количеству символов… уж извините.
                                                        0
                                                        Спасибо все хабражителям за помощь.
                                                        Предрелизная версия программы тут:
                                                        www.youtube.com/watch?v=JlkJva-TGfY
                                                          0
                                                          Наконец то Apple пропустил приложение (с четвертого раза!!!)
                                                          Ссылка на приложение:
                                                          itunes.apple.com/ru/app/sobesednik/id511330987?l=ru&ls=1&mt=8
                                                            0
                                                            >> Я прекрасно понимаю, что для создания действительно чего то похожего на Siri, нужны гигантские ресурсы и много средств.

                                                            Ресурсы на что? Вообще, что у сири уникального, своего? Распознавание — ньюанс. Парсинг — вольфрам. Поиск — гугл, бинг и еще кто-то там. Не знаю, правда, на счет генерации, но не удивлюсь если тоже не их. Так что в них такого инновационного? :)

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

                                                            Самое читаемое