SpeechKit — речевые технологии Яндекса

Ещё недавно общение с роботами было чем-то из области фантастики. Только капитан космического корабля мог голосом, не нажимая никаких кнопок, отдать команду бортовому компьютеру проложить маршрут к нужной точке. Сегодня это может сделать любой пользователь Яндекс.Навигатора. Возможно, вам и самим случалось говорить с роботами: во многих больших компаниях на звонки клиентов сейчас отвечают виртуальные операторы, которые самостоятельно решают типовые несложные задачи.
Чтобы говорить с человеком, компьютер должен уметь превращать звуковой сигнал в слова, улавливать смысл сказанного и произносить ответ. Другими словами, при каждом обмене репликами с человеком робот распознаёт речь, выделяет смысловые объекты и, приняв решения на основе полученных данных, синтезирует голосовой ответ.
В Яндексе эти задачи решаются с помощью комплекса речевых технологий, который называется SpeechKit. В этой статье мы вкратце расскажем об основных принципах его работы.

Распознавание речи

Если сказать голосовому поиску «Лев Толстой», смартфон услышит не имя и фамилию и даже не два слова, а просто последовательность плавно сменяющих друг друга звуков. Задача системы распознавания речи — «расслышать» в этих звуках буквы (вернее, соответствующие им фонемы) и сложить их в слова. Ситуацию осложняет то, что одна и та же фраза, произнесённая разными людьми в разной обстановке, будет звучать по-разному и давать непохожие друг на друга сигналы. Правильно интерпретировать их помогают акустическая и языковая модели.
Акустическая модель
Акустическая модель умеет определять, какой набор фонем соответствует звуковому сигналу. Этому она учится на большом корпусе начитанных дикторами текстов и их транскрипций — компьютер как бы следит за чтением по подстрочнику. Со временем, прослушав и прочитав определённое количество материалов и накопив достаточную статистику совпадений, он делает вывод: звуку с такими характеристиками, как правило, соответствует такая-то фонема, другому звуку — другая, и так далее.
Акустическая модель работает не с самим звуком, а с его характеристиками — то есть признаками, выраженными в цифрах. Когда вы произносите голосовой запрос, например в Яндекс.Навигаторе, смартфон записывает его и отправляет на сервер Яндекса. Там запись разделяется на много маленьких фрагментов — фреймов. На каждую секунду речи приходится сто фреймов. Они длятся по 25 миллисекунд и идут внахлёст, как черепица, чтобы информация на стыках не терялась. Каждый фрейм подвергается ряду преобразований, в результате которых получается около 40 коэффициентов, описывающих его частотные характеристики. На основании этих данных акустическая модель может предположить, частью какой фонемы является фрейм.
Фонемой называется элементарная единица речи — в русском языке их около 40 (около — потому что лингвисты разных школ пользуются разными системами классификации и единого мнения насчёт числа фонем у них нет). На самом деле звуки, которые мы произносим, гораздо разнообразнее, ведь звучание фонемы зависит от того, в какой части слова — в начале, середине или конце — она находится и что у неё за соседи. Например, [а] между двумя гласными в сочетании «на аудиозаписи» отличается от [а] между согласными в слове «бак». Поэтому для хорошего распознавания фонема — слишком грубая единица.
Чтобы точнее смоделировать произношение фонемы, мы, во-первых, делим каждую из них на три части: условные начало, середину и конец. Во-вторых, используем собственный фонетический алфавит, который учитывает позицию и контекст фонем. Он состоит из 4000 элементарных единиц (вообще-то сочетаний получается больше, но многие из них просто не встречаются в реальной речи, поэтому мы не принимаем их в расчёт). С этим набором и работает наша технология распознавания речи.
Языковая модель
В идеальном мире программа безошибочно определяет, какая фонема соответствует каждому фрагменту голосового запроса. Но даже человек иногда может не понять или не расслышать все звуки и достраивает слово исходя из контекста. Для этого люди опираются на собственный речевой опыт: если ваш собеседник жалуется на заложенный нос, вы поймёте, что у него «насморк», а не «дасморк». Примерно так же работает система распознавания, только вместо речевого опыта она использует языковую модель.
Как и акустическая модель, языковая тоже обучается на большом корпусе текстов. Но в процессе учёбы она обращает внимание не на соответствие звуков и фонем, а на то в какие последовательности — то есть слова и фразы — обычно складываются фонемы.
Языковая модель работает уже не с признаками звука, а с цепочкой фонем — вернее с цепочкой вероятных фонем. Дело в том, что акустическая модель, обработав частотные признаки фрейма, выдаёт не одну конкретную фонему, а несколько — и у каждой из них свой коэффициент вероятности. Несколько упрощая, допустим, что в случае «насморка» акустическая модель выдаст две примерно равно вероятных фонемы в начале слова — [н] и [д]. Теперь в дело вступает языковая модель. Во время обучения «дасморки» встречались ей нечасто, а вот «насморков» — сколько угодно. Поэтому система сделает вывод, что в начале слова, вероятнее всего, была фонема [н].
Примерно так же, исходя из контекста, языковая модель определяет последовательности слов. Например, выбирая между «мама мыла раму» и «мама мыло рама», она предпочтёт первое словосочетание, потому что оно знакомо ей по тренировочному корпусу текстов.

Понимание естественного языка

