После моего блога Расшифровка речи с использованием определенных моделей в Kaldi многие в ответах и ​​офлайн спрашивали, как можно использовать соответствующую модель для расшифровки вместе с отметками времени. Приложения включают использование данных временных меток для получения меток для некоторых других задач машинного обучения. Итак, в этом блоге я объясняю, как можно использовать обученную модель для получения временных меток в транскрипции. Чтобы сделать эту статью автономной и простой для понимания, я не использую модель aspire, вместо этого я использую простой классификатор да нет.

Набор данных:

Для этой задачи загрузите набор данных из http://www.openslr.org/resources/1/waves_yesno.tar.gz и извлеките его в egs / yesno / s5 как waves_yesno или создайте программную ссылку в указанном выше каталоге. Это очень простой набор данных, в котором один и тот же человек говорит только да / нет на иврите. Что звучит как CAN для Да и LOW для Нет. Найдите время, чтобы прослушать один из файлов wav в каталоге waves_yesno. Файл с именем 0_1_1_0_0_1_1_0.wav содержит No_Yes_Yes_No_No_Yes_Yes_No в порядке. Наша цель - получить метки времени для этой транскрипции в хорошо известном формате ctm, как показано ниже:

<utterance_id> <channel_id> <start_time> <end_time> <word_spoken>

Давайте углубимся дальше, чтобы увидеть, как это можно сделать.

Получение файлов AM и LM:

К настоящему времени я надеюсь, что вы уже настроили и установили Kaldi. В Kaldi смените каталог на egs / yesno / s5 / и запустите run.sh. Это создаст лексикон (L.fst), языковую модель Grammar (G.fst) в каталоге data / и акустическую модель (final.mdl) в каталоге exp / mono0a. Поскольку словарный запас содержит очень мало фонем, тренировки по монофону достаточно, чтобы получить достойный WER.

Расшифровка:

В каталоге exp / mono0a / decode_test_yesno / мы можем видеть решетки, созданные для тестового набора (см. Data / test_yesno), и мы можем получить транскрипцию для набора поездов из выравниваний, которые были сгенерированы во время обучения. Выравнивания - это промежуточный файл, который содержит идентификаторы перехода, представляющие вывод PDF-файлов в каждом кадре.

Основные команды, которые мы будем использовать здесь: ali-to -phones, если ввод - это выравнивание, и nbest-to-ctm, если ввод - решетка калди.

Здесь важно помнить, что nbest-to-ctm выводит идентификаторы слов, тогда как ali-to -phones с выводом ctm выводит идентификаторы фонем. Об этом нужно позаботиться, когда мы преобразуем эти идентификаторы в соответствующие слова (я покажу вам).

Для файлов поездов они уже преобразованы в выравнивания, которые можно найти в exp / mono0a /, поэтому мы можем напрямую использовать ali-to -phones,

ali-to-phones --ctm-output exp/mono0a/final.mdl ark:’gunzip -c exp/mono0a/ali.1.gz|’ train.ctm

Прежде чем мы будем использовать nbest-to-ctm для тестовых файлов, он ожидает, что решетки будут по линейному единственному пути, то есть пути 1best, поэтому мы направим ему вывод lattice-1best и получим результаты.

lattice-1bes --acoustic-scale=0.1 ark:’gunzip -c exp/mono0a/decode_test_yesno/lat.1.gz|’ ark:- | nbest-to-ctm ark:- test.ctm

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

cat test.ctm | int2sym.pl -f 5 data/lang/words.txt > test_d.ctm
cat train.ctm | int2sym.pl -f 5 data/lang/phones.txt > train_d.ctm

поскольку в последнем столбце train_d.ctm есть телефоны, просто используйте sed для преобразования в слова (поскольку у нас есть только два уникальных телефона - ›слова)

sed -i’.org’ -e ‘s/Y/YES/g’ -e ‘s/N/NO/g’ train_d.ctm
cat *_d.ctm | grep -v SIL > all_files.ctm #removing SIL rows

Думаешь, готово? Нет, требуется одно небольшое окончательное изменение, чтобы получить нужный нам формат. Ctm в калди дает формат как

‹Start-time› ‹продолжительность этого слова› в 3-м и 4-м столбцах, поэтому нам нужно добавить 4-й столбец в 3-й столбец, чтобы получить последний 4-й столбец.

Мы легко можем сделать это с помощью awk.

awk ‘{$4=$3+$4; print $0}’ all_files.ctm

Итак, наконец, наша необходимая транскрипция временных меток находится в all_files.ctm. Наслаждаться!!!

awk '{$4=$3+$4; print $0}' all_files.ctm | head
0_1_1_1_1_1_1_1 1 0.000 1.33 NO
0_1_1_1_1_1_1_1 1 1.330 1.92 YES
0_1_1_1_1_1_1_1 1 1.920 2.53 YES
0_1_1_1_1_1_1_1 1 2.530 3.1 YES
0_1_1_1_1_1_1_1 1 3.100 3.73 YES
0_1_1_1_1_1_1_1 1 3.730 4.37 YES
0_1_1_1_1_1_1_1 1 4.370 4.99 YES
0_1_1_1_1_1_1_1 1 4.990 6.16 YES
1_0_0_0_0_0_0_0 1 0.000 1.3 YES
1_0_0_0_0_0_0_0 1 1.300 1.95 NO