Kaldi - это набор инструментов для распознавания речи, ориентированный на исследователей. Мы можем использовать Kaldi для обучения моделей распознавания речи и декодирования звука выступлений. До сих пор мы обсуждали разные темы в нашей серии статей по распознаванию речи. Мы хотели бы завершить обсуждение убедительным примером обучения автоматического распознавания речи (ASR). Тем не менее, если вы ищете инструкции по использованию Kaldi, вам следует обратиться к документам Kaldi. Они авторитет. Что-то может часто меняться для API и командных строк, показанных в этой статье. Поскольку мы просто хотим продемонстрировать процесс, мы не будем обновлять их, даже если они будут изменены в будущем. В каждом разделе есть разные уровни детализации. Не стесняйтесь пропускать информацию в зависимости от вашего уровня интереса.

OpenFST

WFST популярен при моделировании преобразователей ASR.

Одним из популярных инструментов WFST с открытым исходным кодом является OpenFst, который активно используется Kaldi. Чтобы использовать WFST в OpenFST, нам нужно определить символы ввода и вывода и определение FST. Файл символов содержит словарь и отображает слова в уникальные идентификаторы, используемые OpenFST.

Затем мы определяем определение FST в отдельном файле. Каждая строка в файле FST определяет дугу (кроме последней строки). Первые два столбца определяют состояние, откуда он переходит и куда переходит. Третий столбец представляет метку входа, а четвертый столбец представляет метку выхода. Если это тире, результат будет пустым.

Вот файл определения для WFST, который включает вес для каждой дуги.

Для ускорения вычислений во время обучения мы компилируем эти файлы в двоичное представление FST с помощью fstcompile.

Источник данных

Перед обучением нам нужны необработанные данные, а также другая метаинформация. Обучение распознаванию речи начинается с корпуса, содержащего набор записанных речевых записей. Многие речевые ресурсы доступны в Консорциуме лингвистических данных (LDC), начиная с платы в диапазоне от 1 тыс. Долларов для лиц, не являющихся членами.

Вот пример идентификации записей с помощью строкового идентификатора. Затем мы привязываем этот идентификатор к его расшифровке. В этом примере каждый клип содержит произношение трех цифр.

Вот другие стенограммы корпуса управления ресурсами.

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

Обучение может включать дополнительный текст для построения языковой модели. Это помогает нам создать последовательность слов, которые грамматически верны.

Эту языковую модель можно распознать как модель N-граммов.

Данные

Есть два способа чтения или записи данных. В форме «scp» (сценарий) файл «.scp» сопоставляет ключ с именем файла или каналом Unix.

В форме «ковчега» (архива) данные хранятся в одном файле.

Вот спецификатор, используемый в командной строке, который указывает, как данные читаются или записываются.

WFST

Kaldi использует OpenFst для создания и поиска взвешенных конечных преобразователей (WFST). Он используется Калди для декодирования. Например, на второй диаграмме ниже он соответствует последовательности телефонов при создании слова «данные» (для телефонов: / d / / ey / / t / / ax /) или «роса» (для телефонов: / d / / uw /).

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

Подготовка данных

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

Акустические данные

Акустические данные включают в себя гендерную информацию о говорящих (spk2gender), идентификатор и аудиоданные для каждого высказывания (wav.scp), расшифровку стенограммы для каждого высказывания (текст), соответствие между высказываниями и говорящими (utt2spk) и расшифровку стенограммы корпуса. (корпус. текст).

Языковые данные

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

Управление ресурсами

Управление ресурсами - это корпус, содержащий простые и понятные команды с небольшим словарным запасом. Для создания тестовых и обучающих наборов из корпуса Resource Management (RM) (каталожный номер LDC93S3A, приобретенный у Linguistic Data Consortium (LDC)), мы запускаем

Следующие каталоги создаются в ./data с данными, раздельно сегментированными на обучение и тестирование.

Подкаталог «local» будет содержать:

Подкаталог «поезд» будет содержать:

т.е. все файлы, упомянутые ранее, будут подготовлены автоматически. Однако не все файлы имеют формат, используемый Kaldi. Мы используем инструменты OpenFST, чтобы подготовить их в первую очередь. Команда будет такой:

Все файлы, созданные с расширением * .txt, представляют собой таблицы символов в формате OpenFst. Соответствует строке целочисленному идентификатору. Приведенная выше команда создаст новую папку с именем «lang». Первые два созданных файла - words.txt иphones.txt. Эти файлы сопоставляют строковый идентификатор с целочисленным идентификатором, используемым Kaldi внутри.

