Программа распознавания слов при записи. Программы для распознавания речи

В «Фейсбуке» нам задали вопрос:
«Для работы с текстом мне нужно расшифровать 3 часа диктофонной записи. Пробовал загрузить аудиофайл с картинкой в YouTube и воспользоваться их расшифровщиком текста, но получается какая-то абракадабра. Подскажите, как можно решить это технически? Спасибо!
Александр Коновалов»

Александр, простое техническое решение есть – но результат будет зависеть исключительно от качества вашей записи. Поясню, о каком качестве речь.

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

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

Несложно придерживаться этих условий, если вы, вместо того, чтобы обращаться к интернет-сервису распознавания речи напрямую, применяете в качестве промежуточного устройства-посредника диктофон. К слову, такой «персональный секретарь» особенно незаменим, когда у вас нет доступа к онлайну. Естественно, лучше использовать хотя бы недорогой профессиональный диктофон, нежели записывающее устройство, встроенное в дешевый mp3-плеер или смартфон. Это даст гораздо больше шансов «скормить» полученные записи сервису распознавания речи.

Сложно, но можно уговорить соблюдать эти правила собеседника, у которого вы берете интервью (еще один совет: если у вас нет в комплекте выносного микрофона на прищепке – хотя бы держите диктофон рядом с собеседником, а не с собой).

А вот «законспектировать» на нужном уровне в автоматическом режиме конференцию или семинар – дело, на мой взгляд, практически нереальное (ведь вы не сможете контролировать речь спикеров и реакцию слушателей). Хотя достаточно интересный вариант: превращение в текст профессионально записанных аудиолекций и аудиокниг (если на них не накладывалась фоновая музыка и шумы).

Будем надеяться, что качество вашей диктофонной записи – достаточно высокое, чтобы ее удалось расшифровать в автоматическом режиме .

Если же нет – практически при любом качестве записи вы сможете провести расшифровку в полуавтоматическом режиме .

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

Итак, по порядку.

1. Автоматическое распознавание речи

Многие советуют расшифровывать диктофонные записи на YouTube. Но этот метод заставляет пользователя тратить время на этапе загрузки аудиофайла и фоновой картинки, а затем – в ходе очистки итогового текста от меток времени. Между тем, это время несложно сэкономить. 🙂

Вы можете распознавать аудиозаписи прямо со своего компьютера, воспользовавшись возможностями одного из интернет-сервисов, работающих на движке распознавания Google (рекомендую Speechpad.ru или Speechlogger.com). Все, что нужно – проделать маленький трюк: вместо вашего голоса, воспроизводимого с микрофона, перенаправить на сервис аудиопоток, воспроизводимый вашим компьютерным проигрывателем.

Этот трюк называется программным стерео микшером (его обычно применяют для записи музыки на компьютере или ее трансляции с компьютера в интернет).

Стерео микшер входил в состав Windows XP – но был удален разработчиками из более поздних версий этой операционной системы (говорят, в целях защиты авторских прав: чтобы геймеры не воровали музыку из игр и т.п.). Однако стерео микшер нередко поставляется вместе с драйверами аудиокарт (например, карт Realtec, встраиваемых в материнскую плату). Если вы не найдете стерео микшер на своем ПК с помощью предлагаемых ниже скриншотов – попробуйте переустановить аудиодрайверы с CD-диска, который шел в комплекте с материнской платой – либо с сайта ее производителя.

Если и это не поможет – установите на компьютер альтернативную программу. Например – бесплатный VB-CABLE Virtual Audio Device : использовать его рекомендует владелец вышеупомянутого сервиса Speechpad.ru.

Первым шагом вы должны отключить для использования в режиме записи микрофон и включить вместо него стерео микшер (либо виртуальный VB-CABLE).

Для этого нажмите по иконке громкоговорителя в правом нижнем углу (возле часов) – либо выберите раздел «Звук» в «Панели управления». Во вкладке «Запись» открывшегося окна щелкните правой кнопкой мыши и поставьте птички напротив пунктов «Показать отключенные устройства» и «Показать отсоединенные устройства». Нажмите правой кнопкой по иконке микрофона и выберите пункт «Отключить» (вообще, отключите все устройства, отмеченные зеленым значком).

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

Если вы решили использовать VB-CABLE – то тем же способом включите его во вкладке «Запись».

А также – во вкладке «Воспроизведение».

Второй шаг. Включите аудиозапись в любом проигрывателе (если нужно расшифровать аудиодорожку видеоролика – можно запустить и видеопроигрыватель). Параллельно загрузите в браузере Chrome сервис Speechpad.ru и нажмите в нем кнопку «Включить запись». Если запись достаточно высокого качества, вы увидите, как сервис на глазах превращает речь в осмысленный и близкий к оригиналу текст. Правда, без знаков препинания, которые вам придется расставить самостоятельно.

В качестве аудиопроигрывателя советую использовать AIMP, о котором будет подробнее рассказано в третьей подглавке. Сейчас лишь отмечу, что этот плеер позволяет замедлить запись без искажений речи, а также исправить некоторые другие погрешности. Это может несколько улучшить распознавание не слишком качественной записи. (Иногда даже советуют предварительно подвергать плохие записи обработке в профессиональных программах редактирования звука. Однако, на мой взгляд, это слишком трудоемкая задача для большинства пользователей, которые гораздо быстрее наберут текст вручную. 🙂)

2. Полуавтоматическое распознавание речи

Тут все просто. Если запись некачественная и распознавание «захлебывается» либо сервис выдает слишком много ошибок – помогите делу сами, «встроившись» в цепочку: «аудиоплеер – диктор – система распознавания».

