Pаспознавание речи и мгновенный перевод. Два сервиса распознавания речи и перевода в текст онлайн

Человека всегда привлекала идея управлять машиной естественным языком. Возможно, это отчасти связано с желанием человека быть НАД машиной. Так сказать, чувствовать свое превосходство. Но основной посыл - это упрощение взаимодействия человека с искусственным интеллектом. Управление голосом в Linux с переменным успехом реализуется без малого уже четверть века. Давай разберемся в вопросе и попробуем сблизиться с нашей ОС настолько, насколько это только возможно.

Суть дела

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

Следует различать собственно системы распознавания речи (перевод речи в текст или в команды), такие как, например, CMU Sphinx, Julius, а также приложения на основе этих двух движков, и голосовые ассистенты, ставшие популярными с развитием смартфонов и планшетов. Это, скорее, побочный продукт систем распознавания речи, дальнейшее их развитие и воплощение всех удачных идей распознавания голоса, применение их на практике. Для Linux-десктопов таких пока мало.

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

Что было раньше

Исторически сложилось так, что все системы работы с речью в Linux развивались не спеша и скачкообразно. Причина не в криворукости разработчиков, а в высоком уровне вхождения в среду разработки. Написание кода системы для работы с голосом требует высокой квалификации программиста. Поэтому, перед тем как начать разбираться с системами работы с речью в Linux, необходимо сделать небольшой экскурс в историю. Была когда-то в IBM такая чудесная операционная система - OS/2 Warp (Merlin). Вышла она в сентябре далекого уже 1996 года. Кроме того, что она обладала очевидными преимуществами перед всеми остальными операционками, OS/2 была укомплектована весьма продвинутой системой распознавания речи - IBM ViaVoice . Для того времени это было очень круто, учитывая, что ОС работала на системах с 486-м процессором с объемом ОЗУ от 8 Мбайт (!).

Как известно, OS/2 проиграла битву Windows, однако многие ее компоненты продолжили существовать независимо. Одним из таких компонентов стала та самая IBM ViaVoice, превратившаяся в самостоятельный продукт. Так как IBM всегда любила Linux, ViaVoice была портирована на эту ОС, что дало детищу Линуса Торвальдса самую передовую для своего времени систему распознавания речи.

К сожалению, судьба ViaVoice сложилась не так, как хотели бы линуксоиды. Сам движок распространялся бесплатно, но его исходники оставались закрытыми. В 2003 году IBM продала права на технологию канадо-американской компании Nuance. Nuance, разработавшая, пожалуй, самый успешный коммерческий продукт для распознавания речи - Dragon Naturally Speeking , здравствует и ныне. На этом бесславная история ViaVoice в Linux практически закончилась. За то короткое время, что ViaVoice была бесплатной и доступной линуксоидам, к ней разработали несколько интерфейсов, таких, например, как Xvoice. Однако проект давно заброшен и ныне практически неработоспособен.

INFO

Самое сложное звено в машинном распознавании речи - естественный человеческий язык.

Что сегодня?

Сегодня все гораздо лучше. В последние годы, после открытия исходников Google Voice API, ситуация с развитием систем распознавания речи в Linux значительно улучшилась, выросло качество распознавания. Например, проект Linux Speech Recognition на основе Google Voice API показывает очень неплохие результаты для русского языка. Все движки работают примерно одинаково: сначала звук с микрофона устройства юзера попадает в систему распознавания, после чего либо голос обрабатывается на локальном устройстве, либо запись отправляется на удаленный сервер для дальнейшей обработки. Второй вариант больше подходит для смартфонов или планшетов. Собственно, именно так и работают коммерческие движки - Siri, Google Now и Cortana.

Из всего многообразия движков для работы с человеческим голосом можно выделить несколько активных на данный момент.

WARNING

Установка многих из описанных систем распознавания речи - нетривиальная задача!

CMU Sphinx