Телефоны

Kaldi позволяет пользователям определять и классифицировать различные типы телефонов, включая «настоящие телефоны» и телефоны с функцией отключения звука. Вся эта информация о категориях помогает Kaldi строить топологии HMM и деревья решений.

prepare_lang.sh преобразует файлы безмолвия и безмолвия телефона для Kaldi. Файл context_indep.txt содержит все телефоны, которые не являются настоящими телефонами: тишина (SIL), речевой шум (SPN), неречевой шум (NSN) и смех (LAU). В файле может быть множество вариантов этих телефонов в зависимости от позиции слова. Например, SIL_B - это телефонное отключение звука в начале слова.

Файлы silent.txt и nonsilence.txt содержат телефоны без звука и телефоны без звука соответственно. Это те телефоны, которые мы хотим смоделировать в проекте. Во многих конфигурациях файл silent.txt идентичен context_indep.txt.

Word_boundary.txt включает информацию для телефонов, которые используют в качестве границы слова.

Символы неоднозначности (для различения лексики с одинаковым префиксом) содержатся в:

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

Создается еще один файл с именем L.fst. Это скомпилированная лексика в формате FST. Мы можем запустить следующую команду, чтобы просмотреть лексикон в текстовой форме.

Грамматика

Следующим шагом является создание FST для грамматики.

FST для языковой модели можно найти по адресу data / lang_test / G.fst. Внутри он вызывает fstcompile для генерации WFST G.

Резюме

Вот команды для подготовки данных, языковой модели и грамматической модели для управления ресурсами.

Извлечь функции

Затем мы запустим команду для извлечения функций MFCC для каждого высказывания.

Первая команда ниже отображает расположение данных обучающих высказываний. Последние две команды отображают местоположение и извлеченные функции MFCC.

Вот еще одна команда для изучения извлеченных функций MFCC.

Статистические данные кепстрального среднего и дисперсии, проиндексированные спикерами, могут быть найдены следующим образом:

Для каждого динамика эта статистика используется для нормализации входных кепстральных характеристик, соответствующих одному и тому же динамику.

Обучение монофону

Затем мы обучим модели монофонов с помощью приведенной ниже команды. (В нашей серии статей о распознавании речи мы называем монофонический телефон контекстно-независимым телефоном.)

Вот использование train_mono.sh

Внутренне gmm-init-mono инициализирует и выводит модель 0.mdl и плоское фонетическое дерево решений без разделения.

Будет создан файл data / lang / topo. Он содержит топологию HMM для телефонов. Первое состояние в каждой записи - это начальное состояние. Последнее - это конечное состояние без переходов из него.

Телефоны с 21 по 188 - это телефоны, по которым мы храним расшифровку стенограммы («настоящие» телефоны). Эта топология состоит из трех внутренних состояний с тремя излучающими состояниями. Испускающие состояния - это состояния, которые «испускают» векторы признаков. Телефоны с 1 по 20 предназначены для тишины и шума. Он более сложный и использует 5 излучающих состояний для их моделирования.

Затем Калди составляет график обучения для более быстрого обучения в дальнейшем. Это генерирует один FST для каждого обучающего высказывания. Он кодирует структуру HMM для высказывания. Этот график FST содержит кратные из состояния, в состояние, символ ввода, символ вывода и стоимость. Входные символы - это идентификаторы перехода, которые включают идентификаторы PDF, которые идентифицируют акустические состояния GMM аудиокадров. Выходные символы - это слова. В стоимость входит вероятность произношения в лексиконе. Но вероятность перехода модели HMM будет добавлена ​​позже во время обучения.

Затем Kaldi выполняет первое выравнивание, предполагающее, что состояния HMM равномерно распределены. (т.е. каждое состояние HMM охватывает одинаковое количество аудиокадров.)

Калди использует тренировку Витерби для принудительного выравнивания, а не алгоритм вперед-назад. После этого Калди переоценил акустические модели GMM.

Как показано, вероятностные модели HMM (TransitionModel) и модели GMM обновлены. Компоненты GMM также разделены.

После завершения первого прохода мы запускаем несколько итераций в обучении модели. Внутри цикла

  • gmm-align-compiled выравнивает состояния телефона в соответствии с моделями GMM,
  • gmm-acc-stats-ali накапливает статистику для обучения GMM, и
  • gmm-est выполняет функцию максимального правдоподобия для повторной оценки акустических моделей на основе GMM.

После обучения файла модели мы можем исследовать модель (0.mdl) с помощью:

