2019년 7월 14일 일요일

음성인식 메모(kaldi) 18 - Toolkit script

「原作者へ」

連絡先を存じ上げませんでしたので、不本意ながら無断で翻訳しました。 
正式に翻訳を許可されたいです。 
gogyzzz@gmail.comでご連絡ください。

아래 포스트의 번역입니다.

http://work-in-progress.hatenablog.com/entry/2018/07/01/154347


스스로 준비한 음성 데이터를 인식 시키는 순서는 Kaldi for Dummies tutorial에 설명되어 있다.

"for Dummies"라고 할 정도이니, 「yes/no」 샘플(이전 포스트) 다음으로 실습해보기에는 이것이 좋을 것이다.

흐름을 크게 정리하자면 아래와 같다.

  1. Download Kaldi (GitHub에서 clone)
  2. Data preparation ( 음성 데이터와 언어 데이터를 준비 )
  3. Project finalization (Scoring script를 카피 / SRILM 설치 / Config 파일 작성)
  4. Running scripts creation (cmd.sh / path.sh / run.sh 생성)
  5. Getting results (run.sh 실행)

언어 모델에 대해서는, Julius의 경우 연속 단어라면 「N-gram」이나 「DFA」(원저자의 다른 글)、고립 단어라면 "-w" 옵션(원저자의 다른 글)을 준비했지만, Kaldi의 경우는 「N-gram」하나만을 택하고 있다.

N-gram을 만들기 위한 언어 모델 Toolkit 몇가지

언어모델 처리 툴

언어모델 구축 툴 메모 - Negative/Positive Thinking

튜토리얼처럼 SRILM을 사용하자.

최신 버전은 「1.7.2」(업데이트 날짜는 「9 November 2016」)

이번엔 「Running scripts creation」 항목의 「run.sh」의 흐름을 따라가보자.

스크립트 내의 흐름을 크게 정리하면 아래와 같다.

  1. 음성 데이터 준비(발화와 화자의 매핑(화자가 한명이라면 경고가 발생한다), feature extraction)
  2. 언어모델 준비(WFST화, Grammar와 Lexicon)
  3. Monophone 모델의 생성과 학습
  4. Monophone 모델을 사용한 decoding
  5. Monophone 모델을 사용한 alignment(Triphone 모델 생성의 input이 된다)
  6. Triphone 모델의 생성과 학습
  7. Triphone 모델을 사용한 decoding

「run.sh」를 실행하기 위해 아래 파일이 준비 되어 있다면 OK.

% tree --charset C    
.
|-- cmd.sh
|-- conf
|   |-- decode.config
|   `-- mfcc.conf
|-- data
|   |-- local
|   |   |-- corpus.txt
|   |   `-- dict
|   |       |-- lexicon.txt
|   |       |-- nonsilence_phones.txt
|   |       |-- optional_silence.txt
|   |       `-- silence_phones.txt
|   |-- test
|   |   |-- text
|   |   |-- utt2spk
|   |   `-- wav.scp
|   `-- train
|       |-- text
|       |-- utt2spk
|       `-- wav.scp
|-- local
|   `-- score.sh
|-- path.sh
|-- run.sh
|-- steps -> ${KALDI_ROOT}/egs/wsj/s5/steps
`-- utils -> ${$KALDI_ROOT}/egs/wsj/s5/utils

「data/train」와 「data/test」가 음성 데이터.

「data/train」가 학습용, 「data/test」가 테스트용으로, 여기선 '모시모시'라는 발화를 3회 녹음하여 파일 3개를 준비했다.

(학습용으로 2파일, 테스트용으로 1파일)

「data/local」이 언어 데이터.

'모시모시'에 덧붙여, 같은 음소로 표현가능한 단어 두개 '모모(복숭아)', '이모(고구마, 감자 같은 뿌리채소)'를 추가하여 총 3개를 준비.

「run.sh」 내부의 처리를 순서대로 살펴보자.

1. 음성데이터 준비

# ===== PREPARING ACOUSTIC DATA =====

# Making spk2utt files
utils/utt2spk_to_spk2utt.pl data/train/utt2spk > data/train/spk2utt
utils/utt2spk_to_spk2utt.pl data/test/utt2spk > data/test/spk2utt

# ===== FEATURES EXTRACTION =====

# Making feats.scp files
steps/make_mfcc.sh data/train exp/make_mfcc/train $mfccdir
steps/make_mfcc.sh data/test exp/make_mfcc/test $mfccdir

# Making cmvn.scp files
steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train $mfccdir
steps/compute_cmvn_stats.sh data/test exp/make_mfcc/test $mfccdir

2. 언어모델 준비

# ===== PREPARING LANGUAGE DATA =====
utils/prepare_lang.sh \
    data/local/dict \
    "<UNK>" \
    data/local/lang \
    data/lang

# ===== MAKING lm.arpa =====
lm_order=1 # language model order (n-gram quantity)
ngram-count \
    -order $lm_order \
    -write-vocab \
    data/local/tmp/vocab-full.txt \
    -wbdiscount \
    -text data/local/corpus.txt \
    -lm data/local/tmp/lm.arpa

# ===== MAKING G.fst =====

arpa2fst \
    --disambig-symbol=#0 \
    --read-symbol-table=data/lang/words.txt \
    data/local/tmp/lm.arpa \
    data/lang/G.fst

Lexicon(L.fst)

3. Monophone 모델의 생성과 학습

steps/train_mono.sh \
    data/train \           # <data-dir>
    data/lang \            # <lang-dir>
    exp/mono               # <exp-dir>

스크립트 내부에서 호출되는 kaldi 커맨드는 아래와 같다.