Большая часть разработки CMU Sphinx ведется в университете Карнеги - Меллона. В разное время над проектом работали и Массачусетский технологический институт, и покойная ныне корпорация Sun Microsystems. Исходники движка распространяются под лицензией BSD и доступны как для коммерческого, так и для некоммерческого использования. Sphinx - это не пользовательское приложение, а, скорее, набор инструментов, который можно применить в разработке приложений для конечных пользователей. Sphinx сейчас - это крупнейший проект по распознаванию речи. Он состоит из нескольких частей:

  • Pocketsphinx - небольшая быстрая программа, обрабатывающая звук, акустические модели, грамматики и словари;
  • библиотека Sphinxbase, необходимая для работы Pocketsphinx;
  • Sphinx4 - собственно библиотека распознавания;
  • Sphinxtrain - программа для обучения акустическим моделям (записям человеческого голоса).

Проект развивается медленно, но верно. И главное - его можно использовать на практике. Причем не только на ПК, но и на мобильных устройствах. К тому же движок очень хорошо работает с русской речью. При наличии прямых рук и ясной головы можно настроить распознавание русской речи с помощью Sphinx для управления домашней техникой или умным домом. По сути, можно обычную квартиру превратить в умный дом, чем мы и займемся во второй части этого обзора. Реализации Sphinx имеются для Android, iOS и даже Windows Phone. В отличие от облачного способа, когда работа по распознаванию речи ложится на плечи серверов Google ASR или Яндекс SpeechKit, Sphinx работает точнее, быстрее и дешевле. И полностью локально. При желании можно научить Sphinx русской языковой модели и грамматике пользовательских запросов. Да, придется немного потрудиться при установке. Равно как и настройка голосовых моделей и библиотек Sphinx - занятие не для новичков. Так как основа CMU Sphinx - библиотека Sphinx4 - написана на Java, можно включать ее код в свои приложения для распознавания речи. Конкретные примеры использования будут описаны во второй части нашего обзора.

VoxForge

Особо выделим понятие речевого корпуса. Речевой корпус - это структурированное множество речевых фрагментов, которое обеспечено программными средствами доступа к отдельным элементам корпуса. Иными словами - это набор человеческих голосов на разных языках. Без речевого корпуса невозможна работа ни одной системы распознавания речи. В одиночку или даже небольшим коллективом создать качественный открытый речевой корпус сложно, поэтому сбором записей человеческих голосов занимается специальный проект - VoxForge .

Любой, у кого есть доступ к интернету, может поучаствовать в создании речевого корпуса, просто записав и отправив фрагмент речи. Это можно сделать даже по телефону, но удобней воспользоваться сайтом. Конечно, кроме собственно аудиозаписи, речевой корпус должен включать в себя дополнительную информацию, такую как фонетическая транскрипция. Без этого запись речи бессмысленна для системы распознавания.


HTK, Julius и Simon

HTK - Hidden Markov Model Toolkit - это инструментарий для исследования и разработки средств распознавания речи с использованием скрытых марковских моделей, разрабатывается в Кембриджском университете под патронажем Microsoft (Microsoft когда-то выкупила этот код у коммерческого предприятия Entropic Cambridge Research Laboratory Ltd, а затем вернула его Кембриджу вместе с ограничивающей лицензией). Исходники проекта доступны всем желающим, но использование кода HTK в продуктах, предназначенных для конечных пользователей, запрещено лицензией.

Однако это не означает, что HTK бесполезен для Linux-разработчиков: его можно использовать как вспомогательный инструмент при разработке открытых (и коммерческих) средств распознавания речи, что и делают разработчики открытого движка Julius, который разрабатывается в Японии. Julius лучше всего работает с японским языком. Великий и могучий тоже не обделен, ведь в качестве голосовой базы данных используется все тот же VoxForge.

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов.

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

Транскрибация – это запись аудио или видео-файла в текстовом виде. Есть в интернете оплачиваемые платные задания, когда за транскрибацию текста исполнителю выплачивается некоторая сумма денег.

Перевод речи в текст полезен

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

Опишем наиболее эффективные инструменты, доступные на ПК, мобильные приложения и онлайн-сервисы.