Чтобы проверить выравнивание данных обучения по Витерби, введите:

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

Или вы хотите прочитать расклад в удобной для человека форме, введите:

Давайте вкратце расскажем о топологиях HMM и модели перехода, прежде чем изучать, как выполнять декодирование ASR.

Топологии HMM

Приведенное ниже определение топологии HMM охватывает телефоны с 1 по 8, которые загружаются в класс HmmTopology.

Выше указаны три излучающих состояния, от 0 до 2. Для каждого излучающего состояния мы смоделируем акустическую модель, которую мы можем наблюдать. Первое состояние 0 - это начальное состояние. Состояние 3 выше - это конечное состояние без излучения.

С излучающим состоянием связан файл PDF (PDF: функция плотности вероятности). PdfClass моделирует этот выходной PDF (распределение выбросов). Мы можем применить привязку состояний явно, например, в контекстно-зависимых телефонах, чтобы совместно использовать акустические модели. Следовательно, значение PdfClass не обязательно должно быть уникальным. Состояния могут иметь автоматический переход и переходы в другие состояния. Первое значение в ‹Transition› определяет состояние перехода, а второе значение - вероятность перехода. Второе значение - это всего лишь первоначальное предположение. Копия будет продублирована в модели перехода и скорректирована во время обучения.

Переходные модели

Объект TransitionModel в Kaldi хранит вероятности перехода и топологии HMM (HmmTopology). Код построения графа использует объект TransitionModel для получения топологии и вероятностей перехода.

transition-id

Мы будем использовать идентификаторы перехода для входных меток FST вместо идентификатора pdf (акустическое состояние). «Идентификатор перехода» определяет идентификатор PDF-файла, телефон и конкретный переход в объекте HmmTopology. Дополнительная информация помогает нам сопоставить последовательность ввода-метки с последовательностью телефонных разговоров и другой бухгалтерией, необходимой во время обучения вероятностям перехода.

Обучение модели перехода

Созданные FST имеют идентификаторы перехода в качестве входных меток. Kaldi выполняет обучение Витерби, которое дает наиболее вероятную последовательность входных меток в форме последовательности идентификаторов перехода (один идентификатор перехода на аудиокадр). Kaldi накапливает счетчики для различных переходов и использует их для завершения модели перехода.

Декодировать

Далее, учитывая высказывание, мы хотим найти наиболее вероятную последовательность слов. Перед любым декодированием нам нужно создать граф декодирования (граф WFST) для вывода.

Внутри он сначала составляет L G. График будет детерминирован и свернут. Это создает график для отображения телефонов в слова.

Затем он составляет C L G.

Затем Калди создает преобразователь H (HMM), используя топологии, дерево решений и модель перехода. В Ha.fst (H) будет удалено само зацикливание в HMM. Метка ввода будет идентификатором перехода, который включает идентификатор pdf, который идентифицирует акустическое состояние.

Затем мы составляем H C L G с последующей детерминацией и минимизацией. ε и символы неоднозначности также удалены.

Позже в HMM снова добавляется самозатирание.

После завершения mkgraph.sh мы можем декодировать данные тестирования с помощью:

Чтобы увидеть некоторые декодированные результаты:

Или с помощью файла .tra для просмотра результата:

Внутренне это называется gmm-latgen-fast. Он генерирует решетку, которая позже будет повторно оценена, чтобы выбрать наиболее вероятную последовательность слов. Параметры луча ниже определяют размер луча поиска.

Чтобы взглянуть на некоторую сводную информацию этого раздела декодирования, такую ​​как среднее логарифмическое правдоподобие на кадр, введите

чтобы увидеть конец файла журнала.

Вот образец вывода декодирования.

Тренировочная трифонная система

Как обсуждалось ранее, чтобы избежать неприятных локальных оптимумов, мы обучаем ASR с несколькими проходами. Мы начинаем обучение монофонической системы для облегчения обучения. Затем мы постепенно переходим к системе с тремя телефонами, засеянной информацией, подготовленной на предыдущем тренинге.

Приведенный ниже сценарий включает два основных этапа обучения. Первый шаг - выравнивание данных с помощью монофонической системы. Затем мы обучаем трифонную систему с помощью train_deltas.sh.

ASR монофонии не будет достаточно точным для LVCSR. Контекст телефона важен. Но использование телефонов слишком увеличит количество состояний HMM. Одним из важных шагов в обучении трифону является обучение дерева решений для кластеризации состояний, звучащих примерно одинаково. Таким образом, можно уменьшить сложность, используя одну и ту же акустическую модель для нескольких состояний HMM.