Ваша задача: прослушивать в наушниках записанную речь – и параллельно надиктовывать ее через микрофон интернет-сервису распознавания. (Естественно, вам не нужно, как в предыдущем разделе, переключаться в списке записывающих устройств с микрофона на стерео микшер или виртуальный кабель). А в качестве альтернативы упоминавшимся выше интернет-сервисам можете использовать смартфонные приложения вроде бесплатной «Яндекс.Диктовки» либо функцию диктовки в iPhone с операционной системой iOS 8 и выше.

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

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

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

3. Расшифровка диктофонной записи в ручном режиме

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

Во всех этих случаях вам поможет мой фирменный способ расшифровки вручную (прослушиваете запись в AIMP – набираете текст в Word). С его помощью вы превратите запись в текст быстрее, чем это сделают многие профессиональные журналисты, чья скорость набора на клавиатуре аналогична вашей! При этом вы потратите гораздо меньше, чем они, сил и нервов. 🙂

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

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

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

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

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

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

«Войдя в настройки AIMP, найдите раздел Глобальные клавиши и перенастройте Стоп/Пуск на клавишу Эскейп (Esc). Поверьте, это наиболее удобно, поскольку не придется задумываться и палец не попадет случайно на другие клавиши. Пункты «Немного перейти назад» и «Немного перейти вперед» настройте, соответственно, на клавиши Ctrl + клавиши курсора назад/вперед (у вас на клавиатуре есть четыре клавиши со стрелками – выберите две из них). Эта функция нужна, чтобы заново прослушать последний фрагмент или перейти немного вперед.

Затем, вызвав эквалайзер, вы можете уменьшить значения «Скорость» и «Темп» – и увеличить значение «Питч». При этом Вы заметите, что скорость воспроизведения замедлится, но высота голоса (если хорошо подберете значение «Питч») – не изменится. Подберите эти два параметра так, чтобы вы практически синхронно успевали набирать текст, лишь изредка останавливая его.

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

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

А количество секунд, на которое вам будет наиболее удобно перемещаться по записи назад или вперед с помощью горячих клавиш – установите в разделе «Плеер» окна «Настройки» (которое можно вызвать нажатием горячих клавиш «Ctrl + P»).

Желаю сэкономить побольше времени на рутинных задачах – и плодотворно использовать его для главных дел! 🙂 И не забудьте включить микрофон в списке записывающих устройств, когда соберетесь поговорить по скайпу! 😉

3 способа расшифровки диктофонной записи: распознавание речи, диктовка, ручной режим

Титровщик телефона для глухих и слабослышащих

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

Автоматическая транскрипция

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

Автоматический устный и письменный переводчик

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

Изучайте иностранные языки и улучшайте навыки произношения

Speechlogger является отличным инструментом для изучения языков и может быть использован u200b u200Bin несколько способов. Вы можете использовать его, чтобы узнать словарный запас, говоря на вашем родном языке и давая программного обеспечения перевести его. Вы можете учиться и практиковать правильное произношение, разговаривая на иностранном языке и, видя, понимает ли Speechlogger или нет. Если расшифрованы текст в черным шрифтом это означает, что вы произнес это хорошо.

Генерирование субтитров для фильмов

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

Диктуйте вместо ввода

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

Забавная игра:)

Вы можете имитировать китайскую динамик? Французский? Что о русском языке? Попробуйте имитировать иностранный язык и увидеть то, что вы только что сказали, с Speechlogger. Используйте синхронный перевод Speechlogger, чтобы понять, что вы только что сказали. Получить удивительные результаты - это очень весело!

Человека всегда привлекала идея управлять машиной естественным языком. Возможно, это отчасти связано с желанием человека быть НАД машиной. Так сказать, чувствовать свое превосходство. Но основной посыл - это упрощение взаимодействия человека с искусственным интеллектом. Управление голосом в 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. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

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

) на реальном 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, который можно использовать в решении задач, связанных с распознаванием голосовых команд.

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

Пожалуй, самая удобная программа для расшифровки текста для Windows и Mac OS, которая совмещает в себе аудиоплеер и текстовый редактор. Принцип работы очень прост – загружаете в программу аудиофайл, прослушиваете его при помощи горячих клавиш на клавиатуре (их можно назначать самому) и параллельно набираете текст. Скорость воспроизведения и громкость аудио также регулируются при помощи клавиатуры. Таким образом, ваши руки постоянно находятся на клавиатуре и отпадает необходимость использовать мышку или переключаться между разными программами. Нужно учитывать, что встроенный редактор текста не распознает ошибки и не имеет многих других привычных функций, например, переключение дефиса в тире. Однако можно пользоваться другими редакторами текста параллельно с Express Scribe, используя горячие клавиши для управления воспроизведением аудио. Программа условно бесплатная, полная стоимость: 17-50 долларов.


02. Transcriber-pro



Русскоязычная программа для Windows, которая позволяет прослушивать не только аудио, но и просматривать видеофайлы. Встроенный текстовый редактор имеет возможность проставлять временные метки и имена собеседников. Полученный текст можно импортировать в «интерактивные стенограммы», а также корректировать в рамках группового проекта. Приложение доступно только при годовой подписке, стоимость – 689 рублей в год.


03. RSplayer V1.4



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

04. Voco

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


05. Dragon Dictation



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


06. RealSpeaker



Уникальное приложение, которое способно не только распознавать аудиофайлы, но и живую речь, наговариваемую на камеру. За счет специального видеорасширения «RealSpeaker» считывает движение губ, тем самым улучшая процесс распознавания речи до 20-30% по сравнению с другими подобными алгоритмами. На данный момент приложение поддерживает 11 языков: русский, английский (американский и британский диалекты), французский, немецкий, китайский, корейский и японский, турецкий, испанский, итальянский и украинский. Программа распространяется условно бесплатно, стоимость зависит от времени подписки, бессрочная версия стоит около 2 тыс. руб.