Эта заметка дает общее представление о том, как работают сценарии рецептов kaldi, в надежде, что люди с небольшим опытом работы со сценариями оболочки (например, я) смогут сэкономить время на изучении kaldi.

Mini-librispeech - это небольшое подмножество корпуса LibriSpeech, которое состоит из речи для чтения аудиокниг. Мы рассмотрим каждый шаг в kaldi / egs / mini_librispeech / s5 / run.sh.

Параметры и настройка среды

# Change this location to somewhere where you want to put the data.
# Specifiy where you want to store audio and language model data.
data=./corpus/
# Specify the url for downloading audio data.
data_url=www.openslr.org/resources/31
# Specify the url for downloading vocabulary, lexicon and pre-trained language model (trained on LibriSpeech).
lm_url=www.openslr.org/resources/11
# Run script cmd.sh, you need to change queue.pl to run.pl if GridEngine is not installed.
. ./cmd.sh
# Run script path.sh which adds all kaldi executable dependencies to your environment path. This is required every time you start a new terminal, and it can avoided by adding all paths in your .bashrc.
. ./path.sh
# Set which stage this script is on, you can set it to the stage number that has already been executed to avoid running the same command repeatedly.
stage=0
# Enable argument parsing to kaldi scripts (e.g. ./run.sh --stage 2 sets variable stageto 2).
. utils/parse_options.sh
# Make the scripts exit safely when encountering an error.
set -euo pipefail
# Create the data folder (./corpus/ in this case) if it doesn’t exist already.
mkdir -p $data

Этапы

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

if [ $stage -le x ]; then
  ...
fi

что просто означает запуск команд в этом блоке, если stage меньше или равно числу x. Мне лично нравится менять -le на eq (что означает «равно»), чтобы я мог выполнять рецепт шаг за шагом.

stage по умолчанию установлен на 0, что означает, что рецепт будет запускать все блоки. Если вы столкнулись с ошибкой, вы можете проверить, какие этапы успешно пройдены, и повторно запустить рецепт до ./run.sh --stage x.

Этап 0: выборка данных

for part in dev-clean-2 train-clean-5; do
  local/download_and_untar.sh $data $data_url $part
done

Загрузите dev-clean-2 (набор для разработчиков) и train-clean-5 (набор для поездов) из URL, указанный ранее, до ./corpus/ и разархивируйте их. Вы можете проверить файлы в папке ./corpus/ после запуска.

local/download_lm.sh $lm_url $data data/local/lm

Загружает предварительно обученную языковую модель в ./corpus/, затем создает программную ссылку на data / local / lm .

Загружаются следующие файлы:

  • 3-gram.arpa.gz, триграмма arpa LM.
  • 3-грамм.pruned.1e-7.arpa.gz, обрезанная (с порогом 1e-7) триграмма arpa LM.
  • 3-грамм.pruned.3e-7.arpa.gz, обрезанная (с порогом 3e-7) триграмма arpa LM.
  • librispeech-vocab.txt, словарь на 200 тыс. слов для LM.
  • librispeech-lexicon.txt, варианты произношения, некоторые из которых G2P автоматически сгенерировали, для всех слов в словаре.

Этап 1: подготовка данных и обучение LM

for part in dev-clean-2 train-clean-5; do
  # use underscore-separated names in data directories.
  local/data_prep.sh $data/LibriSpeech/$part data/$(echo $part | sed s/-/_/g)
done

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

Если вы установите флажок data / train_clean_5 после выполнения вышеуказанных команд, вы увидите следующие текстовые файлы:

  • wav.scp сопоставляет файлы wav с их путями (иногда с некоторыми командами обработки звука).
  • utt2spk сопоставляет высказывания их говорящему. Когда информация о говорящем неизвестна, мы обрабатываем каждое высказывание как нового говорящего.
  • spk2utt сопоставляет говорящих с произнесенными ими высказываниями.
  • текст: сопоставляет записи с их транскрибированным текстом.
  • spk2gender сопоставляет говорящих с их полом.
  • utt2dur сопоставляет высказывания с их продолжительностью.
  • utt2num_frames сопоставляет высказывания с их количеством кадров.

Каждый набор данных (поезд, разработка, тест) должен иметь свой набор файлов. Среди этих файлов: wav.scp, utt2spk, spk2utt и текст необходимы для построения любых моделей Kaldi.

local/prepare_dict.sh --stage 3 --nj 30 --cmd "$train_cmd" \
  data/local/lm data/local/lm data/local/dict_nosp