1 Сайт speechpad.ru

Это онлайн-сервис, который позволяет через браузер Google Chrome переводить речь в текст. Сервис работает с микрофоном и с готовыми файлами. Конечно, качество будет значительно выше, если использовать внешний микрофон и диктовать самому. Однако сервис неплохо справляется даже с видеороликами на YouTube.

Нажимаем «Включить запись», отвечаем на вопрос про «Использование микрофона» – для этого кликаем «Разрешить».

Длинную инструкцию про использование сервиса можно свернуть, нажав на кнопку 1 на рис. 3. От рекламы можно избавиться, пройдя несложную регистрацию.

Рис. 3. Сервис speechpad

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

Список видео-уроков по работе с speechpad:

Можно транскрибировать видео с Youtube или со своего компьютера, правда, понадобится микшер, подробнее:

Видео «транскрибирование аудио»

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

2 Сервис dictation.io

Замечательный онлайн-сервис, который позволит бесплатно и легко переводить речь в текст.

Рис. 4. Сервис dictation.io

1 на рис. 4 – русский язык можно выбрать в конце страницы. В браузере Google Chrome язык выбирается, а в Мозилле почему-то нет такой возможности.

Примечательно то, что реализована возможность автосохранять готовый результат. Это убережет от случайного удаления в результате закрытия вкладки или браузера. Готовые файлы этот сервис не распознает. Работает с микрофоном. Нужно называть знаки препинания, когда производите диктовку.

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

3 RealSpeaker

Эта программа позволяет легко переводить человеческую речь в текст. Она предназначена для работы в разных системах: Windows, Android, Linux, Mac. С ее помощью можно преобразовывать речь, звучащую в микрофон (например, он может быть встроен в ноутбук), а также записанную в аудиофайлы.

Может воспринимать 13 языков мира. Существует бета-версия программы, которая работает в режиме онлайн-сервиса:

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

В 2017-ом году был бесплатный вариант транскрибации с помощью RealSpeaker, в 2018-ом году такой возможности нет. Сильно смущает тот момент, что транскрибированный файл доступен всем пользователям для скачивания, возможно это будет доработано.

Контакты разработчика (ВКонтакте, Facebook, Youtube, Твиттер, электронная почта, телефон) программы можно найти на странице его сайта (точнее, в подвале сайта):

4 Speechlogger

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

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

5 Dragon Dictation

Это приложение, которое распространяется бесплатно для мобильных устройств от компании Apple.

Программа может работать с 15 языками. Она позволяет редактировать результат, выбирать из списка нужные слова. Нужно четко проговаривать все звуки, не делать лишних пауз и избегать интонации. Иногда возникают ошибки в окончаниях слов.

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

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

Также полезные сервисы:

Получайте актуальные статьи по компьютерной грамотности прямо на ваш почтовый ящик .
Уже более 3.000 подписчиков

.

«Хотелось бы сразу сказать, что с сервисами распознавания имею дело впервые. И поэтому расскажу о сервисах, с обывательской точки зрения» - отметил наш эксперт – «для тестирования распознавания я использовал пользовался тремя инструкциями: Google, Yandex и Azure».

Google

Небезызвестная IT-корпорация предлагает протестировать свой продукт Google Cloud Platform в режиме онлайн. Опробовать работу сервиса может бесплатно любой желающий. Сам продукт удобен и понятен в работе.

Плюсы:

  • поддержка более чем 80 языков;
  • быстрая обработка имен;
  • качественное распознавание в условиях плохой связи и при наличии посторонних звуков.

Минусы :

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

Yandex

Распознавание речи от Yandex предоставляется в нескольких вариантах:

  • Облако
  • Библиотека для доступа с мобильных приложений
  • «Коробочная» версия
  • JavaScript API

Но будем объективными. Нас, в первую очередь, интересует не разнообразие возможностей использования, а качество распознавания речи. Поэтому, мы воспользовались пробной версией SpeechKit .