На этапе понимания естественного языка компьютер имеет дело уже не с самой речью, а с текстом, в который она была преобразована. На самом деле ему совершенно не важно, получен ли этот текст в результате распознавания. Поэтому SpeechKit можно использовать не только в голосовых интерфейсах, но и для создания ботов, способных общаться в мессенжерах, отвечать на письма или смс.
Конечно, сами по себе слова для компьютера ничего не значат. Так же и мы, глядя в текст, написанный на неизвестном нам языке, не можем представить, о чём идёт речь, если только нам не встречаются какие-нибудь знакомые слова. Примерно такая же задача — по знакомым словам и формулировкам понять говорящего — стоит и перед компьютером.
Представьте приложение, которое выполняет функции личного помощника: добавляет встречи в ежедневник, помогает купить билеты в театр, записывает за пользователем умные мысли — всё в таком духе. Этому приложению нужен голосовой интерфейс, чтобы пользователь мог сказать ему: «Устал я что-то, домой пора — вызови такси», а потом просто назвать нужный адрес и не вводить никакие данные вручную.
Чтобы понять, чего хочет пользователь, и активировать нужную функцию, роботу нужно заметить в распознанной речи ключевые слова. В нашем случае — «вызови такси». Этим словам его научил разработчик: они занесены в программу в числе других формулировок вызова такси: «закажи такси», «вызови машину», […] «хочу поехать домой». Естественно, всех вариантов разработчик учесть не может. Поэтому, собрав тестовую версию приложения, он предлагает попользоваться ею друзьям и коллегам — так выясняется, как ещё люди могут заказывать такси.
Все новые формулировки записываются в конфигурационный файл программы, а затем размечаются: в них выделяются слова-маркеры и характерные синтаксические схемы. Анализируя разметку, программа сама учится понимать даже такие формулировки, которых нет в списке, но которые похожи на известные ей конструкции. Например, если в списке есть варианты «вызови машину» и «закажи такси», то и формулировку «закажи машину» программа тоже поймёт.

Синтез речи

Чтобы работать с голосовым интерфейсом компьютера было удобно, он должен уметь не только слышать, но и говорить. Конечно, если сервис не предполагает сложной коммуникации с пользователем, его реплики можно просто заранее записать и проигрывать в нужный момент. Но что если компьютеру придётся использовать в своём вопросе информацию, которую он только что получил от человека? Скажем, для подтверждения даты и адреса доставки? Чтобы он мог с таким справиться, его нужно научить произносить произвольный текст.
Подготовка текста
Задача синтеза речи тоже решается в несколько этапов. Сначала специальный алгоритм подготавливает текст для того, чтобы роботу было удобно его читать: записывает все числа словами, разворачивает сокращения и так далее. Затем текст делится на фразы, то есть на словосочетания с непрерывной интонацией — для этого компьютер ориентируется на знаки препинания и устойчивые конструкции. Для всех слов составляется их фонетическая транскрипция. Например, «какого» поменяется на «какова», ведь иначе робот так и прочитал бы это слово — окая и через «г».
Чтобы понять, как читать слово и где поставить в нём ударение, робот сначала обращается к классическим, составленным вручную словарям, которые встроены в систему. Если нужного слова в словаре нет, компьютер строит транскрипцию самостоятельно — опираясь на правила, заимствованные из академических справочников. Наконец, если обычных правил оказывается недостаточно — а такое случается, ведь любой живой язык постоянно меняется, — он использует статистические правила. Последние формулируются примерно таким же способом, как и правила акустической и языковой моделей: если слово встречалось в корпусе тренировочных текстов, система запомнит, на какой слог в нём обычно делали ударение дикторы.
Произношение и интонирование
Когда транскрипция готова, компьютер рассчитывает, как долго будет звучать каждая фонема, то есть сколько в ней фреймов. Затем каждый фрейм описывается по множеству параметров: частью какой фонемы он является и какое место в ней занимает; в какой слог входит эта фонема; если это гласная, то ударная ли она; какое место она занимает в слоге; слог — в слове; слово — в фразе; какие знаки препинания есть до и после этой фразы; какое место фраза занимает в предложении; наконец, какой знак стоит в конце предложения и какова его главная интонация.
Другими словами, для синтеза каждых 25 миллисекунд речи используется множество данных. Информация о ближайшем окружении обеспечивает плавный переход от фрейма к фрейму и от слога к слогу, а данные о фразе и предложении в целом нужны для создания правильной интонации синтезированной речи.
Чтобы прочитать подготовленный текст, снова используется акустическая модель — но уже не та, что применялась при распознавании. Тогда нужно было установить соответствие между звуками с определёнными характеристиками и фонемами. Вторая акустическая модель, используемая при синтезе, должна, наоборот, по описаниям фреймов составить описания звуков.
Откуда она знает, как правильно произнести фонему или придать верную интонацию вопросительному предложению? Как и две другие модели, о которых мы уже говорили, она учится на текстах и звуковых файлах. Например, в неё можно загрузить аудиокнигу и соответствующий ей текст. Чем больше данных, на которых учится модель, тем лучше её произношение и интонирование.
Голоса
Наконец, о самом голосе. Узнаваемыми наши голоса, в первую очередь, делает тембр, который зависит от особенностей строения органов речевого аппарата у каждого человека. Тембр вашего голоса можно смоделировать, то есть описать его характеристики — для этого достаточно начитать в студии небольшой корпус текстов. После этого данные о вашем тембре можно использовать при синтезе речи на любом языке, даже таком, которого вы не знаете. Когда роботу нужно что-то сказать вам, он использует генератор звуковых волн — вокодер. В него загружаются информация о частотных характеристиках фразы, полученная от акустической модели, а также данные о тембре, который придаёт голосу узнаваемую окраску.
Подробнее о возможностях и способах применения Yandex SpeechKit вы можете прочитать на специальном сайте. Если вы разработчик и хотите протестировать облачную или мобильную версию SpeechKit, поищите информацию на странице технологии.