Фонетическое дерево решений

Это дерево решений реализовано как жадное разбиение сверху вниз. Пни бинарного решения выбираются из задаваемых пользователем или предопределенных вопросов, включая тип окружающих телефонов или текущее состояние и т. Д. Для каждого разделения Kaldi выбирает вопрос, который позволил разделенным данным иметь наибольшую вероятность в соответствии с моделями в соответствующие ветки. Например, если мы используем две гауссовские модели для моделирования данных в левой и правой ветвях соответственно, после разделения данных обучающие данные должны иметь наивысшую вероятность согласно соответствующей гауссовой модели.

Часть процесса обучения дерева решений настраивается. Для телефонов, перечисленных в одной строке в root.txt, они должны иметь единственный «общий корень» в дереве решений.

Например, в системах, зависящих от стресса и тона, все варианты конкретного телефона, зависящие от стресса или тона, обычно имеют один и тот же корень. Кроме того, все три состояния HMM фонемы (телефона) также должны иметь один и тот же корень. На практике каждый корень дерева Kaldi соответствует «настоящему телефону» - телефоны, соответствующие различным вариантам расположения слов, тона или ударения, сгруппированы вместе и образуют корень дерева.

Kaldi поставляется с заранее определенными вопросами, которые нужно выбрать для принятия решения, но дополнительные вопросы можно настроить. Например, он может включать вопросы о положении слова в телефоне (например, начало или конец слова).

После обучения модели монофона мы используем ее для выравнивания аудиокадров с монофонами. Это вызов align_si.sh в скрипте.

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

train_deltas.sh

(Кредит: в этом разделе мы повторно используем некоторые комментарии кода в Kaldi для нашего объяснения.)

Вначале acc-tree-stats считывается в архиве функций и соответствующих выравниваний. Затем он накапливает и генерирует статистику для создания дерева решений. Затем sum-tree-stats суммирует статистику построения дерева фонетического контекста.

Вот результат для acc-tree-stats

и статистика дерева сумм, показывающая 19268 состояний. Первая запись ниже предназначена для состояния 0 с фонетическим контекстом (0 10 22: ‹eps› / d / ih, как в «DID»).

Затем он группирует телефоны в наборы, чтобы получить и задать вопросы о состоянии HMM на основе акустического сходства.

У Kaldi есть варианты управления построением дерева. Как показано в файле root.txt ниже, SIL, SIL_B, SIL_E, SIL_I и SIL_S используют один и тот же корень независимо от позиции слова в телефоне SIL.

Затем Калди строит набор фонетических деревьев решений с максимальным количеством листьев, определенным в $ numleaves.

Вот как может выглядеть дерево.

Затем Калди читает дерево, аккумуляторы деревьев и топологию. Он инициализирует и выводит файл модели 1.mdl. Он записывает модель топологии HMM и вероятностного перехода (тип TransitionModel) и акустическую модель (тип AmDiagGmm) в файл модели.

Затем Калди выполняет разделение смеси GMM.

Затем он преобразует выравнивания из модели монофона в текущую модель дерева.

Затем мы составляем графики обучения для стенограмм, чтобы последующее обучение могло быть быстрее.

Затем мы запускаем несколько итераций в обучении модели. Мы перестраиваем и переделываем акустическую модель GMM аналогично обучению монофону.

На этом завершается обучение ASR. В остальных разделах мы рассмотрим отдельные темы на Kaldi. Во-первых, мы познакомимся с несколькими терминологиями и основными концепциями, которые постоянно упоминаются в документах Kaldi.

Расшифровка построения графа

Калди составляет HCLG = H o C o L o G, чтобы сформировать граф декодирования.

  • G - акцептор (входные и выходные символы одинаковые), кодирующий языковую модель.
  • L - это лексикон. Он сопоставляет телефоны со словом.
  • C отображает контекстно-зависимые телефоны в контекстно-независимые телефоны.
  • H содержит определения HMM. Он отображает идентификаторы перехода в контекстно-зависимые телефоны.

Выходные данные будут детерминированы и минимизированы с целью оптимизации.

Устранение неоднозначности (необязательно)

Чтобы обеспечить детерминированность, символы разрешения неоднозначности будут вставлены, а затем удалены. Символы устранения неоднозначности (символы №1, №2, №3) вставляются в конце последовательностей фонем в лексиконе, когда последовательность фонем является префиксом другой последовательности фонем. Добавлены символы устранения неоднозначности, чтобы различать их и гарантировать определение композиции L o G. Символ # 0 добавляется к дуге отсрочки в языковой модели G. Это обеспечивает возможность определения G при удалении эпсилонов. Остальные подробности здесь мы опускаем. Многие из них необходимы для определения WFST.