«nosp» относится к словарю перед вероятностями молчания и произношением.

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

  • extra_questions.txt, список дополнительных вопросов, которые будут включены в дополнение к автоматически сгенерированным вопросам для деревьев решений.
  • lexicon.txt, отсортированный лексикон с некоторыми дополнительными телефонами для отключения звука.
  • lexiconp.txt, лексика с вероятностями произношения.
  • lexicon_raw_nosil.txt, та же лексика.
  • nonsilence_phones.txt, список телефонов без отключения звука.
  • optional_silence.txt, список дополнительных телефонов без звука.
  • silent_phones.txt, список телефонов без звука. Более подробное объяснение можно найти здесь.
utils/prepare_lang.sh data/local/dict_nosp \
  "<UNK>" data/local/lang_tmp_nosp data/lang_nosp

Это подготовит каталог lang со следующими файлами:

  • L.fst, форма лексики FST.
  • L_disambig.fst, L.fst, но включая символы значений.
  • oov.int, сопоставленное целое число слов вне словарного запаса.
  • oov.txt, слова вне словарного запаса.
  • phones.txt отображает телефоны с целыми числами.
  • topo, топология используемых нами HMM.
  • words.txt сопоставляет слова с целыми числами.
  • телефоны /, указывает различные параметры телефона.
local/format_lms.sh --src-dir data/lang_nosp data/local/lm

Используйте data / lang_nosp / word.txt для форматирования двух сокращенных LM arpa в G.fst в data / lang_nosp_test_tgmed и data / lang_nosp_test_tgsmall.

utils/build_const_arpa_lm.sh data/local/lm/lm_tglarge.arpa.gz \
  data/lang_nosp data/lang_nosp_test_tglarge

Создайте языковую модель формата ConstArpaLm (G.carpa) из полной 3-граммовой LM arpa.

Этап 2: экстракция MFCC

mfccdir=mfcc указывает, где хранить извлеченные MFCC.

for part in dev_clean_2 train_clean_5; do
  steps/make_mfcc.sh --cmd "$train_cmd" --nj 10 data/$part exp/make_mfcc/$part $mfccdir
  steps/compute_cmvn_stats.sh data/$part exp/make_mfcc/$part $mfccdir
done

Извлекает MFCC и вычисляет статистику CMVN из data / dev_clean_2 и data / train_clean_5 в mfcc с использованием 10 параллельных заданий. Журналы можно найти в exp / make_mfcc, это то, что вы собираетесь проверить, если что-то пойдет не так.

# Get the shortest 500 utterances first because those are more likely
# to have accurate alignments.
utils/subset_data_dir.sh --shortest data/train_clean_5 500 data/train_500short

Создайте подмножество данных из 500 самых коротких высказываний. Мы не копируем здесь MFCC, если вы посмотрите data / train_500short, вы можете найти feat.scp который отображает высказывания в то место, где хранятся их MFCC.

Этап 3: обучение монофону

steps/train_mono.sh --boost-silence 1.25 --nj 5 --cmd "$train_cmd" \
  data/train_500short data/lang_nosp exp/mono

Обучите монофоническую систему, используя 500 самых коротких фраз и предварительно обученный LM, обученную модель и журналы можно найти в exp / mono. --boost-silence 1.25 устанавливает коэффициент увеличения вероятности молчания при согласовании до 1,25. -nj 5 устанавливает количество параллельных заданий равным 5.

(
  utils/mkgraph.sh data/lang_nosp_test_tgsmall \
    exp/mono exp/mono/graph_nosp_tgsmall
  for test in dev_clean_2; do
    steps/decode.sh --nj 10 --cmd "$decode_cmd" exp/mono/graph_nosp_tgsmall \
      data/$test exp/mono/decode_nosp_tgsmall_$test
  done
)&

Создайте окончательный график (модель HCLG.fst) и расшифруйте data / dev_clean_2 с помощью графика. Вы можете найти WER в exp / mono / decode_nosp_tgsmall_dev_clean_2.

В рецепте mini_librispeech каждый этап обучения (монофон, трифон, dnn и т. Д.) Сопровождается этапом декодирования, вы можете закомментировать их, если не хотите декодировать с определенными моделями, поскольку это занимает некоторое время. Но это хорошая практика - видеть улучшения, когда модель становится более сложной.

Как вы можете видеть в exp / mono / decode_nosp_tgsmall_dev_clean_2, существует более одного файла WER (например, werstage0. 5 ). Это связано с тем, что steps / decode.sh вызывает local / score.sh, где мы играем с некоторыми параметрами оценки, чтобы получить лучшее WER.

В примере werstage0.5, 10 - это LM-вес для восстановления решетки, 0,5 - штрафной коэффициент за вставку слова.

steps/align_si.sh --boost-silence 1.25 --nj 5 --cmd "$train_cmd" \
  data/train_clean_5 data/lang_nosp exp/mono exp/mono_ali_train_clean_5

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

Этап 4: обучение треугольнику дельта + дельта-дельта

steps/train_deltas.sh --boost-silence 1.25 --cmd "$train_cmd" \
  2000 10000 data/train_clean_5 data/lang_nosp exp/mono_ali_train_clean_5 exp/tri1

