Чем «транскрибирование» отличается от «распознавания голоса» +23



Голосовых помощников сейчас делают все. Их встраивают в телефоны, наушники, отдельно стоящие колонки, они пытаются с нами общаться при звонках в тех поддержку и заменить «нажмите 1 чтобы связаться с оператором» в голосовых меню. Наше «лего для телефонии» Voximplant предлагает разные варианты распознавания голоса уже много лет, и под катом я на примере нескольких строк JavaScript покажу основные варианты, чем они отличаются друг от друга и почему «потоковое распознавание от гугла» — это не всегда самый лучший вариант.

Потоковое распознавание


Идея в том, что голос в реальном времени передается в сервис вроде Google Speech API, а тот его «пытается распознать» и по мере сил возвращает обратно распознанные слова, фразы и предложения. Главная сложность для сервиса — понять, что поток звуков является законченным словом или фразой, а не началом длинного слова. С помощью Voximplant потоковое распознавание можно попробовать в пару строк кода:


Если сказать быстро «проверка связи один два три», то мы получим один эвент:


Если же «отчеканить» фразу по словам, то результат будет совсем другим:


Как видим, и confidence уже не тот, часть цифр стала словами а часть текстом, и «креазим» неожиданно появился. На практике каждый сценарий «общения» человека и машины тщательно тестируется и отлаживается: на вход модулю ASR скармливается словарь «ожидаемых» слов чтобы повысить их шансы быть распознанными, в JS код добавляется поиск синонимов, fuzzy matching, ожидание пауз и прочие домашние заготовки, чтобы выдержать баланс между «быстро распознался креазим» и «две минуты ничего не распознавалось, потому что фоновый шум и звонящий громко дышал в трубку».

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

Но кроме голосового меню есть и другие полезные штуки. Например, распознать все разговоры операторов за месяц, проанализировать и сделать интересные выводы. Big Data творит чудеса, и даже с 80% качеством распознавания можно легко найти лучшего оператора контакт центра или научиться подсказывать операторам «типовые» ответы на те или иные вопросы. Для такого использования нам важно качество распознавания и не важна его скорость. Именно такое распознавание традиционно называется англицизмом «транскрибирование» (transcribing) — неторопливое и максимально качественное распознавание после завершения разговора.

Транскрибирование с JSON разметкой


Делается в те же несколько строк JS кода, но с нюансами. Так как транскрибирование происходит после завершения разговора, то сразу отдавать URL к получившемуся JSON файлу череповато последствиями: сделав запрос сразу после завершения разговора можно получить пустой файл. Поэтому API работает по-другому: у каждой JS сессии есть идентификатор, и по нему можно получить список всех «артефактов» этой сессии: лог, записанные аудиопотоки и распознанные аудиопотоки. Идентификатор можно передавать на свой backend во время звонка, а можно использовать то же HTTP API для поиска нужных звонков по времени, custom data или другим параметрам. Включение транскрибирования выглядит вот так:


Обратите внимание на format — если установить его в «json», то на выходе мы получим размеченный текст, где для каждого слова (или, если совсем не повезло — фразы) указано, в каком интервале записи это произнесли. Удобно для изготовления интерфейсов поиска по логам с последующим проигрыванием нужных фрагментов. При этом, как бы я не «чеканил» слова, транскрибирование дает адекватный результат:




К сожалению, не доступен сервер mySQL