Композиция

Состав WFST можно резюмировать как:

Для H петля удаляется и добавляется в конце композиции. Подробные сведения о подготовке каждого преобразователя и о том, как их собрать, можно найти здесь. Для обучения и тестирования создаются отдельные графики декодирования. График, созданный во время обучения, проще, чем во время тестирования, потому что не нужны символы разрешения неоднозначности. Мы знаем стенограмму. А при обучении G состоит из линейного акцептора, соответствующего транскрипту обучения.

Датчик H

Датчик H отображает акустические состояния (метки входа) на контекстно-зависимые телефоны. В Kaldi метка ввода H (или H C L G) является идентификатором перехода, который включает акустическое состояние ( pdf-идентификатор). Этот преобразователь H не содержит петли, но будет добавлен обратно, когда композиция будет завершена.

Декодер

Существует два основных декодера Kaldi: SimpleDecoder и FasterDecoder плюс их соответствующая версия для генерации решетки вместо наиболее вероятной последовательности слов. Эти декодеры можно использовать с различными акустическими моделями, такими как GMM. FasterDecoder имеет почти тот же интерфейс, что и SimpleDecoder. Основное отличие - это новое значение конфигурации «max-active», которое контролирует максимальное количество состояний, которые могут быть активны одновременно. Эта конфигурация управляет отсечкой луча во время декодирования с помощью отсечки веса.

Сначала создается экземпляр декодера с помощью FST.

Вот фрагмент кода для декодирования. Gmm_decodable содержит последовательность вектора признаков, подлежащего декодированию, и акустическую модель GMM.

Класс DiagGmm представляет собой одну диагонально-ковариационную GMM. Акустическая модель - это набор объектов DiagGmm, идентифицированных «pdf-id». Это реализовано как класс AmDiagGmm.

Затем наиболее вероятную последовательность можно получить в виде решетки. Но эта решетка будет содержать только один путь.

И это внутренний цикл декодера при повторении аудиокадров.

Условия

alignment: В Kaldi выравнивание - это последовательность идентификаторов перехода.

pdf-id: идентифицирует сгруппированное контекстно-зависимое состояние излучения HMM (например, акустическое состояние GMM).

transition-id: идентифицирует pdf-id, идентификатор телефона и информацию о том, выполняет ли он автоматический или прямой переход в HMM.

Резюме

Подведем итоги с помощью более простого ASR. Вот фрагмент кода для обучения ASR для цифр. Это один из самых простых примеров. Другой ASR может включать в себя несколько проходов с повторным выравниванием, преобразованием функций, использованием целевой функции MMIE и т. Д. Для заинтересованных, вот более сложный пример с использованием корпуса RM.

Подготовьте акустические данные

Акустические данные, включая высказывание, расшифровку, текстовый корпус и информацию о выступающем, будут подготовлены вручную.

Файл spk2utt будет создан автоматически в следующем формате.

Извлечение функций

Характеристики MFCC будут извлечены с помощью кепстрального среднего и статистики отклонений (CMVN), собранных в конце для нормализации функций.

Подготовить языковые данные

Лексика, тишина и телефонная информация без тишины будут подготовлены вручную. Будет создан FST для словаря, а файлы, относящиеся к телефонам и словам, будут преобразованы в целочисленные идентификаторы, необходимые Kaldi.

Создание языковой модели

SRILM - это набор инструментов языковой модели. ngram-count в SRILM создает внутренний счетчик N-грамм, установленный путем считывания счетчиков из файла. Затем он генерирует и управляет подсчетом N-граммов и оценивает на их основе модели языка N-граммов. Последняя команда создает FST для грамматики (G).

Обучение работе с монофоном и декодирование

Как только вся информация будет готова из предыдущего шага, мы можем выполнять обучение монофонии. Затем мы создаем граф декодирования и используем его для декодирования данных тестирования.

Обучение и декодирование трифона

Первый шаг - выровнять данные с помощью монофонической системы. Затем обучаем систему трифона с последующим декодированием.

Источники и ссылки

Все команды оболочки, используемые в этой статье, являются снимками из документов Kaldi или Kaldi Github.

Калди док

Распознавание речи с лекциями Калди

Введение в использование WFST в обработке речи и языка