스크립트에는 "stage"라는 변수가 있어, 도중에서 재시작 가능하도록 되어 있다.

stage: -3

# Initialize monophone GMM
gmmbin/gmm-init-mono

stage: -2

# Creates training graphs(without transition-probabilities, by default)
bin/compile-train-graphs

stage: -1

균등 alignment를 가지고 통계량(statistics)을 생성

# Write an equally spaced alignment(for getting training started)
bin/align-equal-compiled

# Accumulate stats for GMM training
gmmbin/gmm-acc-stats-ali

stage: 0

# Do Maximum Likelihood re-estimation of GMM-based acoustic model
gmmbin/gmm-est

iteration (학습 횟수는 디폴트로 40)

# Modify GMM-based model to boost
gmmbin/gmm-boost-silence

# Align features given [GMM-based] models
gmmbin/gmm-align-compiled

# Accumulate stats for GMM training
gmmbin/gmm-acc-stats-ali

# (Above-mentioned ( stage 0 ))
gmmbin/gmm-est

"exp/mono/final.mdl"이 output이 된다.

4. Monophone 모델을 사용한 decoding

언어 데이터(”data/lang/L.fst"、"data/lang/G.fst"、기타)를 가지고, HMM state가 input이 되는 단어 그래프 "HCLG.fst"를 생성한다.

utils/mkgraph.sh \
    --mono \
    data/lang \      # <lang-dir>
    exp/mono \       # <model-dir>
    exp/mono/graph   # <graphdir> 

"--mono" 옵션은 폐지된 모양이다.

Note: the --mono, --left-biphone and --quinphone options are now deprecated and will be ignored.

"gmmbin/gmm-latgen-faster" 커맨드를 사용하여 decode를 실행.

음성 데이터는 테스트용으로 준비한 것(학습시의 데이터와 다름)

steps/decode.sh \
    --config conf/decode.config \
    exp/mono/graph \             # <graph-dir>
    data/test \                  # <data-dir>
    exp/mono/decode              # <decode-dir>

5. Monophone 모델을 사용한 alignment

steps/align_si.sh \
    data/train \          # <data-dir>
    data/lang \           # <lang-dir>
    exp/mono \            # <src-dir>
    exp/mono_ali          # <align-dir>

alignment 결과(exp/mono_ali/ali.1.gz)

utterance_id_001 2 1 1 1 1 1 8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 18 17 17 206 208 207 210 242 244 246 245 245 245 245 266 265 265 265 268 267 267 267 267 267 267 267 267 270 269 269 269 269 269 194 193 193 193 196 195 195 195 195 198 197 197 197 218 217 217 217 217 220 219 219 219 219 222 221 221 242 244 246 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 266 268 270 269 269 269 269 269 269 269 269 269 269 269 188 190 189 189 189 189 189 189 192 191 191 191 191 191 3 1 1 1 1 1 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 5 5 14 15 15 15 15 15 15 15 15 15 15 12 10 10 10 10 10 10 10 10 10 10 10 10 10 18 
utterance_id_002 2 8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 18 17 17 17 17 17 17 17 17 206 208 207 207 210 209 209 209 209 209 209 209 209 242 241 241 241 241 241 244 243 243 243 243 243 246 245 245 245 245 245 266 265 265 265 265 268 267 267 267 267 267 267 270 269 269 194 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 196 195 198 218 220 222 242 241 241 241 241 241 241 244 246 266 268 270 188 190 192 3 9 10 10 10 10 10 10 6 5 5 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 6 5 5 5 9 10 10 10 10 10 10 10 10 10 6 5 5 9 10 10 10 10 10 6 5 12 10 10 10 10 18 

6. Triphone 모델의 생성과 학습

steps/train_deltas.sh \
    2000 \             # <num-leaves>
    11000 \            # <tot-gauss>
    data/train \       # <data-dir>
    data/lang \        # <lang-dir>
    exp/mono_ali \     # <alignment-dir>
    exp/tri1           # <exp-dir>

스크립트 내부에서 호출되는 kaldi 커맨드는 아래와 같다.

stage: -3

# Accumulate statistics for phonetic-context tree building.
bin/acc-tree-stats

# Sum statistics for phonetic-context tree building.
bin/sum-tree-stats

stage: -2

# Cluster phones (or sets of phones) into sets for various purposes
bin/cluster-phones

# Compile questions
bin/compile-questions

# Train decision tree
bin/build-tree

# Initialize GMM from decision tree and tree stats
gmm-init-model

# Does GMM mixing up (and Gaussian merging)
gmmbin/gmm-mixup

stage: -1

# Convert alignments from one decision-tree/model to another
bin/convert-ali

stage: 0

# Creates training graphs (without transition-probabilities, by default)
bin/compile-train-graphs

iteration (학습 횟수는 디폴트로 35)

# Align features given [GMM-based] models.
gmmbin/gmm-align-compiled

# Accumulate stats for GMM training.
gmmbin/gmm-acc-stats-ali

# Do Maximum Likelihood re-estimation of GMM-based acoustic model
gmmbin/gmm-est

"exp/tri1/final.mdl"이 output이 된다.

7. Triphone 모델을 사용한 decoding

Monophone과 동일

utils/mkgraph.sh \
    data/lang \      # <lang-dir>
    exp/tri1 \       # <model-dir>
    exp/tri1/graph   # <graphdir> 

steps/decode.sh \
    --config conf/decode.config \
    exp/tri1/graph \             # <graph-dir>
    data/test \                  # <data-dir>
    exp/tri1/decode              # <decode-dir>

댓글 없음:

댓글 쓰기