-
[Kaldi tutorial] Data preparationML/Kaldi 2020. 7. 27. 17:02반응형
ESPnet에서 data preparation을 kaldi style로 하고 있어서 document를 공부해보려 한다. Kaldi의 documentation은 Apache 2.0 라이센스를 따르고 있으므로 출처를 정확히 밝힌다.
Introduction
예제 스크립트를 실행한 후에, 자신의 데이터로 kaldi 음성인식을 개발하고 싶을 것이다. 이 섹션은 어떻게 데이터를 준비하는지에 대해 설명한다. 이 페이지는 예제 스크립트의 최신 버전을 사용중이라고 가정한다. (ex egs/rm/s5/). Top-level인 run.sh 스크립트는 data preparation의 다양한 방법들과 관련된 command가 존재한다. local이라는 디렉토리는 data에 따라 다르게 작성된다. 예를 들어 RM setup과 WSJ에서의 commands가 다르다.
RM:
local/rm_data_prep.sh /export/corpora5/LDC/LDC93S3A/rm_comp || exit 1; utils/prepare_lang.sh data/local/dict '!SIL' data/local/lang data/lang || exit 1; local/rm_prepare_grammar.sh || exit 1;
WSJ:
wsj0=/export/corpora5/LDC/LDC93S6B wsj1=/export/corpora5/LDC/LDC94S13B local/wsj_data_prep.sh $wsj0/??-{?,??}.? $wsj1/??-{?,??}.? || exit 1; local/wsj_prepare_dict.sh || exit 1; utils/prepare_lang.sh data/local/dict "<SPOKEN_NOISE>" data/local/lang_tmp data/lang || exit 1; local/wsj_format_data.sh || exit 1;
Data preparation의 output으로는 두가지가 존재한다. the data(data/train/)와 the language(data/lang/)이다. the data는 녹음파일, the lang은 lexicon, phone set, 다양한 추가정보들이다. 만약 이미 존재하는 시스템이나 language model로 디코딩할 예정이라면, 오직 the data만 고려하면 된다.
Data preparation-- the "data" part.
Data preparation의 "data" part의 예제로, 예제 디렉토리의 "data/train" 디렉토리를 참고하라(예제를 돌린 후에). 꼭 data/train이 아니라 data/eval2000을 봐도 된다.
s5# ls data/train cmvn.scp feats.scp reco2file_and_channel segments spk2utt text utt2spk wav.scp
모든 파일이 동등하게 중요하진 않다. 하나의 발화가 하나의 파일로 존재한다면 segmentation 정보는 없고, "utt2spk", "text", "wav.scp"만 있을 것이다.
Files you need to create yourself (너가 스스로 만들어야 할 파일들)
text
"text" 파일은 각 발화의 문장을 포함한다.
s5# head -3 data/train/text sw02001-A_000098-001156 HI UM YEAH I'D LIKE TO TALK ABOUT HOW YOU DRESS FOR WORK AND sw02001-A_001980-002131 UM-HUM sw02001-A_002736-002893 AND IS
각 라인의 첫번째 요소는 utterance-id다. 그러나 만약 데이터에 speaker 정보가 있다면, utterance id 앞에 speaker-id를 넣어줘야 한다. 파일들을 sorting할 때 중요한 요소로 작용한다. 나머지 요소는 각 발화의 문장이다. 이 파일 안에 모든 단어를 vocabulary에 가지고 있지 않아도 된다. out of vocabulary 단어들은 data/lang/oov.txt에 들어갈 것이다.
utt2spk와 spk2utt 파일을 sorting할 때, 가장 쉬운 방법은 utter 앞에 speaker-id를 붙이는 것이다. 이 때 '-'를 사용한다. '-'는 낮은 ASCII 값이라 speaker id의 길이가 다양해도 sorting하는데 문제가 없다.
wav.scp
아래는 wav.scp 파일의 예제다.
s5# head -3 data/train/wav.scp sw02001-A /home/dpovey/kaldi-trunk/tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /export/corpora3/LDC/LDC97S62/swb1/sw02001.sph | sw02001-B /home/dpovey/kaldi-trunk/tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 2 /export/corpora3/LDC/LDC97S62/swb1/sw02001.sph |
이 파일의 포맷은
<recording-id> <extended-filename>
이다.
extended-filename은 그냥 실제 파일 이름이 될수도 있지만 위의 경우에는 wav-format file로 추출하는 명령어가 된다.
segments 파일이 없으면 wav.scp 파일의 각 라인의 첫번째 토큰은 utterance id다. wav.scp는 모노가 되어야 한다.
segments
s5# head -3 data/train/segments sw02001-A_000098-001156 sw02001-A 0.98 11.56 sw02001-A_001980-002131 sw02001-A 19.8 21.31 sw02001-A_002736-002893 sw02001-A 27.36 28.93
포맷은
<utterance-id> <recording-id> <segment-begin> <segment-end>
초 단위로 지정된 segment들로 어려울 거 없다.
reco2file_and_channel
reco2file_and_channel 파일은 오직 scoring (error rates 측정) 할 때만 사용된다(NIST's "sclite" tool로).
s5# head -3 data/train/reco2file_and_channel sw02001-A sw02001 A sw02001-B sw02001 B sw02005-A sw02005 A
포맷은
<recording-id> <filename> <recording-side (A or B)>
파일 이름은 전형적으로 .sph file의 이름이다. 만약 suffix가 없다면 일반적으로 "stm" 파일안에 있는 identifier다. 전화 통화의 상황에서 녹음된 데이터는 두가지 채널을 가진다. 만약 그렇지 않다면 "A"를 사용하는 것이 안전하다. 만약 "stm" 파일이 없거나 무엇인지 모른다면 "reco2file_and_channel" 파일은 필요없다.
utt2spk
마지막으로 utt2spk 파일이다. 간단하게 설명하면 각 utterance를 speaker로 바꿔준다.
s5# head -3 data/train/utt2spk sw02001-A_000098-001156 2001-A sw02001-A_001980-002131 2001-A sw02001-A_002736-002893 2001-A
포맷은
<utterance-id> <speaker-id>
Speaker-ids는 실제 speaker의 이름들과 정확히 일치할 필요는 없다. 만약 speaker에 대한 정보가 없다면, 그냥 utterance-ids와 같게 speaker-ids를 지정하면 된다. <utterance-id> <utterance-id>와 같이.
spk2gender
s5# head -3 ../../rm/s5/data/train/spk2gender adg0 f ahh0 m ajp0 m
이런게 있을 수도 있다.
etc
모든 파일들은 sorting되어야 한다. 만약 sorting되어 있지 않으면 스크립트 돌릴 때 에러가 날 것이다.
만약 데이터가 WER을 측정할 수 있도록 제공된 "stm"과 "glm" 파일을 가지고 있는 NIST로부터 test set을 포함한다면, 이 파일들을 data 디렉토리에 "stm"과 "glm"라는 이름으로 넣을 수 있다. 없다면 local/score.sh라는 이름으로 WER을 측정하는 scoring 스크립트를 넣어야 한다.
Files you don't need to create yourself (너가 스스로 만들 필요 없는 파일들)
다른 파일들은 위에서 만든 파일들로부터 생성된다.
spk2utt
utils/utt2spk_to_spk2utt.pl data/train/utt2spk > data/train/spk2utt
위 명령어를 통해 utt2spk의 반대되는 파일을 만들 수 있다. 포맷은
<speaker-id> <utterance-id1> <utterance-id2> ...
feats.scp
s5# head -3 data/train/feats.scp sw02001-A_000098-001156 /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/raw_mfcc_train.1.ark:24 sw02001-A_001980-002131 /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/raw_mfcc_train.1.ark:54975 sw02001-A_002736-002893 /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/raw_mfcc_train.1.ark:62762
feats.scp는 위와 같은 파일이다. 이 경우에서 한줄한줄은 추출된 MFCC 특성을 가리킨다. 포맷은
<utterance-id> <extended-filename-of-features>
각 feature file은 kaldi 포맷의 matrix를 포함한다. 이 경우에서는 (10ms 간격의 파일 길이) by (MFCC 13)의 구조를 가진다.
feats.scp 파일은 아래의 command로 생성된다.
steps/make_mfcc.sh --nj 20 --cmd "$train_cmd" data/train exp/make_mfcc/train $mfccdir
이 command는 top-level "run.sh" 스크립트에 들어있다. $mfccdir 변수를 설정함에 따라 그 위치에 .ark 파일이 저장된다.
cmvn.scp
data/train 디렉토리에 마지막 파일은 "cmvn.scp"다. 이 파일은 cepstral mean and variance normalization을 위한 speaker당 통계 정보가 들어있다. 통계 정보당 (mean std 2) by (MFCC + log-energy 14) 의 구조를 가진 matrix다. 예를 들어
s5# head -3 data/train/cmvn.scp 2001-A /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/cmvn_train.ark:7 2001-B /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/cmvn_train.ark:253 2005-A /home/dpovey/kaldi-trunk/egs/swbd/s5/mfcc/cmvn_train.ark:499
feats.scp 파일과 달리, cmvn.scp 파일은 utterance-id가 아니라 speaker-id로 인덱싱 되어있다. 아래의 명령어로 생성한다.
steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train $mfccdir
errors
Data preparation에서 error를 확인하기 위해 아래의 명령어로 확인할 수 있다.
utils/validate_data_dir.sh data/train
이 명령어로 error를 고칠 수도 있다.
utils/fix_data_dir.sh data/train
Data preparation-- the "lang" directory.
ESPnet에서는 LM model을 자체적으로 생산해서 그런가 lang 디렉토리가 없다. 그러므로 필요하게 되면 다시 공부해서 작성할 예정이다.
출처:
반응형'ML > Kaldi' 카테고리의 다른 글
[Kaldi tutorial] Feature extraction (0) 2020.07.29