Эта заметка дает общее представление о том, как работают сценарии рецептов 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 scriptcmd.sh
, you need to changequeue.pl
torun.pl
ifGridEngine
is not installed. . ./cmd.sh # Run scriptpath.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 variablestage
to 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 (например, werstage
0. 5 ). Это связано с тем, что steps / decode.sh вызывает local / score.sh, где мы играем с некоторыми параметрами оценки, чтобы получить лучшее WER.
В примере werstage
0.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
Я оставлю это для другой заметки. Спасибо, что прочитали :)!