Плюсы:

  • простота в использовании и настройке;
  • хорошее распознавание текста на Русском языке;
  • система выдаёт несколько вариантов ответов и через нейронные сети пытается найти самый похожий на правду вариант.

Минусы:

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

Azure

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

Плюсы:

  • относительно других сервисов, Azure очень быстро обрабатывает сообщения в режиме реального времени.

Минусы:

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

Итоги обзора:

Взвесив все плюсы и минусы мы остановились на Яндексе. SpeechKit дороже чем Azure, но дешевле чем Google Cloud Platform. В программе от Google было замечено постоянное улучшение качества и точности распознавания. Сервис самосовершенствуется за счет технологий машинного обучения. Однако, распознавание русскоязычных слов и фраз у Яндекса на уровень выше.

Как использовать распознавание голоса в бизнесе?

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

Не так давно, нашим клиентом стал один, известный всем SaaS сервис (по просьбе компании, имя сервиса не разглашается). С помощью F1Golos они записали два аудиоролика, один из которых был нацелен на продление жизни тёплых клиентов, другой – на обработку запросов клиентов.

Как продлить жизнь клиентов с помощью распознавания голоса?

Зачастую, SaaS сервисы работают по ежемесячной абонентской плате. Рано или поздно, период пробного пользования или оплаченного трафика - заканчивается. Тогда появляется необходимость продления услуги. Компанией было принято решение предупреждать пользователей об окончании трафика за 2 дня до истечения срока пользования. Оповещение пользователей происходило через голосовую рассылку. Ролик звучал так: «Добрый день, напоминаем, что у вас заканчивается период оплаченного пользования сервисом ХХХ. Для продления работы сервиса скажите - да, для отказа от предоставляемых услуг скажите нет».

Звонки пользователей, которые произнесли кодовые слова: ДА, ПРОДЛИТЬ, ХОЧУ, ПОДРОБНЕЕ; были автоматически переведены на операторов компании. Так, порядка 18% пользователей продлили регистрацию благодаря лишь одному звонку.

Как упростить систему обработки данных с помощью распознавание речи?

Второй аудиоролик, запущенный той же компанией, носил другой характер. Они использовали голосовую рассылку для того, чтобы снизить издержки на верификацию номеров телефона. Ранее они проверяли номера пользователей с помощью звонка-роботом. Робот просил пользователей нажать определенные клавиши на телефоне. Однако с появлением технологий распознавания, компания сменила тактику. Текст нового ролика звучал следующим образом: «Вы зарегистрировались на портале ХХХ, если вы подтверждаете свою регистрацию, скажите да. Если вы не направляли запрос на регистрацию, скажите нет». Если клиент произносил слова: ДА, ПОДТВЕРЖДАЮ, АГА или КОНЕЧНО, данные об этом моментально переводились в CRM-систему компании. И запрос на регистрацию подтверждался автоматически за пару минут. Внедрение технологий распознавания снизило время одного звонка с 30 до 17 секунд. Тем самым, компания снизила издержки почти в 2 раза.

Если вам интересны другие способы использования распознавания голоса, или вы хотите узнать подробнее о голосовых рассылках, переходите по ссылке. На F1Golos вы сможете оформить первую рассылку бесплатно и узнать на себе, как работают новые технологии распознавания.

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

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

При этом большинство таких программ способны не только трансформировать речь в текст на экране компьютера, но и использовать голосовые команды для управления вашим компьютером (запуск программ и их закрытие, приём и отправление электронной почты, открытие и закрытие сайтов и так далее).

Программа преобразования речи в текст

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

Программа «Laitis»

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

Для своей работы программа требует обязательного наличия на ПК скоростного интернета (в работе программы используются сетевые сервисы распознавания голоса от «Google» и «Yandex»). Возможности программы позволяют, также, управлять с помощью голосовых команд и вашим браузером, для чего необходима установка на веб-навигатор специального расширения от «Laitis» (Chrome, Mozilla, Opera).

«Dragon Professional» — расшифровка аудиозаписей в текст

