Kaldi Tutorial for Korean Model Part 2
Image source
칼디로 한국어 음성인식 구현하기 파트 2
- 본 튜토리얼은 칼디를 막 시작하는 초보자들을 대상으로 하고 있으므로 칼디를 어느정도 공부하신 분들에게는 적합하지 않을 수 있습니다. 모든 설명은 다음 깃헙에 올려진 run.sh 스크립트를 기준으로 진행되면 추가적으로 궁금한 사항은 칼디 공식 홈페이지나 칼디 구글 헬프를 이용하길 바랍니다.
- 본 튜토리얼에서 사용하는 스크립트는 맥과 리눅스(우분투) 환경에서 준비해왔기 때문에 그 외에 환경 (예: 윈도우)에서는 제대로 진행되지 않을수도 있습니다. 어차피 칼디를 진행하기 위해서는 리눅스 환경이 갖춰져야 하기 때문에 이 부분은 불편하시더라도 최대한 맞춰주시고 튜토리얼을 진행하여 주시기 바랍니다.
- 튜토리얼에 사용되는 튜토리얼용 서울말 낭독체 코퍼스는 아래 링크를 통해 받으실 수 있으며, 튜토리얼 진행 도중 훈련에 필수적인 파일들이 제대로 생성되지 않을 상황에 대비해서 몇개의 파일을 미리 생성하여 준비하였으니 필요한 데이터는 그때마다 다운 받으시고 계속해서 진행해 나가시면 되겠습니다.
- 궁금한 사항이 있으실 경우 개인적인 메일을 보내시기 보다는 아래에 댓글을 다셔서 대부분의 질문이 이 튜토리얼을 보는 모든 분들과 공유되게 해주시기 바랍니다.
훈련 진행하기
파트 1을 진행했다면 kaldi로 음성인식을 구현하기 위해 기본적으로 필요한 데이터와 필수자료에 대한 이해가 어느정도 진행되었다고 할 수 있다. (만약 파트 1에 대한 이해가 완료되지 않았다면 파트 1에 대한 이해 및 준비가 확실히 끝나기 전까지 이번 파트 2로 넘어오지 않기를 바란다.) 이제는 주어진 run.sh을 차근차근 보면서 훈련을 진행해 나갈 것이다.
기본적인 변수 설정하기
훈련을 진행하기 전 기본적으로 설정해야하는 변수에 대해 살펴보자. 변수들 중 굵게 표시된 것들은 필요에 따라 수정이 필요한 것들이며, 그렇지 않은 것들은 수정할 필요가 없는 것들이다.### Set path and requisite variables.
# Kaldi root: Where is your kaldi directory?
kaldi=/home/kaldi
# Source data: Where is your source (wavefile) data directory?
source=/path/to/the/krs/dataset
# Log file: Log file will be saved with the name set below.
logfile=1st_test
# Result file name
resultfile=result.txt
- kaldi
- kaldi 변수는 현재 kaldi가 설치되어있는 절대경로 위치를 담고있는 변수로 본인 컴퓨터에 설치 된 kaldi의 위치를 적어주면 된다.
- 보통 kaldi 홈페이지에서 git clone 하였다면 그 디렉토리 위치를 바로 적어주면 된다.
- source
- source 변수는 훈련에 사용할 데이터셋의 절대경로 위치를 담고있는 변수로 본 튜토리얼에서는 small_krs가 저장된 위치를 적어주면 된다.
- 그리고 source 변수에 적은 디렉토리 내에는 train과 test 디렉토리가 저장되어 각각 훈련용과 테스트용으로 사용될 준비가 되어있어야 한다.
- 제공되는 small_krs 디렉토리 내에는 train과 test 폴더가 준비되어 있으므로 따로 준비할 필요는 없다.
- logfile
- 훈련이 진행되면서 저장할 로그 파일 이름을 logfile 변수명에 담는다.
- 기본적으로 적힌 변수값을 사용하면 되므로 이 부분을 건들지 않아도 된다.
- resultfile
- 훈련이 완료되어 성능 결과가 나오는 텍스트 파일의 이름을 담는 변수로 기본적으로 적힌 변수값을 사용하면 된다.
### Number of jobs.
train_nj=2
decode_nj=2
# dnn number of jobs.
dnn_train_nj=2 # if you wnat to run it by gpu then set it 1. otherwise kaldi will use cpu for dnn training.
- train_nj
- 훈련을 진행할 때 몇개의 cpu 코어를 사용할지를 결정하는 변수로 더 정확히 말하자면 cpu의 thread 개수에 따라 그 값을 탄력적으로 조정해서 훈련 속도를 극대화 시키고자 하는 변수이다.
- 하지만 cpu에 대해 잘 모르는 사용자의 경우 무턱대고 높은값으로 했다가는 오히려 속도가 느려질수도 있으므로 기본값(=2)으로 실행하는 것을 권장한다.
- decode_nj
- train_nj과 마찬가지로 테스트(디코드)를 진행할 때 몇개의 cpu 코어를 사용할지 결정하는 변수이다. 본인의 컴퓨터 혹은 서버의 성능에 따라 조정한다면 빠른 테스트를 진행할 수 있다.
- dnn_train_nj
- dnn의 경우 1의 값을 적어줄 경우 gpu로 훈련을 진행하고 2 이상으로 할 경우 cpu로 훈련을 진행하며 이 때의 값은 cpu의 코어 사용개수를 의미한다.
- 본인의 컴퓨터 혹은 서버가 nvidia 그래픽 카드를 사용하고, cuda를 설치하여 gpu 사용준비가 되었다면 변수값을 1로 하여 gpu 훈련을 진행하면 된다.
- 하지만 그렇지 않을 경우 2 혹은 그 이상의 값을 적어서 cpu로 훈련을 진행하면 된다.
### CMD
train_cmd=utils/run.pl
decode_cmd=utils/run.pl
- train_cmd & decode_cmd
- 훈련이나 테스트를 진행할 때 사용하는 코드로 run.pl과 queue.pl 2가지 있다.
- 여러 서버를 연결하여 훈련을 진행하거나 하는 경우가 아닌 평범하게 한 컴퓨터에서 훈련을 돌릴 경우 보통 run.pl을 지정한다.
- nj(num job)을 분할하거나 로그 기록 등등을 담당한다.
### Directories.
train_dir=data/train
test_dir=data/test
lang_dir=data/lang
dict_dir=data/local/dict
log_dir=log
- *_dir
- 훈련을 진행하면서 생성되는 파일을 담는 폴더들로 이 부분은 건들지 않도록 한다.
### Activation
### Data: Give 1 to activate the following steps. Give 0 to deactivate the following steps.
prepare_data=1
prepare_lm=1
extract_train_mfcc=1
extract_test_mfcc=1
extract_train_plp=0
extract_test_plp=0
### Training: Give 1 to activate the following steps. Give 0 to deactivate the following steps.
train_mono=1
train_tri1=1
train_tri2=1
train_tri3=1
train_dnn=0 # this tutorial will skip this dnn training step, because the prepared data is not enough for dnn training.
### Decoding : Give 1 to activate the following steps. Give 0 to deactivate the following steps.
decode_mono=1
decode_tri1=1
decode_tri2=1
decode_tri3=1
decode_dnn=0
### Result
display_result=1
Activation 부분은 실행하고자 하는 영역을 설정하는 곳으로 각 영역별로 1을 설정하면 실행되고 0을 설정하면 실행되지 않는다. 이는 전체 영역을 실행하다가 특정 영역에서 에러가 날 경우 이미 실행된 영역을 0으로 설정함으로써 불필요한 재실행을 막아준다.- prepare_data
- 파트 1에서 언급했던 훈련에 필요한 필수 자료들을 생성한다.
- prepare_lm
- 언어모델에 필요한 lang 디렉토리와 lm.arpa를 생성한다.
- extract_train_mfcc & extract_test_mfcc
- 오디오 음성파일로부터 mfcc를 추출한다.
- kaldi의 경우 보통 음성파일로부터 mfcc를 추출하여 이를 훈련 혹은 테스트의 input으로 사용한다.
- extract_train_plp & extract_test_plp
- 오디오 음성파일로부터 plp를 추출한다.
- plp는 mfcc와는 약간 다른 알고리즘을 사용하나 기본적으로 음성파일의 특징을 추출한다는 맥락은 mfcc와 같이 한다.
- 새로운 특징추출을 시도해보고 싶다면 plp를 사용해도 좋다. 하지만 plp에 대해 이해하고나서 사용하길 추천한다.
- train_mono & train_tri1 & train_tri2 & train_tri3 & train_dnn
- 본 튜토리얼에서 제공하는 음향모델에 대한 훈련 알고리즘으로, mono -> tri1 -> tri2 -> tri3 -> dnn을 순차적으로 진행하도록 설계했다.
- 따라서 mono부터 순차적으로 tri3까지 훈련을 진행하길 원한다.
- dnn의 경우 제공한 small_krs로는 훈련하기에 부족하므로 본 튜토리얼에서는 이 과정을 생략한다.
- decode_mono & decode_tri1 & deocode_tri2 & decode_tri3 & decode_dnn
- 각 음향모델 훈련이 끝나고나서 훈련 모델에 대한 성능을 테스트 하는 단계로 훈련이 끝난 모델에 대해서만 테스트를 진행하도록 한다.
- display_result
- 선택한 영역의 훈련 및 테스트가 끝난 뒤, 모든 결과에 대해 출력하는 영역이다.
- 훈련만 진행하고 테스트가 진행되지 않을 경우, 결과 출력이 이루어지지 않는다.
### Options.
# Monophone
mono_train_opt="--boost-silence 1.25 --nj $train_nj --cmd $train_cmd"
mono_align_opt="--nj $train_nj --cmd $decode_cmd"
mono_decode_opt="--nj $decode_nj --cmd $decode_cmd"
# Tri1
tri1_train_opt="--cmd $train_cmd"
tri1_align_opt="--nj $train_nj --cmd $decode_cmd"
tri1_decode_opt="--nj $decode_nj --cmd $decode_cmd"
# Tri2
tri2_train_opt="--cmd $train_cmd"
tri2_align_opt="--nj $train_nj --cmd $decode_cmd"
tri2_decode_opt="--nj $decode_nj --cmd $decode_cmd"
# Tri3
tri3_train_opt="--cmd $train_cmd"
tri3_align_opt="--nj $train_nj --cmd $decode_cmd"
tri3_decode_opt="--nj $decode_nj --cmd $decode_cmd"
# SGMM
sgmm2_train_opt="--cmd $train_cmd"
sgmm2_align_opt="--nj $train_nj --cmd $decode_cmd --transform-dir exp/tri3_ali"
sgmm2_decode_opt="--nj $decode_nj --cmd $decode_cmd --transform-dir exp/tri3_ali"
# SGMM + MMI
sgmm_denlats_opt="--nj $train_nj --sub-split 40 --transform-dir exp/tri3_ali"
sgmmi_train_opt="--cmd $train_cmd --transform-dir exp/tri3_ali"
sgmmi_decode_opt="--transform-dir exp/tri3/decode"
# DNN
# dnn_function="train_tanh_fast.sh"
dnn_function="train_multisplice_accel2.sh"
dnn_train_opt="--num-threads $dnn_train_nj"
dnn_decode_opt="--nj $decode_nj --transform-dir exp/tri3/decode"
옵션은 각 훈련 영역에 대한 정확한 이해 없이는 쉽게 건드릴 수 없는 값들로 구성되어있다. 본 튜토리얼에서는 각 영역에서 다루는 알고리즘에 대해 심도있게 다루지 않을 것이므로 본 옵션에 대한 자세한 설명은 생략한다. 각 영역별 알고리즘에 대해서는 각자 연구하길 바라며, 충분한 이해가 이뤄진 이후에 옵션의 값들을 조정해 나가길 바란다. 자세한 내용은 칼디 홈페이지를 참고하길 바란다.- dnn_function
- 본 튜토리얼에서는 dnn 훈련을 진행하지는 않지만 혹시라도 small_krs 데이터보다 더 큰 데이터를 모았을 경우 2가지 훈련 방식을 제공하고 있다.
- dnn 훈련을 진행할 경우 train_multisplice_accel2.sh을 추천한다.
Hyungwon Yang
댓글
댓글 쓰기