Обучите модель трифона с функциями MFCC + дельта + дельта-дельта, используя согласования обучения, созданные на этапе 3.

Я пропущу здесь команды декодирования.

steps/align_si.sh --nj 5 --cmd "$train_cmd" \
  data/train_clean_5 data/lang_nosp exp/tri1 exp/tri1_ali_train_clean_5

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

Этап 5: Тренировка на трифоне LDA + MLLT

steps/train_lda_mllt.sh --cmd "$train_cmd" \
  --splice-opts "--left-context=3 --right-context=3" 2500 15000 \
  data/train_clean_5 data/lang_nosp exp/tri1_ali_train_clean_5 exp/tri2b

Обучите модель трифона с помощью преобразований функций LDA и MLLT, используя согласования обучения, созданные на этапе 4.

steps/align_si.sh  --nj 5 --cmd "$train_cmd" --use-graphs true \
  data/train_clean_5 data/lang_nosp exp/tri2b exp/tri2b_ali_train_clean_5

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

Этап 6: обучение на трифоне LDA + MLLT + SAT

steps/train_sat.sh --cmd "$train_cmd" 2500 15000 \
  data/train_clean_5 data/lang_nosp exp/tri2b_ali_train_clean_5 exp/tri3b

Обучите модель трифона с помощью «Обучение адаптации динамика», используя тренировочные настройки, созданные на этапе 5.

Этап 7: воссоздайте языковую модель и вычислите согласования из модели SAT.

steps/get_prons.sh --cmd "$train_cmd" \
  data/train_clean_5 data/lang_nosp exp/tri3b

В этой команде происходит несколько вещей:

  • Линейные решетки (одиночный путь) генерируются для каждого высказывания в train_clean_5 с использованием последнего выравнивания и LM.
  • Группа pron.x.gz создается с форматом
<utterance-id> <begin-frame> <num-frames> <word> <phone1> <phone2> … <phoneN>
  • Получите pron_counts_nowb.txt, который содержит количество произношений (сгенерированное выравниванием данных обучения, а не из исходного текста).
utils/dict_dir_add_pronprobs.sh --max-normalize true \
  data/local/dict_nosp \
  exp/tri3b/pron_counts_nowb.txt exp/tri3b/sil_counts_nowb.txt \
  exp/tri3b/pron_bigram_counts_nowb.txt data/local/dict

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

utils/prepare_lang.sh data/local/dict \
  "<UNK>" data/local/lang_tmp data/lang

local/format_lms.sh --src-dir data/lang data/local/lm

utils/build_const_arpa_lm.sh \
  data/local/lm/lm_tglarge.arpa.gz data/lang data/lang_test_tglarge

Затем мы создаем новый ConstArpa LM с новым словарем.

steps/align_fmllr.sh --nj 5 --cmd "$train_cmd" \
  data/train_clean_5 data/lang exp/tri3b exp/tri3b_ali_train_clean_5

Вычислите тренировочные выравнивания, используя модель SAT и новый L.fst.

Этап 8: построение графиков и декодирование

utils/mkgraph.sh data/lang_test_tgsmall \
  exp/tri3b exp/tri3b/graph_tgsmall

Создайте окончательный график (модель HCLG.fst) с маленькой триграммой LM.

steps/decode_fmllr.sh --nj 10 --cmd "$decode_cmd" \
  exp/tri3b/graph_tgsmall data/$test \
  exp/tri3b/decode_tgsmall_$test

Декодируйте тест, заданный с использованием модели SAT и маленькой триграммы LM, WER можно найти в exp / tri3b / decode_tgsmall_dev_clean_2 .

steps/lmrescore.sh --cmd "$decode_cmd" data/lang_test_{tgsmall,tgmed} \
  data/$test exp/tri3b/decode_{tgsmall,tgmed}_$test

Пересчет декодированной решетки (exp / tri3b / decode_tgsmall_dev_clean_2) со средними триграммами LM, решетками и WER после переоценки можно найти в exp / tri3b / decode_tgmed_dev_clean_2.

steps/lmrescore_const_arpa.sh \
  --cmd "$decode_cmd" data/lang_test_{tgsmall,tglarge} \
  data/$test exp/tri3b/decode_{tgsmall,tglarge}_$test

Пересчет декодированной решетки (exp / tri3b / decode_tgmed_dev_clean_2) с большими LM ConstArpa, решеток и WER после переоценки можно найти в exp / tri3b / decode_tglarge_dev_clean_2.

Вы можете увидеть улучшения WER от exp / mono / decode_nosp_tgsmall_dev_clean_2 до exp / tri3b / decode_tglarge_dev_clean_2

Этап 9: обучение DNN

Я оставлю это для другой заметки. Спасибо, что прочитали :)!