На момент написания данного материала цифровой англоязычный продукт « Dragon Professional Individual » является одним из мировых лидеров по качеству распознаваемых текстов. Программа понимает семь языков (с русским пока работает лишь мобильное приложение «Dragon Anywhere» на и ), обладает высоким качеством распознавания голоса, умеет выполнять ряд голосовых команд. При этом данный продукт имеет исключительно платный характер (цена за основную программу составляет 300 долларов США, а за «домашнюю» версия продукта «Dragon Home » покупателю придётся выложить 75 американских долларов).

Для своей работы данный продукт от «Nuance Communications» требует создания своего профиля, который призван адаптировать возможности программы под специфику вашего голоса. Кроме непосредственной диктовки текста, вы можете обучить программу выполнять ряд команд, тем самым делая своё взаимодействие с компьютером ещё более конгруэнтным и удобным.

«RealSpeaker» — сверхточный распознаватель речи

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


«RealSpeaker» считывает не только аудио, но и визуальную составляющую процесса речи

Приложение поддерживает более десяти языков (в том числе и русский), позволяет распознавать речь с учётом акцентов и диалектов, позволяет транскрибировать аудио и видео, даёт доступ к облаку и многое другое. Программа условно бесплатна, за платную версию придётся заплатить вполне реальные деньги.

«Voco» — программа быстро переведёт голос в текстовый документ

Ещё один преобразователь голоса в текст – это платный цифровой продукт «Voco », цена «домашней» версии которого ныне составляет около 1700 рублей. Более продвинутые и дорогие варианты данной программы – «Voco.Professional» и «Voco.Enterprise» имеют ряд дополнительных возможностей, одной из которых является распознавание речи из имеющихся у пользователя аудиозаписей.

Среди особенностей «Voco» отмечу возможность дополнения словарного запаса программы (ныне словарный запас программы включает более 85 тысяч слов), а также её автономную работу от сети, позволяющую не зависеть от вашего подключения к Интернету.


Среди плюсов «Voco» — высокая обучаемость программы

Приложение включается довольно просто — достаточно дважды нажать на клавишу «Ctrl».Приложение абсолютно бесплатно, поддерживает несколько десятков языков, среди которых и русский.

Заключение

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

) на реальном Hello World примере управления домашней техникой.
Почему именно домашней техникой? Да потому что благодаря такому примеру можно оценить ту скорость и точность , которой можно добиться при использовании полностью локального распознавания речи без серверов типа Google ASR или Яндекс SpeechKit .
К статье я также прилагаю все исходники программы и саму сборку под Android .

С чего вдруг?

Наткнувшись недавно на , я задал вопрос автору, почему для своей программы он захотел использовать именно серверное распознавание речи (по моему мнению, это было излишним и приводило к некоторым проблемам). На что получил встречный вопрос о том, не мог бы я поподробней описать применение альтернативных способов для проектов, где нет необходимости распознавать что угодно, а словарь состоит из конечного набора слов. Да еще и с примером практического применения…

Зачем нам что-то еще кроме Яндекса и Google?

В качестве того самого «практического применения» я выбрал тему голосового управления умным домом .
Почему именно такой пример? Потому что на нем можно увидеть те несколько преимуществ полностью локального распознавания речи перед распознаванием с использованием облачных решений. А именно:
  • Скорость - мы не зависим от серверов и поэтому не зависим от их доступности, пропускной способности и т.п. факторов
  • Точность - наш движок работает только с тем словарем, который интересует наше приложение, повышая тем самым качество распознавания
  • Стоимость - нам не придется платить за каждый запрос к серверу
  • Голосовая активация - как дополнительный бонус к первым пунктам - мы можем постоянно «слушать эфир», не тратя при этом свой трафик и не нагружая сервера

Примечание

Сразу оговорюсь, что эти преимущества можно считать преимуществами только для определенного класса проектов , где мы точно заранее знаем , каким словарем и какой грамматикой будет оперировать пользователь. То есть, когда нам не надо распознать произвольный текст (например, СМС сообщение, либо поисковый запрос). В обратном случае без облачного распознавания не обойтись.

