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

В основе голосового управления лежит технология распознавания речи. В ней задействованы достижения различных областей: от компьютерной лингвистики до цифровой обработки сигналов. На конференции YaC 2013 в начале октября Яндекс представил свою технологию распознавания речи, и сегодня мы хотели бы рассказать о том, как она работает.

Акустическая модель

Если сказать голосовому поиску «Лев Толстой», смартфон услышит не имя и фамилию, не два слова, а звуковой сигнал, в котором звуки плавно перетекают друг в друга, не имея чётких границ. Задача системы распознавания речи — восстановить по этому сигналу, что было сказано. Ситуацию осложняет то, что одна и та же фраза, произнесённая разными людьми в разной обстановке, будет давать совершенно непохожие друг на друга сигналы. Правильно интерпретировать их помогает система акустического моделирования.

Когда вы произносите голосовой запрос, например, в Яндекс.Навигаторе, смартфон записывает его и отправляет на сервер Яндекса. На сервере запись разделяется на много маленьких фрагментов (фреймов) длиной 25 миллисекунд, внахлёст, с шагом 10 миллисекунд. То есть из одной секунды вашей речи получается сто фреймов.

Дальше каждый из них пропускают через акустическую модель — функцию, которая определяет, какие звуки вы произнесли. На основе этих данных система, натренированная методами машинного обучения, определяет варианты слов, которые вы видите в результатах поиска. Мобильный Браузер в ответ на запрос «Лев Толстой» найдёт сайты о великом писателе, а Навигатор и Карты предложат улицу Льва Толстого.

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

Фонетический алфавит Яндекса

В русском языке, по разным теориям, около 40 фонем (звуковых единиц). Наша система распознавания речи сопоставляет входящий речевой сигнал с фонемами, а потом уже из них собирает слова. Например, слово «Яндекс» состоит из семи фонем — [й][а][н][д][э][к][с]. Фонемы могут обладать различной длительностью, и в разбивке по фреймам слово «Яндекс» может выглядеть, например, так — [й][й][а][а][а][а][а][а][а][а][а][а][н][н][д][д][э][к][с]. Произношение любой фонемы зависит от её соседей и позиции в слове. То есть звук [а] в начале, в середине и в конце слова — это три разных [а], а звук [а] между двумя гласными в сочетании «на аудиозаписи» отличается от [а] между согласными в слове «бак». Поэтому для хорошего распознавания фонема — слишком грубая единица.

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

Вероятности

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

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

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

Сейчас наша технология распознавания речи правильно определяет 94% слов в Навигаторе и мобильных Картах и 84% слов в мобильном Браузере. При этом на распознавание уходит около секунды. Это уже весьма достойный результат, и мы активно работаем над его улучшением. Мы верим, что через несколько лет голосовой интерфейс ввода не будет уступать классическим способам.

P.S. Кроме собственно технологии, мы представили на YaC 2013 публичное API для распознавания речи — SpeechKit. С его помощью разработчики могут добавить голосовой поиск Яндекса в свои приложения для Android и iOS. Скачать SpeechKit, а также ознакомиться с документацией, можно здесь.

@темы: школьное