Friday, November 21, 2014

Использование скрытых марковских моделей для распознования речи

В предыдущей статье мы рассмотрели простейший вариант приложения для распознавания речи. Теперь я предлагаю окунуться в эту тему немного глубже и рассмотреть несколько более серьёзный подход к этом вопросу.
И так, допустим, что мы разбили входной сигнал на фреймы определённой (50мс) длины и вычислили для каждого фрейма соответствующий MFCC-вектор. Что же делать дальше?


Букварь


Логично предположить, что каждый фрейм/MFCC-вектор соответствует некоторому звуку. Следовательно, всё, что нам нужно - это составить букварь типа "Звук - MFCC-вектор". После чего мы без труда сможем "прочитать" наши данные и получить слова!

Однако, на деле всё не так просто. Подобный букварь позволит на преобразовать последовательность фреймов в последовательность звуков, а не слов. При этом не стоит забывать, что:

Во-первых, разные люди могут произносить звуки по разному: тембр голоса и т.д. То есть, отношение "Звук - MFCC-вектор" должно рассматриваться как "1 ко многим". К счастью, это небольшая проблема, которая лишь немного усложнит структуру нашего букваря.

Во-вторых, звук может длиться более одного фрейма. Так, например, краткий звук "а", произнесённый вне слова (под запись, без принудительного затягивания) длится где-то 300мс. Для согласных это значение будет где-то на 50% ниже (важно помнить, что Т - это "т", а не "тэ"), но сути дела это не меняет.
В итоге, c учётом длины фрейма в 50мс, для слова "один", мы можем получить последовательность звуков "ооооддииииннн".

В-третьих, некоторые буквы могут произноситься по разному. Так, например, буква "о", часто произносится как "а" (так называемое "аканье"). Учитывая этот факт мы вполне можем ждать на входе последовательность звуков типа "аааддииинн".

Другими словами, использование букваря (смотреть секцию "CODEBOOK") не может в полной мере решить задачу распознавания речи, однако позволяет полностью свести её в область, прекрасно подходящую для другого инструмента - Скрытых Марковских Моделей.


СММ


Про СММ написаны горы статей [1,2] и сняты гигабайты видео (моё любимое), поэтому я не буду останавливаться на них подробно, а лишь опишу способ их применения для задачи распознавания речи.

И так, скрытая марковская модель - это набор из:
  • множества внутренних/скрытых состояний (буквы в слове);
  • множества наблюдаемых значений (звуки, что мы получаем на вход из MFCC-векторов);
  • вектора начального распределения (с какой из множества заданных букв вероятнее всего начнётся слово);
  • матрицы переходов между внутренними состояниями (какая буква идёт за какой, как долго буква может "тянуться");
  • матрица эмиссий (вероятность услышать звук Y для буквы X);
В качестве примера рассмотрим слово "один":
STATES  4 o d i n
OBSERVATIONS 5 o a d i n
INITIAL
1.0 0.0 0.0 0.0
TRANSITION
0.75 0.25 0.0 0.0
0.0 0.5 0.5 0.0
0.0 0.0 0.75 0.25
0.0 0.0 0.0 1.0
EMISSION
0.5 0.5 0.0 0.0 0.0
0.0 0.0 1.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
0.0 0.0 0.0 0.0 1.0

Данная модель довольно проста:
  • вектор начального распределения говорит нам, что слово "один" всегда должно начинаться с буквы "о" (что крайне логично);
  • матрица переходов показывает, что гласные "о" и "и" тянуться намного дольше, согласных "д" и "н" (т.е. вероятность перейти из состояния "о" в него же оставляет 0.75, в то время как переход в состояние "д" имеет вероятность лишь 0.25);
  • матрица эмиссий говорит нам, что единственное разночтение возможно только для буквы "о" (может слышаться либо "о", либо "а");

Прекрасно, скажете вы, но что нам делать с этой моделью? Допустим у нас есть вышеописанная модель M и некая последовательность наблюдаемых звуков О="аааддииинн". Существует 3 стандартные задачи для СММ, 2 из которых мы сейчас расммотрим.


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


Допустим, у нас есть некоторе множество заранее подготовленных моделей (набор известных нам слов). В данном случае задача распознавания последовательности O сводится к поиску наиболее правдоподобной модели. В свою очередь правдоподобность модели для некоторой последовательности вычисляется как P(O|M) - вероятность появления последовательности наблюдений для каждой возможной последовательности состояний модели. Звучит несколько сложновато, но по факту реализуется простым "натягиванием" наблюдений на модель и оценкой того, хорошо ли "сидит". Делается это с помощью алгоритма Прямого Хода (описание / реализация).


Обучение


Теперь представим, что у нас есть несколько образцов произношения слова "один", сгенерированных конкретным человеком. Подобрав значения модели M так, что бы для всех этих последовательностей звуков модель выдавала максимальную вероятность - обучив модель максимизировав P(O|M), мы сможем значительно улучшить качество распознования. Сделать это можно с помощью алгоритма Баума-Велша (описание / реализация).

No comments:

Post a Comment