- Сверхбыстрое распознавание речи без серверов на реальном примере
- С чего вдруг?
- Зачем нам что-то еще кроме Яндекса и Google?
- Что будем делать?
- Что такое Pocketsphinx
- Транскрипции
- Голосовая активация
- Запускаем распознование
- Как получить результат распознавания
- Как превратить распознанную строку в команды
- Как синтезировать речь
- И это все?
- Голосовой ввод текста: топ-5 бесплатных инструментов
- 5 бесплатных онлайн-сервисов для голосового ввода
- 1. SpeechPad
- 2. VoiceNote
- 3. Voice Notepad
- 4. Speechtexter.com
- 5. TalkTyper
- Дополнительные инструменты для голосового ввода текста
- Яндекс.Клавиатура и GBoard (Google Клавиатура)
- Google Docs
- Рекомендации, которые помогут улучшить качество распознавания текста
Сверхбыстрое распознавание речи без серверов на реальном примере
В этой статье я подробно расскажу и покажу, как правильно и быстро прикрутить распознавание русской речи на движке Pocketsphinx (для iOS порт OpenEars) на реальном Hello World примере управления домашней техникой.
Почему именно домашней техникой? Да потому что благодаря такому примеру можно оценить ту скорость и точность, которой можно добиться при использовании полностью локального распознавания речи без серверов типа Google ASR или Яндекс SpeechKit.
К статье я также прилагаю все исходники программы и саму сборку под Android.
С чего вдруг?
Наткнувшись недавно на статью о прикручивании Яндекс SpeechKit-а к iOS приложению, я задал вопрос автору, почему для своей программы он захотел использовать именно серверное распознавание речи (по моему мнению, это было излишним и приводило к некоторым проблемам). На что получил встречный вопрос о том, не мог бы я поподробней описать применение альтернативных способов для проектов, где нет необходимости распознавать что угодно, а словарь состоит из конечного набора слов. Да еще и с примером практического применения…
Зачем нам что-то еще кроме Яндекса и Google?
Так Android же умеет распознавать речь без интернета!
Да-да… Только на JellyBean. И только с полуметра, не более. И это распознавание — это та же диктовка, только с использованием гораздо меньшей модели. Так что управлять ею и настраивать ее мы тоже не можем. И что она вернет нам в следующий раз — неизвестно. Хотя для СМС-ок в самый раз!
Что будем делать?
Будем реализовывать голосовой пульт управления домашней техникой, который будет работать точно и быстро, с нескольких метров и даже на дешевом тормозном хламе очень недорогих Android смартфонах, планшетах и часах.
Логика будет простой, но очень практичной. Активируем микрофон и произносим одно или несколько названий устройств. Приложение их распознает и включает-выключает их в зависимости от текущего состояния. Либо получает от них состояние и произносит его приятным женским голосом. Например, текущая температура в комнате.
Микрофон будем активировать или голосом, или нажатием на иконку микрофона, или даже просто положив руку на экран. Экран в свою очередь может быть и полностью выключенным.
На видео показано, что получилось в итоге. Далее же речь пойдет о технической реализации с выдержками из реально работающего кода и немного теории.
Что такое Pocketsphinx
Pocketsphinx — это движок распознавания с открытым исходным кодом под Android. У него также имеется порт под iOS, WindowsPhone, и даже JavaScript.
Он позволит нам запустить распознавание речи прямо на устройстве и при этом настроить его именно под наши задачи. Также он предлагает функцию голосовой активации «из коробки» (см далее).
Мы сможем «скормить» движку распознавания русскую языковую модель (вы можете найти ее в исходниках) и грамматику пользовательских запросов. Это именно то, что будет распознавать наше приложение. Ничего другого оно распознать не сможет. А следовательно, практически никогда не выдаст что-то, чего мы не ожидаем.
Формат грамматики JSGF используется Pocketsphinx, как и многими другими подобными проектами. В нем можно с достаточной гибкостью описать те варианты фраз, которые будет произносить пользователь. В нашем случае грамматика будет строиться из названий устройств, которые есть в нашей сети, примерно так:
Pocketsphinx также может работать по статистической модели языка, что позволяет распознавать спонтанную речь, не описываемую контекстно-свободной грамматикой. Но для нашей задачи это как раз не нужно. Наша грамматика будет состоять только из названий устройств. После процесса распознавания Pocketsphinx вернет нам обычную строчку текста, где устройства будут идти один за другим.
Знак плюса обозначает, что пользователь может назвать не одно, а несколько устройств подряд.
Приложение получает список устройств от контроллера умного дома (см далее) и формирует такую грамматику в классе Grammar.
Транскрипции
Грамматика описывает то, что может говорить пользователь. Для того, чтобы Pocketsphinx знал, как он это будет произносить, необходимо для каждого слова из грамматики написать, как оно звучит в соответствующей языковой модели. То есть транскрипцию каждого слова. Это называется словарь.
Транскрипции описываются с помощью специального синтаксиса. Например:
В принципе, ничего сложного. Двойная гласная в транскрипции обозначает ударение. Двойная согласная — мягкую согласную, за которой идет гласная. Все возможные комбинации для всех звуков русского языка можно найти в самой языковой модели.
Понятно, что заранее описать все транскрипции в нашем приложении мы не можем, потому что мы не знаем заранее тех названий, которые пользователь даст своим устройствам. Поэтому мы будем гененрировать «на лету» такие транскрипции по некоторым правилам русской фонетики. Для этого можно реализовать вот такой класс PhonMapper, который сможет получать на вход строчку и генерировать для нее правильную транскрипцию.
Голосовая активация
Это возможность движка распознавания речи все время «слушать эфир» с целью реакции на заранее заданную фразу (или фразы). При этом все другие звуки и речь будут отбрасываться. Это не то же самое, что описать грамматику и просто включить микрофон. Приводить здесь теорию этой задачи и механику того, как это работает, я не буду. Скажу лишь только, что недавно программисты, работающие над Pocketsphinx, реализовали такую функцию, и теперь она доступна «из коробки» в API.
Одно стоит упомянуть обязательно. Для активационной фразы нужно не только указать транскрипцию, но и подобрать подходящее значение порога чувствительности. Слишком маленькое значение приведет к множеству ложных срабатываний (это когда вы не говорили активационную фразу, а система ее распознает). А слишком высокое — к невосприимчивости. Поэтому данная настройка имеет особую важность. Примерный диапазон значений — от 1e-1 до 1e-40 в зависимости от активационной фразы.
Запускаем распознование
Pocketsphinx предоставляет удобный API для конфигурирования и запуска процесса распознавания. Это классы SppechRecognizer и SpeechRecognizerSetup.
Вот как выглядит конфигурация и запуск распознавания:
Здесь мы сперва копируем все необходимые файлы на диск (Pocketpshinx требует наличия на диске аккустической модели, грамматики и словаря с транскрипциями). Затем конфигурируется сам движок распознавания. Указываются пути к файлам модели и словаря, а также некоторые параметры (порог чувствительности для активационной фразы). Далее конфигурируется путь к файлу с грамматикой, а также активационная фраза.
Как видно из этого кода, один движок конфигурируется сразу и для грамматики, и для распознавания активационной фразы. Зачем так делается? Для того, чтобы мы могли быстро переключаться между тем, что в данный момент нужно распознавать. Вот как выглядит запуск процесса распознавания активационной фразы:
А вот так — распозанвание речи по заданной грамматике:
Второй аргумент (необязательный) — количество миллисекунд, после которого распознавание будет автоматически завершаться, если никто ничего не говорит.
Как видите, можно использовать только один движок для решения обеих задач.
Как получить результат распознавания
Чтобы получить результат распознавания, нужно также указать слушателя событий, имплементирующего интерфейс RecognitionListener.
У него есть несколько методов, которые вызываются pocketsphinx-ом при наступлении одного из событий:
- onBeginningOfSpeech — движок услышал какой-то звук, может быть это речь (а может быть и нет)
- onEndOfSpeech — звук закончился
- onPartialResult — есть промежуточные результаты распознавания. Для активационной фразы это значит, что она сработала. Аргумент Hypothesis содержит данные о распознавании (строка и score)
- onResult — конечный результат распознавания. Этот метод будет вызыван после вызова метода stop у SpeechRecognizer. Аргумент Hypothesis содержит данные о распознавании (строка и score)
Реализуя тем или иным способом методы onPartialResult и onResult, можно изменять логику распознавания и получать окончательный результат. Вот как это сделано в случае с нашим приложением:
Когда мы получаем событие onEndOfSpeech, и если при этом мы распознаем команду для выполнения, то необходимо остановить распознавание, после чего сразу будет вызван onResult.
В onResult нужно проверить, что только что было распознано. Если это команда, то нужно запустить ее на выполнение и переключить движок на распознавание активационной фразы.
В onPartialResult нас интересует только распознавание активационной фразы. Если мы его обнаруживаем, то сразу запускаем процесс распознавания команды. Вот как он выглядит:
Здесь мы сперва играем небольшой сигнал для оповещения пользователя, что мы его услышали и готовы к его команде. На это время микрофон долже быть выключен. Поэтому мы запускаем распознавание после небольшого таймаута (чуть больше, чем длительность сигнала, чтобы не услышать его эха). Также запускается поток, который остановит распознавание принудительно, если пользователь говорит слишком долго. В данном случае это 3 секунды.
Как превратить распознанную строку в команды
Ну тут все уже специфично для конкретного приложения. В случае с нагим примером, мы просто вытаскиваем из строчки названия устройств, ищем по ним нужное устройство и либо меняем его состояние с помощью HTTP запроса на контроллер умного дома, либо сообщаем его текущее состояние (как в случае с термостатом). Эту логику можно увидеть в классе Controller.
Как синтезировать речь
Синтез речи — это операция, обратная распознаванию. Здесь наоборот — нужно превратить строку текста в речь, чтобы ее услышал пользователь.
В случае с термостатом мы должны заставить наше Android устройство произнести текущую температуру. С помощью API TextToSpeech это сделать довольно просто (спасибо гуглу за прекрасный женский TTS для русского языка):
Скажу наверное банальность, но перед процессом синтеза нужно обязательно отключить распознавание. На некоторых устройствах (например, все самсунги) вообще невозсожно одновременно и слушать микрофон, и что-то синтезировать.
Окончание синтеза речи (то есть окончание процесса говорения текста синтезатором) можно отследить в слушателе:
В нем мы просто проверяем, нет ли еще чего-то в очереди на синтез, и включаем распозанвание активационной фразы, если ничего больше нет.
И это все?
Да! Как видите, быстро и качественно распознать речь прямо на устройстве совсем несложно, благодаря наличию таких замечательных проектов, как Pocketsphinx. Он предоставляет очень удобный API, который можно использовать в решении задач, связанных с распознаванием голосовых команд.
В данном примере мы прикрутили распознавание к вполне кокрентной задаче — голосовому управлению устройствами умного дома. За счет локального распознавания мы добились очень высокой скорости работы и минимизировали ошибки.
Понятно, что тот же код можно использовать и для других задач, связанных с голосом. Это не обязательно должен быть именно умный дом.
Все исходники, а также саму сборку приложения вы можете найти в репозитории на GitHub.
Также на моем канале в YouTube вы можете увидеть некоторые другие реализации голосового управления, и не только системами умных домов.
Источник
Голосовой ввод текста: топ-5 бесплатных инструментов
Если вы работаете в digital-маркетинге, вам постоянно нужно взаимодействовать с текстом: записывать идеи, задачи, описывать концепции, писать статьи и многое другое. Иногда проще и быстрее надиктовать текст, чтобы не забыть важную мысль или задачу. Диктофон для этого подходит плохо: запись потом нужно будет расшифровывать и переводить в текст. А если оставлять голосовые заметки часто, то потом просто нереально быстро найти нужную информацию или бегло ее просмотреть.
Голосовой ввод текста помогает решить эту проблему. Вы диктуете — программа сразу переводит речь в текст, который вы можете сохранить как обычную заметку и дальше работать с ней спокойно работать.
В статье мы собрали подборку бесплатных сервисов голосового ввода, которые помогут вам:
- быстро и удобно делать заметки, когда нет возможности или времени записывать вручную;
- записывать голосом список задач;
- надиктовывать черновики статей и других текстов.
Берите на вооружение сервисы из подборки и тестируйте — все они бесплатные и неплохо распознают русский язык.
5 бесплатных онлайн-сервисов для голосового ввода
1. SpeechPad
Speechpad — бесплатный сервис для голосового ввода текста. Доступен в трех форматах:
- онлайн-сервис;
- браузерное расширение — с его помощью можно вводить текст в любое поле для ввода;
- мобильное приложение для Android и iOS.
У сервиса также есть платные функции. Их два вида:
- дополнительные (расширенные). Включают в себя голосовой ввод в режиме интеграции с OS Linux и Windows, а также транскрибирование аудиофайлов длиной более 15 минут;
- премиум. Пакетное транскрибирование аудио и видео (больше двух файлов).
Онлайн-сервис
Интерфейс сервиса выглядит так:
Здесь есть несколько настроек, кнопки управления и поле, в котором отображается распознаваемый текст.
Что можно сделать сделать:
- настроить язык голосового ввода. Базово с списке доступно 14 языков (среди них русский, украинский, английский, немецкий). Если нужен другой язык, необходимо зарегистрироваться в сервисе. После этого в личном кабинете появится возможность добавить этот язык (если для него поддерживается распознавание речи);
- активировать опцию «Включить команды». Если вы авторизованы в личном кабинете, вы можете добавлять голосовые команды и использовать их при надиктовке текста. Например, удалить последний распознанный фрагмент текста;
- отключить управление заглавными буквами Google. По умолчанию в речи распознается начало предложений и автоматически проставляются заглавные буквы. Вы можете отключить эту опцию и самостоятельно редактировать предложения.
Обратите внимание! Онлайн-сервис Speechpad корректно работает только в браузере Google Chrome. Можно запускать его и в Яндекс.Браузере, но все же для корректной работы рекомендуется использовать именно Chrome.
Для начала распознавания текста нажмите кнопку «Включить запись» и предоставьте доступ к микрофону.
Затем надиктовывайте текст. Сначала распознанные слова появятся в поле справа от кнопки «Включить запись». После небольшой паузы они попадут в поле ниже (результирующее поле).
Над результирующем полем есть кнопки со знаками пунктуации. По ходу диктовки вы можете добавлять их вручную.
После того как вы закончили диктовку, просмотрите текст, исправьте ошибки (если есть). Затем скопируйте текст или скачайте в виде txt-файла.
Транскрибация
Также с помощью Speechpad можно переводить аудиозаписи разговоров в текст с помощью опции «Транскрибация».
Здесь можно будет загрузить аудио- или видеофайл, а также добавить ссылку на видео с Youtube.
После нажатия на кнопку «Включить запись» файл начнет проигрываться и система переведет речь в текст.
Расширение SpeechPad
Установите расширение из магазина расширений Google Chrome. После установки в контекстном меню в браузере (при клике правой кнопкой мыши на любой области экрана) появится пункт «SpeechPad».
Кликните правой кнопкой мыши по любому полю для ввода текста и выберите расширение из контекстного меню. Поле подсветится, и вы сможете голосом произнести фразу, которую нужно ввести в поле. Расширение распознает ее и отобразит в виде текста.
Мобильное приложение
Доступно две версии: для Android и iOS.
Приложение может работать в автономном режиме (без подключения к интернету). Так выглядит интерфейс приложения на Android:
В настройках можно управлять голосовыми командами (для расстановки знаков препинания и спецсимволов с помощью голоса):
2. VoiceNote
VoiceNote — еще один сервис для преобразования голоса в текст, который работает только в Google Chrome (также может работать в Яндекс.Браузере). При попытке запустить его в другом браузере появляется сообщение об ошибке.
Для голосового ввода через VoiceNote можно использовать Live Demo или отдельное приложение для Chrome.
Как пользоваться сервисом
Откройте редактор и выберите язык, на котором нужно распознавать речь. Для этого кликните по иконке земного шара и укажите нужный язык.
Затем кликните по значку микрофона и предоставьте сервису доступ к микрофону вашего компьютера или ноутбука.
После этого система начнет запись и вы сможете надиктовывать текст. Распознанный текст появится в редакторе. Возможности:
- можно проговаривать знаки препинания словами;
- голосовой командой можно перевести текст на новую строчку;
- с помощью панели инструментов можно вручную добавлять знаки препинания и спецсимволы прямо во время диктовки;
- готовый текст можно отредактировать и сохранить в txt-файле.
3. Voice Notepad
Еще один сервис для голосового ввода текста. Как и остальные сервисы, работает только в браузере Google Chrome.
У сервиса простой интерфейс. Здесь есть:
- возможность выбрать язык распознавания (сервис работает на основе движка Google Speech Recognition и может распознавать речь на более чем 100 языках);
- текстовое поле — здесь будет появляться распознанный текст, который можно отформатировать: выделить полужирным, курсивом или подчеркиванием, оформить списки, добавить или убрать отступы, задать выравнивание;
- кнопки управления — кнопка Start активирует распознавание речи. С помощью остальных кнопок можно копировать текст, сохранять в txt-файл, публиковать и совершать другие действия.
Сервис поддерживает голосовые команды. Например, с помощью команды можно перевести текст на новую строку, поставить тире или другие знаки препинания, спецсимволы и т. д.
Полный список поддерживаемых команд для русского языка — здесь.
4. Speechtexter.com
Бесплатный онлайн-сервис для распознавания речи. Достаточно неплохо распознает русский язык. Всего поддерживает более 60 языков.
У SpeechTexter есть веб-версия (работает только в Google Chrome) и мобильное приложение для Android.
Для начала работы с сервисом необходимо выбрать язык распознавания и нажать кнопку Start (предоставив доступ к микрофону).
В текстовом поле есть несколько полезных функций:
- счетчик слов, распознанных системой;
- инструменты редактирования текста: выделение полужирным, курсивом, подчеркиванием, выравнивание текста, изменение размера шрифта. Также можно менять цвет текста, создавать нумерованные и ненумерованные списки;
- можно включить ночной режим — полезно, если вы используете сервис вечером или ночью.
В правой части интерфейса размещен блок со стандартными голосовыми командами для добавления знаков препинания и нового абзаца:
На вкладке Custom можно создать свои команды, например для добавления кавычек.
После завершения диктовки текст можно отредактировать и сохранить в файле:
- в txt-файле;
- документом Microsoft Word.
5. TalkTyper
Простой онлайн-сервис для голосового ввода с поддержкой 37 языков.
В этом сервисе минимум функций, однако с распознаванием русского языка он справляется вполне неплохо. Для начала распознавания речи необходимо нажать на значок микрофона, разрешить его использование в браузере и начать диктовку текста.
Если сервис распознал фразу неправильно, нажмите на значок «Варианты»:
Если среди предложенных вариантов нет правильного, текст можно поправить вручную.
После завершения распознавания вы можете сохранить текст в txt-файле, скопировать, распечатать или отправить на почту.
Дополнительные инструменты для голосового ввода текста
Яндекс.Клавиатура и GBoard (Google Клавиатура)
Если вы большую часть времени работаете со смартфона и хотите использовать возможность голосового ввода текста, воспользуйтесь функционалом голосового ввода, который есть в клавиатурах от Google и Яндекс:
- GBoard — клавиатура от Google. Для Android и iOS;
- Яндекс.Клавиатура. Для Android и iOS.
Так вы сможете надиктовывать текст в любом приложении, которое вы обычно используете для организации личных и рабочих заметок, задач и подобного (Google Keep, Notion, Trello и т. д.).
Воспользоваться голосовым вводом просто:
- Откройте нужное приложение (например, Google Keep) и создайте заметку;
- Откройте клавиатуру и нажмите на значок микрофона (ниже пример, как это сделать в GBoard);
- Начните диктовать заметку. Система распознает речь и преобразует ее в текст.
Голосовой ввод на GBoard (клавиатуре от Google)
Google Docs
Тем, кто много работает с Google Документами, пригодится встроенная функция голосового ввода (поддерживает русский язык).
Если вы еще не знали о ней, вот как ее включить: «Инструменты» → «Голосовой ввод».
Слева появится всплывающее окошко с выпадающим списком для выбора языка речи и кнопкой с иконкой микрофона.
Выберите нужный язык, нажмите на кнопку и начните диктовать текст.
Рекомендации, которые помогут улучшить качество распознавания текста
Все сервисы, которые мы привели в подборке, достаточно хорошо распознают русский язык, однако иногда качество распознанного текста может быть посредственным. Чтобы такого не происходило, следуйте нескольким базовым рекомендациям.
- Используйте хороший микрофон. Идеально, если у вас есть качественная гарнитура или внешний микрофон с шумоподавлением. Если же используете встроенный микрофон компьютера/ноутбука, убедитесь, что микрофон исправно работает, ничем не прикрыт, а вы находитесь достаточно близко, чтобы звук хорошо улавливался устройством.
- Произносите слова четко и неторопливо. Хорошая дикция определенно будет плюсом. Чем четче вы произносите слова, тем выше вероятность, что сервис сможет корректно распознать речь (даже если качество микрофона оставляет желать лучшего). Также не стоит произносит фразы слишком быстро, в этом случае часть слов может быть не распознана и текст придется редактировать.
- Позаботьтесь, чтобы вокруг вас не было посторонних звуков и шумов. Для качественного распознавания речи вокруг не должно быть музыки и других громких звуков.
Соблюдайте эти рекомендации и необходимость правок будет минимальной.
Источник