Так Android же умеет распознавать речь без интернета!
Да-да… Только на JellyBean. И только с полуметра, не более. И это распознавание - это та же диктовка, только с использованием гораздо меньшей модели. Так что управлять ею и настраивать ее мы тоже не можем. И что она вернет нам в следующий раз - неизвестно. Хотя для СМС-ок в самый раз!

Что будем делать?

Будем реализовывать голосовой пульт управления домашней техникой, который будет работать точно и быстро, с нескольких метров и даже на дешевом тормозном хламе очень недорогих Android смартфонах, планшетах и часах.
Логика будет простой, но очень практичной. Активируем микрофон и произносим одно или несколько названий устройств. Приложение их распознает и включает-выключает их в зависимости от текущего состояния. Либо получает от них состояние и произносит его приятным женским голосом. Например, текущая температура в комнате.

Вариантов практического применения масса

Утром, не открывая глаз, хлопнули ладонью по экрану смартфона на тумбочке и командуем «Доброе утро!» - запускается скрипт, включается и жужжит кофеварка, раздается приятная музыка, раздвигаются шторы.
Повесим по дешевому (тысячи по 2, не более) смартфону в каждой комнате на стенке. Заходим домой после работы и командуем в пустоту «Умный дом! Свет, телевизор!» - что происходит дальше, думаю, говорить не надо.

Транскрипции



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

Транскрипции описываются с помощью специального синтаксиса. Например:
умный uu m n ay j дом d oo m

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

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

Голосовая активация

Это возможность движка распознавания речи все время «слушать эфир» с целью реакции на заранее заданную фразу (или фразы). При этом все другие звуки и речь будут отбрасываться. Это не то же самое, что описать грамматику и просто включить микрофон. Приводить здесь теорию этой задачи и механику того, как это работает, я не буду. Скажу лишь только, что недавно программисты, работающие над Pocketsphinx, реализовали такую функцию, и теперь она доступна «из коробки» в API.

Одно стоит упомянуть обязательно. Для активационной фразы нужно не только указать транскрипцию, но и подобрать подходящее значение порога чувствительности . Слишком маленькое значение приведет к множеству ложных срабатываний (это когда вы не говорили активационную фразу, а система ее распознает). А слишком высокое - к невосприимчивости. Поэтому данная настройка имеет особую важность. Примерный диапазон значений - от 1e-1 до 1e-40 в зависимости от активационной фразы .

Активация по датчику приближения

Эта задача специфична именно для нашего проекта и напрямую к распознаванию не имеет отношения. Код можно увидеть прямо в главной активности .
Она реализует SensorEventListener и в момент приближения (значение сенсора меньше максимального) включает таймер, проверяя после некоторой задержки, перекрыт ли до сих пор датчик. Это сделано для исключения ложных срабатываний.
Когда датчик снова не перекрыт, мы останавливаем распознавание, получая результат (см описание далее).

Запускаем распознование

Pocketsphinx предоставляет удобный API для конфигурирования и запуска процесса распознавания. Это классы SppechRecognizer и SpeechRecognizerSetup .
Вот как выглядит конфигурация и запуск распознавания:

PhonMapper phonMapper = new PhonMapper(getAssets().open("dict/ru/hotwords")); Grammar grammar = new Grammar(names, phonMapper); grammar.addWords(hotword); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); File hmmDir = new File(dataFiles.getHmm()); File dict = new File(dataFiles.getDict()); File jsgf = new File(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

Здесь мы сперва копируем все необходимые файлы на диск (Pocketpshinx требует наличия на диске аккустической модели, грамматики и словаря с транскрипциями). Затем конфигурируется сам движок распознавания. Указываются пути к файлам модели и словаря, а также некоторые параметры (порог чувствительности для активационной фразы). Далее конфигурируется путь к файлу с грамматикой, а также активационная фраза.

Как видно из этого кода, один движок конфигурируется сразу и для грамматики, и для распознавания активационной фразы. Зачем так делается? Для того, чтобы мы могли быстро переключаться между тем, что в данный момент нужно распознавать. Вот как выглядит запуск процесса распознавания активационной фразы:

MRecognizer.startListening(KWS_SEARCH);
А вот так - распозанвание речи по заданной грамматике:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Второй аргумент (необязательный) - количество миллисекунд, после которого распознавание будет автоматически завершаться, если никто ничего не говорит.
Как видите, можно использовать только один движок для решения обеих задач.

Как получить результат распознавания

Чтобы получить результат распознавания, нужно также указать слушателя событий, имплементирующего интерфейс RecognitionListener .
У него есть несколько методов, которые вызываются pocketsphinx-ом при наступлении одного из событий:
  • onBeginningOfSpeech - движок услышал какой-то звук, может быть это речь (а может быть и нет)
  • onEndOfSpeech - звук закончился
  • onPartialResult - есть промежуточные результаты распознавания. Для активационной фразы это значит, что она сработала. Аргумент Hypothesis
  • onResult - конечный результат распознавания. Этот метод будет вызыван после вызова метода stop у SpeechRecognizer . Аргумент Hypothesis содержит данные о распознавании (строка и score)

Реализуя тем или иным способом методы onPartialResult и onResult, можно изменять логику распознавания и получать окончательный результат. Вот как это сделано в случае с нашим приложением:

@Override public void onEndOfSpeech() { Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) { mRecognizer.stop(); } } @Override public void onPartialResult(Hypothesis hypothesis) { if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) { startRecognition(); } else { Log.d(TAG, text); } } @Override public void onResult(Hypothesis hypothesis) { mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); String text = hypothesis != null ? hypothesis.getHypstr() : null; Log.d(TAG, "onResult " + text); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) { if (text != null) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); process(text); } mRecognizer.startListening(KWS_SEARCH); } }

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

Private synchronized void startRecognition() { if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME).startTone(ToneGenerator.TONE_CDMA_PIP, 200); post(400, new Runnable() { @Override public void run() { mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000); Log.d(TAG, "Listen commands"); post(4000, mStopRecognitionCallback); } }); }
Здесь мы сперва играем небольшой сигнал для оповещения пользователя, что мы его услышали и готовы к его команде. На это время микрофон долже быть выключен. Поэтому мы запускаем распознавание после небольшого таймаута (чуть больше, чем длительность сигнала, чтобы не услышать его эха). Также запускается поток, который остановит распознавание принудительно, если пользователь говорит слишком долго. В данном случае это 3 секунды.

Как превратить распознанную строку в команды

Ну тут все уже специфично для конкретного приложения. В случае с нагим примером, мы просто вытаскиваем из строчки названия устройств, ищем по ним нужное устройство и либо меняем его состояние с помощью HTTP запроса на контроллер умного дома, либо сообщаем его текущее состояние (как в случае с термостатом). Эту логику можно увидеть в классе Controller .

Как синтезировать речь

Синтез речи - это операция, обратная распознаванию. Здесь наоборот - нужно превратить строку текста в речь, чтобы ее услышал пользователь.
В случае с термостатом мы должны заставить наше Android устройство произнести текущую температуру. С помощью API TextToSpeech это сделать довольно просто (спасибо гуглу за прекрасный женский TTS для русского языка):

Private void speak(String text) { synchronized (mSpeechQueue) { mRecognizer.stop(); mSpeechQueue.add(text); HashMap params = new HashMap(2); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true"); mTextToSpeech.speak(text, TextToSpeech.QUEUE_ADD, params); } }

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

Private final TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() { @Override public void onUtteranceCompleted(String utteranceId) { synchronized (mSpeechQueue) { mSpeechQueue.poll(); if (mSpeechQueue.isEmpty()) { mRecognizer.startListening(KWS_SEARCH); } } } };

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

И это все?

Да! Как видите, быстро и качественно распознать речь прямо на устройстве совсем несложно, благодаря наличию таких замечательных проектов, как Pocketsphinx. Он предоставляет очень удобный API, который можно использовать в решении задач, связанных с распознаванием голосовых команд.

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

Обслуживание