HTK 사용법 튜토리얼 v1.0

김세환, 권오욱







2005. 1. 7.







충북대학교 전기전자컴퓨터공학부 음성언어연구실






< 차례 >


1. 서론                                                                             3

2. HTK 설치 방법                                                                    4

   2.1. 사용 환경                                                                     4

   2.2. Xmanager 설치                                                                4

   2.3. HTK 설치                                                                    5

      2.3.1. HTK 소스 압축 풀기                                                       5

      2.3.2. 환경 설정                                                                6

      2.3.3. 컴파일                                                                   7

3. 데이터 준비                                                                      10

   3.1. 단계 1.1 : 문법작성                                                           10

   3.2. 단계 1.2 : 발음사전작성                                                       12

   3.3. 단계 1.3 : 단어단위 전사파일 작성                                              13

   3.4. 단계 1.4 : 특징추출                                                           15

   3.5. 단계 1.5 : 훈련 및 테스트파일 목록 작성                                         17

4. 음소단위 인식기 훈련                                                              19

   4.1. 단계 2.1 : 특징추출 설정파일 변경                                              19

   4.2. 단계 2.2 : 모델 초기화                                                        19

   4.3. 단계 2.3 : 초기 모델 훈련                                                     22

   4.4. 단계 2.4 : sp 모델 작성                                                       24

   4.5. 단계 2.5 : sp 모델 출력                                                       25

   4.6. 단계 2.6 : 음성데이터 레이블링                                                 27

   4.7. 단계 2.7 : Mixture 증가                                                       28

   4.8. 단계 2.8 : sp Mixture 증가                                                    28

5. 트라이폰 단위 인식기 훈련                                                         29

6. 인식기 테스트                                                                    30

   6.1. 단계 4.1 : 인식기 평가                                                        30

   6.2. 단계 4.2 : 인식률 계산                                                        31

7. 실시간 음성인식 방법                                                              32

8. 부록 1 : 윈도우에서 HTK를 이용한 음성인식 방법                                     33

   8.1. 윈도우에서 HTK 설치 방법                                                     33

      8.1.1. 사용 환경                                                               33

      8.1.2. HTK 소스 압축 풀기                                                      33

      8.1.3. 환경 설정                                                               33

      8.1.4. 컴파일                                                                  34

9. 부록 2 : Vi 편집기 사용법                                                         37

   9.1. vi 실행 방법                                                                 37

   9.2. vi 실행 모드                                                                 37

      9.2.1. 입력 모드 전환 키                                                        37

      9.2.2. vi 명령 모드 키                                                          38

      9.2.3. ex 명령 모드                                                            39

10. 참고문헌                                                                        41


1. 서론

이 문서는 HTK(Hidden Markov Model Toolkit)를 이용한 연결숫자음인식기를 구현 방법을 기술한다. HTK는 HMM 기반의 음성 인식기를 구현하는 사실상의 표준 도구로서, 세계 대부분의 연구기관, 학교에서 사용되고 있다. 여기서는 리눅스가 설치되어 있는 PC에서 연결숫자음인식기를 구현하기 위한 절차를 설명한다. 특히 음성인식을 전공 한 사람뿐만 아니라 처음 접해보는 초보자도 쉽게 따라 할 수 있게 설치 및 인식절차를 자세하게 서술 하였다. 따라서 HTK를 통해 음성인식 시스템을 직접 체험 할 수 있고, 인식 시스템 이해와 흥미를 가질 수 있는 좋은 기회가 될 수 있을 것이다. 이 문서의 연결숫자음인식기 구현에 대한 구성은, 먼저 리눅스에서의 HTK 설치 방법, HTK를 이용한 연결숫자음인식기 훈련 및 테스트 방법, 실시간 인식기 구현방법 순으로 구성 하였다. 윈도우에서의 연결숫자음인식기 구현 방법 및 vi 에디터 사용법은 부록에 첨부하였다.


2. HTK 설치 방법

2.1. 사용 환경

  �� Server OS : WOWLINUX Release 7.3(paran R2)

  �� Client  OS : MS-Windows XP Pro
FTP Client Software, Telnet(X-Manager2사용)-Bash-Shell사용

2.2.

그림 2.1 Xmanager 초기 셋팅.

Xmanager 설치


 ① 세션 : 연결할 서버 이름

 ② 호스트 : 연결한 서버 주소

 ③ 프로토콜 : TELNET

 ④ 사용자 : 사용자 계정

 ⑤ 비밀번호 : 사용자 Password

 ⑥ 실행명령 : 접속시 사용할 터미널 환경설정
/usr/X11R6/bin/hanterm -ls -geometry 80x40+30+60 -display $DISPLAY
▶ Hanterm을 사용하고 위치는 80x40, 크기는 가로 30글자 세로 60줄




2.3. HTK 설치

2.3.1. HTK 소스 압축 풀기

우선 HTK 사이트 http://htk.eng.cam.ac.uk/ 접속하여 인증절차를 거처 로그인 한 후에 ‘HTK-3.2.1.tar.gz’ 파일을 최신 버전으로 다운로드 한다. 위 파일을 ftp client s/w를 사용하여 LINUX 서버의 루트 디렉터리로 전송한다. Windows 환경에서 UXIN로 접속하여 작업하기 위해 Xmanager 사용을 기준으로 설명할 것이다. 또한 명령 프롬프트에서도 접속하여 작업이 가능하다. 그림 2.2는 X-manager로 LINUX 서버에 접속한 telnet창이며, ls 명령어를 사용하여 ftp로 업로드 했던 ‘HTK-3.2.1.tar.gz’ 파일을 확인할 수 있다.

그림 1).2 telnet 에 처음 접속했을 때의 출력화면.

'tar' 명령어를 사용하여 'tar -xvzf HTK-3.2.1.tar.gz' 과 같이 실행하여 묶여 있는 HTK-3.2.1.tar.gz 파일을 풀어낸다.

그림 2.3 ‘tar -xvzf HTK-3.2.1.tar.gz' 를 실행한 출력화면.

그림 2.3 ‘tar -xvzf HTK-3.2.1.tar.gz' 를 실행한 출력화면.





그림 2.4 HTK-3.2.1.tar.gz 파일을 푼 후 새로 생성된 디렉터리의 내용.

그림 2.4와 같이 새로 생성된 htk 디렉터리의 내용을 'ls' 명령어로 확인해 보자.


2.3.2. 환경 설정

먼저 env 디렉터리로 이동하면 exp.linux 파일을 볼 수 있을 것이다. vi 에디터를 사용하여 일부 내용을 편집해야 한다. 다음과 같이 ‘vi exp.linux' 라고 입력한 후 모든 내용을 복사해서 .bashrc라는 파일에 붙여 넣어야 한다. 그러기 위해서는 다시 루트 디렉터리로 이동하여 마찬가지로 .bashrc의 내용을 편집해야 한다. ‘vi .bashrc’ 라고 실행 하면 그림 2.5와 같은 내용들을 확인 할 수 있는데 exp.linux 에서 복사했던 내용들을 하단부에 붙여 넣는다.

그림 2.5 'vi exp.linux' 를 실행한 출력화면.

그림 2.5 'vi exp.linux' 를 실행한 출력화면.


vi 에디터 사용방법은 부록2에 추가 하였으므로 참고 하기 바란다.

그리고 그림 2.6에서 마지막 행에 보이는 것과 같이 한 행이 추가 되었는데 컴파일 후에 PATH를 설정하기 위한 것이다. ‘$PATH‘ 는 사용자에게 설정되어 있는 PATH를 의미하고 ’$HOME‘ 는 사용자 홈 디렉터리를 의미한다. 모든 수정이 끝났으면 파일을 저장 후 vi를 종료한다. 여기서 잊지 말아야 할 것은 .bashrc 파일을 적용하기 위해서 반드시 ’source .bashrc‘ 라고 실행해야 한다.

그림 2.6 'vi .bashrc' 를 실행한 하단부 출력 화면.

그림 2.6 'vi .bashrc' 를 실행한 하단부 출력 화면.


2.3.3. 컴파일

이제 'htk/HTKLib/' 디렉터리로 이동해서 'make'라고 실행하면 컴파일 되는 것을 볼 수 있으며, 이것은 Makefile파일 안에 있는 컴파일 스크립트가 작동하여 컴파일 하는 것이다.

이번엔 ‘htk/HTKTools/' 디렉터리로 해서 'vi Makefile' 과 같이 vi 명령어로 'Makefile' 파일을 열어 Edit 작업한다. 'HBIN =./' 라고 작성해야 하는데 위치는 그림 2.7의 중앙부쯤에 보이는 것과 같은 위치에 작성한다. 저장 및 종료를 하고 현재 디렉터리에 'mkdir bin.linux' 라는 mkdir 명령어를 사용해 새로운 디렉터리 bin.linux 를 생성한다. bin.linux디렉터리에 컴파일한 파일들이 저장된다.

그림 2.7 HBIN = ./ 을 입력한 출력 화면.

그림 2.7 HBIN = ./ 을 입력한 출력 화면.


현재 디렉터리 HTKTools/ 에서 다시 한 번 컴파일을 해야 하는데 마찬가지로 명령어는 'make'라고 실행하면 되고 컴파일 되는 상태도 볼 수 있다. 컴파일 종료 후 ls 명령어를 사용해 디렉터리에 내용을 확인하자. 그림 2.8과 같이 새로 생성된 파일들은 HTK 실행 파일들이다.

그림 2.8 bin.linux 디렉터리 파일들을 출력한 화면.

그림 2.8 bin.linux 디렉터리 파일들을 출력한 화면.


위에서 PATH를 설정한 경로대로 bin.linux 디렉터리를 htk 디렉터리로 이동 시키기 위해서는 현재 HTKTools 디렉터리에서 ‘mv bin.linux ../’ 라고 실행 하면 모든 컴파일 작업 완료 된다. 그림 2.9는 컴파일이 완료된 디렉터리 상태를 보여 주고 있다.

또한, 올바른 실험환경을 구축 했는지 테스트 해보기 위해서는 실행파일을 실행시켜 볼 수도 있지만, 더 정확한 방법은 HTK 사이트에서 ‘HTK-samples-3.2.tar.gz’ 라는 파일 다운받아 'README.txt' 파일 내용 그대로 실시하여 올바른 실험환경을 확인 할 수도 있다.

그림 2.9 컴파일이 완료된 작업 디렉터리를 출력한 화면.

그림 2.9 컴파일이 완료된 작업 디렉터리를 출력한 화면.


         






3. 데이터 준비

본장은 인식기 훈련 전까지의 데이터 준비 단계로서 총 5단계로 데이터 특징 추출까지 실습하겠다. HTK 명령어를 입력하는 것을 보여줄 때, 프롬프트 앞부분을 생략하고 간단하게 $로만 나타내는 것을 주의하기 바란다. 또한 임의의 파일에 대한 여러 디렉터리를 보여주는데 단지 예일 뿐이며 자신의 계정 디렉터리에 따라 다르게 루트를 작성해야 한다.

bin.linux 디렉터리에 있는 내용은 PATH로 설정 되어있기 때문에 htk 디렉터리 어디서든 실행명령어를 사용 할 수가 있다. 따라서 새로운 디렉터리 ‘work'를 생성해 이곳에서 모든 작업을 실시하기로 한다.

단계를 거치면서 각 파일마다 편집을 요구하게 되는데, 위의 HTK 설치방법에서 사용하였던 vi편집기로 편집할 수 있다. 하지만, 음성 DB에 따라 몇 천개에 달하는 행을 일일이 작성해야 하는 경우도 있는데, 수작업으로는 불가능하므로 'perl' 프로그램을 사용하여 간단하게 작업을 완료할 수 있다. ‘perl' 프로그램의 자세한 내용은 관련 서적을 참고 하기 바란다.

음성 데이터베이스는 KAIST 통신연구실에서 제공한 한국의 연결 숫자음 데이터베이스이며, 샘플링 주파수가 16kHz인 연결 숫자음 발음 5169개의 데이터베이스를 사용하였다. Test는 성인  남여 각각 30명 17명으로 총47명의 DB를 사용하고, Train은 남여 60명 33명으로 총93명으로 구성해 인식 실험하였다.  

3.1. 단계 1.1 : 문법작성

단어 네트워크 준비 과정이며 'vi gram'라고 실행하여 새로운 ‘gram’ 파일이 생성 하고, 아래와 같은 내용을 사용자가 직접 입력한다. ‘wdnet’는 자동 생성 되는 파일이며, 다음 명령어를 실행한다. ‘gram' 파일에서 수직 바 ’|‘은 숫자 어느 것을 선택될 수 있는 병렬적인 구조를 나타낸다. ’SENT-BEG'와 ‘SENT-END'은 문장 ’시작‘과 ’끝‘을 말한다. 괄호’<>‘는 명시한 숫자들을 나타낸다. 완성된 문법은 그림 3.1과 같이 단어 네트워크로 서술될 수 있다.

HTK에서 한글을 사용하기 위해서는 네트웍을 만들거나 디코딩 할 때 config 파일을 필요로 하는데, 그 파일에 간단한 'NONUMESCAPES = T' 파라미터 하나만 셋팅해 주면 된다. 다음의 ‘config’ 파일에 주석 처리해 놓았으므로 확인하기 바란다.

HTK SLF(Standard Lattice Format)는 각각의 단어 사실과 각각의 word-to-word 변환은 명백하게 쓰인 것 이라고 불리는 저 레벨 표시법으로 사용되어 정의된 단어 네트워크를 실제로 요구한다. 이 단어 네트워크는 ’HParse‘ 툴을 사용한 문법으로 부터 자동적으로 생성되어 진다. 따라서 문법에 내포되어 있는 ’gram‘파일을 가정하여 실행한다. 아래 있는 'HParse' 명령어를 실행해 보자.

그림 3.2 에서와 같이 ‘gram' 파일 안에서 단어 네트워크에 대응하게 생성될 것이다.

$ HParse gram wdnet


gram

$digit = 일 | 이 | 삼 | 사 | 오 | 육 | 칠 | 팔 | 구 | 영 | 공 ;

(SENT-BEG<$digit>SENT-END)


wdnet

VERSION=1.0

N=16   L=36  

I=0    W=SENT-END           

I=1    W=공                 

I=2    W=!NULL              

I=3    W=영                 

I=4    W=구                 

I=5    W=팔                 

I=6    W=칠                 

I=7    W=육                 

I=8    W=오                 

I=9    W=사                 

I=10   W=삼                 

I=11   W=이                 

I=12   W=일                 

I=13   W=SENT-BEG           

I=14   W=!NULL              

I=15   W=!NULL              

J=0     S=2    E=0   

J=1     S=2    E=1   

J=2     S=13   E=1   

J=3     S=1    E=2   

J=4     S=3    E=2   

J=5     S=4    E=2   

J=6     S=5    E=2   

J=7     S=6    E=2   

J=8     S=7    E=2   

J=9     S=8    E=2   

J=10    S=9    E=2   

J=11    S=10   E=2   

J=12    S=11   E=2   

J=13    S=12   E=2   

J=14    S=2    E=3   

J=15    S=13   E=3   

J=16    S=2    E=4   

J=17    S=13   E=4   

J=18    S=2    E=5   

J=19    S=13   E=5   

J=20    S=2    E=6   

J=21    S=13   E=6   

J=22    S=2    E=7   

J=23    S=13   E=7   

J=24    S=2    E=8   

J=25    S=13   E=8   

J=26    S=2    E=9   

J=27    S=13   E=9   

J=28    S=2    E=10  

J=29    S=13   E=10  

J=30    S=2    E=11  

J=31    S=13   E=11  

J=32    S=2    E=12  

J=33    S=13   E=12  

J=34    S=15   E=13  

J=35    S=0    E=14 

그림 3.1 단어 네트워크.

그림 3.2 HParse command.


3.2. 단계 1.2 : 발음사전작성

발음사전작성은 요구하는 단어들에 대한 저장된 리스트를 만드는 단계이다. 각 사전의 일반적인 형식은,

WORD [outsym] p1 p2 p3 ....  이다.

단어 ‘WORD’는 음소 p1 p2 p3 의 순서대로 발음되어지는 것을 의미한다. 사각괄호‘[]’ 안에 있는 스트링은 단어가 인식될 때 출력 스트링을 말한다. 만약 그것이 생략되어 있으면 단어 그자체가 출력이 되고, 공백이라면, 출력이 없다는 것이다. ‘SENT-BEG’와 ‘SENT-END’는 문장 시작과 끝을 나타내어 발음으로서 묵음 모델 ‘sil’을 가지며, 출력은 null 이다.  발음사전 준비로서 vi로 ‘dict’파일을 생성해 다음과 같이 입력한다. 아래 'dict' 파일에서 '삼 s a m sp' 라고 작성한 것은 음소단위 숫자음 인식을 하기 위해서 다음과 같이 나열한 것이다. 참고로 단어단위 숫자음 인식을 위해서는 '삼 sam sp'라고 붙여 쓰면 되겠다. ‘sp’는 short-pause로서 의미 그대로 ‘짧은 멈춤’ 구간 이다. 즉, 단어와 단어 사이에 짧은 휴지 시간을 말한다.

dict

SENT-BEG [] sil

SENT-END [] sil

sil sil

일 i l sp

이 i sp

삼 s a m sp

사 s a sp

오 o sp

육 yu g sp

칠 ch i l sp

팔 p a l sp

구 g u sp

공 g o ng sp

영 yeo ng sp


3.3. 단계 1.3 : 단어단위 전사파일 작성

여기서 직접 작성해 주어야 할 것은 ‘words.mlf' 뿐이다. 보다시피, prompt labels은 경로 이름으로 변환 되어야 하며, 각 단어는 한 라인에 써야하고, 각 발성이 끝난 곳에는 마침표 ’.‘를 넣어 주어야 한다. 파일의 첫 째 라인은 Master Label File(MLF)을 정의한다. 이것은 완벽하게 전사파일이 내포 되어있는 단일 파일이다. MLF에서 사용되는 경로명은 실제 패턴을 가리킨다. HTK가 음성 파일들을 수행할 때, 그것은 같은 이름을 가진 전사파일을 찾는 것이지만, 확장할 때는 다르다.

그래서, 만약 '/home/shkim/htk/Speech/TEST/f/dfahh/dfahh000.wav' 파일이 프로세스 되었다면, ‘/home/shkim/htk/Speech/TEST/f/dfahh/dfahh000.lab‘이라 불리는 레벨파일을 찾을 것이다. MLF 파일이 사용될 때, HTK는 요구된 레벨 파일 이름과 대응하는 패턴 파일을 검색한다. 그러나 ’*‘가 어떤 문자 스트링과 대응되고, 예제에서 사용된 패턴은 독립된 효과를 나타낸다. 그러므로 다른 위치에 사용된 음성 데이터들이 다른 버전의 같은 전사로 사용되는 것을 허용하게 한다.

 단어 레벨 MLF가 생성된, 음소 레벨 MLF은 레벨 에디터 ’HLEd'로 사용하게 된다. 예를 들어, 위에 단어 레벨 MLP가 ‘words.mlf'안에 저장 되었다고 가정하면, 명령어는 다음과 같다.

$ HLEd -l '*' -d dict -i phones0.mlf mkphones0.led words.mlf


'-l' 옵션은 출력 패턴에서의 경로 ‘*’를 나타내고, ‘-d dict'는 dict 파일에서 발음사전을 읽어, EX명령이 사용될 때 레이블을 확장하는데 사용한다. ’-i mlf'는 출력 전사가 레벨 파일 'mlf'에 쓰는 것을 의미한다.

world.mlf

#!MLF!#

"/home/shkim/htk/Speech/TEST/f/dfahh/dfahh000.lab"

.

"/home/shkim/htk/Speech/TEST/f/dfahh/dfahh001.lab"

.

"/home/shkim/htk/Speech/TEST/f/dfahh/dfahh002.lab"

.

........


mkphones0.led

EX

IS sil sil

DE sp


EX(expand) 명령어는 사전파일 ‘dict’에 있는 발음과 일치하는 것을 ‘words.mlf'에 각각의 단어를 재배치한다. IS(insert) 명령어는 매 발성마다 시작과 끝에 묵음 모델 ’sil'을 삽입한다. 마지막에 있는 DE(delete) 명령어는 모든 short-pause 'sp' 레벨을 삭제한다.


phones0.mlf

#!MLF!#

"*/dfahh000.lab"

sil

p

a

l

yeo

ng

o

g

u

i

l

yu

g

sil

.

"*/dfahh001.lab"

sil

ch

i

l

ch

i

l

i

l

g

u

s

a

sil

.

........


3.4. 단계 1.4 : 특징추출

데이터 준비의 마지막 단계는 원음 음성 웨이브프롬을 특징 벡터의 순서 안에 파라미터로 나타낸다. HTK는 FFT와 LPC 모두 기반 분석을 지원한다. 여기에 FFT 기반 log spectra로 유도되어 Mel Frequency Cepstral Coefficients (MFCCs)를 사용될 것이다. 코딩이라 함은, 입력을 MFCC 벡터로 자동적으로 변환하는 HCopy 툴을 사용하여 수행하는 것을 말한다. 이것을 하기 위해서 ‘config' 파일은 변환 파라미터의 모든 명시가 필요하다. 간결하게 target 파라미터는 에너지 요소로서 Co를 사용하는 MFCC 이고, frame 주기는 10msec 이고, 출력은 성분 형식에 맞게 저장 되어야 한다. 그리고 crc checksum이 추가되어야 한다. FFT는 Hamming window를 사용하고 신호는 0.97 계수를 사용하는 첫 명령 preemphasis를 가져야 한다. filterbank는 26개의 채널과 12개의 MFCC 계수가 출력이 되어야 한다. 가변적인 ’ENORMALISE'는 디펄트가 true이고, 녹음된 오디오 파일에서 에너지 표준화를 수행한다. target 시스템은 live 오디오를 사용하기 위한 것이다. HCOPY 명령어 실행은, 각 소스 파일의 리스트와, 그것에 대응하는 출력 파일이 필요하다. ‘all.scp'가 그것을 나타낸다.

'all.scp'의 wav파일은 지정한 디렉터리에 위치하고 있어야 하고, 생성되는 mfc파일도 원하는 디렉터리를 미리 만들어 주어야 한다. 아래와 같이 특징벡터를 추출할 원본 데이터와 추출된 결과 데이터 이름을 병렬로 적어주면 된다.

파일을 내포하는 리스트 파일은 스크립트 파일로서 언급되고, 결정은 'scp‘ 확장으로 주어진다. 스크립트 파일은 표준 ’-S' 옵션을 사용하는 것으로 명시된다.

$ HCopy -T 1 -C config-hcopy -S all.scp


config-hcopy

SOURCERATE = 625           # Sampling Rate = 16 kHz

SOURCEFORMAT = NOHEAD   

SOURCEKIND = WAVEFORM   # WAVEFORM

TARGETRATE = 100000       # Windowing Shift = 10 ms

TARGETFORMAT = HTK      # HTK

TARGETKIND = MFCC_E  

ZMEANSOURCE = T            

WINDOWSIZE = 200000.0      # Window Size = 20 ms

USEHAMMING = T            # Hamming Windowing

PREEMCOEF = 0.97           # Preamphasis = 0.97

NUMCHANS = 20              # Number of Filter Bank Channels: recommended=23 

NUMCEPS = 12                 # Number of Cepstral Coefficients : usually = 12

CEPLIFTER = 22              # Cepstral Liftering : recommended = 22

ENORMALISE = F             # Energy Normalization

DELTAWINDOW = 2           # Delta/Delta-Delta coefficients window

SAVEWITHCRC = F

BYTEORDER = NONVAX

NONUMESCAPES = T          # For Hangeul processing


all.scp

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh000.wav    

/home/shkim/htk/Feature/TEST/f/dfahh/dfahh000.mfc    

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh001.wav 

/home/shkim/htk/Feature/TEST/f/dfahh/dfahh001.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh002.wav 

/home/shkim/htk/Feature/TEST/f/dfahh/dfahh002.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh003.wav 

/home/shkim/htk/Feature/TEST/f/dfahh/dfahh003.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh004.wav 

/home/shkim/htk/Feature/TEST/f/dfahh/dfahh004.mfc

........


그림 3.4 Hcopy command.



3.5. 단계 1.5 : 훈련 및 테스트파일 목록 작성

feature 추출된 결과 데이터를 train 파일은 ‘train.scp'로  test 파일은 ‘train.scp'라고 각각 명명한다. 위에 음성 DB를 설명할 때 언급한바 같이 train은 93명, 테스트는 47명, 총 5159개의 연결 숫자음의 DB를 사용 하였다. 따라서 train은 3440개의 음성, 즉 음성 개수만큼의 행을 생성 하면 될 것이다. 마찬가지로 test도 나머지의 음성 1729개의 행을 만들면 된다. 아래의 'train.scp'와 ’test.scp'를 참고하고, 디렉터리는 사용자에 맞게 지정해 주어야 한다.

train.scp

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash000.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash001.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash002.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash003.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash004.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash005.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash006.mfc

/home/shkim/htk/Speech/TRAIN/f/dfash/dfash007.mfc

........


test.scp

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh000.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh001.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh002.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh003.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh004.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh005.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh006.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh007.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh008.mfc

/home/shkim/htk/Speech/TEST/f/dfahh/dfahh009.mfc

........


4. 음소단위 인식기 훈련

이번 섹션에서는 잘 훈련된 단일 가우시안 모노폰 HMM의 생성에 대해 서술 할 것이다. 시작점은 평균과 분산이 모두 같은 모노폰 집합이 된다. 재훈련 될 때, sp 모델은 추가되고 묵음 모델은 확장 된다.  이 때, 모노폰들은 재훈련 되고, 사전의 일부분은 다양한 발음을 가진다. 그러나,  HLED가 음소레벨 MLF를 만들기 위한 단어레벨 MLF를 확장하는 데 사용될 때, 그것은 첫 번째 발음을 선택한다.

적당한 모노폰이 만들어 진 이후로, 인식기 툴 HVITE는 훈련 데이터의 'forced alignment'를 수행하는 데 사용된다. 즉, 새로운 음소 레벨 MLF는 음향적 증거에 의존한 발음을 생성한다. 이 새로운 MLF는 모노폰의 마지막 재평가를 수행하는 데 사용된다.

4.1. 단계 2.1 : 특징추출 설정파일 변경

특징 추출을 위한 설정 파일을 ‘config'와 같이 변경한다.

config

SOURCERATE = 100000

SOURCEFORMAT = HTK

SOURCEKIND = MFCC_E

TARGETRATE = 100000

TARGETFORMAT = HTK

TARGETKIND = MFCC_E_D_A_Z

ZMEANSOURCE = T

WINDOWSIZE = 200000.0

USEHAMMING = T

PREEMCOEF = 0.97

NUMCHANS = 20

NUMCEPS = 12

CEPLIFTER = 22

ENORMALISE = F

DELTAWINDOW = 2

SAVEWITHCRC = F

BYTEORDER = NONVAX

NONUMESCAPES = T


4.2. 단계 2.2 : 모델 초기화

HMM 훈련에서 첫 번째 스텝은 프로토타입 모델을 정의 하는 것이다. 이 모델의 파라미터는 중요하지 않고, 그것의 목적은 모델 토플로지를 정의하는 것이다. 각각의 특징 벡터의 길이는 39차이며, HMM 모델은 3 state의 left-to-right 로 설정한다. 여기서 39차의 의미는 정적 벡터(MFCC_0 = 13) + 델타 계수(13) + 가속도 계수(13)을 모두 더한 값이다. HTK 툴 'HCompV'는 데이터 파일을 조사 할 것이고, 전역 평균과 분산 값 그리고, 같은 평균과 분산을 갖는 HMM에서의 모든 가우시안을 계산한다. 모든 훈련 파일의 리스트는 ‘train.scp'파일에 저장 되었다고 가정하여, 아래와 같은 명령어를 실행한다.

$ HCompV -C config -f 0.01 -m -S train.scp -M hmm0 proto


평균이 0이고 단일 분산이면, 'hmm0' 디렉터리에 새로운 ‘proto' 파일이 생성 될 것이고, 위의 전역 음성 평균과 분산으로 부터 재정의 된다. HMM 프로토타입은 MFCC_O_D_A로서 파라미터 종류를 정의 한다 ('oh'가 아닌 ’zero'임에 유의).

‘HCompV'는 여러 가지 옵션을 가지고 있다. ’-f' 옵션은 ‘vFloors'라 불리는 여러 가지 floor macro를 발생시킨다. 아래의 ’varFloor'은 다음 단계에서 평가되어질 편차의 floor set에서 사용 되어질 벡터 값이다. '-m' 옵션은 평균값이 필요하다.  'sil'을 포함하는 각각 요구된 모노폰을 위해 다시 이름을 붙이고, 프로토타입을 복사해서 만들어진 모노폰 각각에 대한 복사본을 가진 MMF(hmmdefs라고 불린다)와 사전 hmm0에 저장된 새로운 프로토타입 모델이 주어지게 된다.

각각의 파일에 대한 에디터가 필요한데, 다음과 같이 따라해 보자. hmm0라는 새로운 디렉터리를 생성해야하며 훈련결과를 저장하는 디렉터리가 된다. 다음 명령어를 실행하려면 위에서 작성한 ‘train.scp' 파일과 여기서 작성하는 ’proto' 파일이 필요하며 hmm0 디렉터리에는 업데이트된 ‘proto' 파일과 ’vFloors' 라는 파일이 생성된다. 앞으로도 새로운 디렉터리를 만들어가며 계속 업데이트된 파일을 최종적으로 얻게 될 것이다. Linux 환경에서는 수작업을 편하게 할 수 있도록 작성된 프로그램이 있으며, 일반적으로 수작업으로 파일을 편집하고 있다.

만일, 주어진 데이터베이스에 사용된 monophones의 수가 sil 포함 모두 14개라면, 위의hmm0 디렉터리에 있는 proto 결과중 ~h ‘proto’ 부분의 proto를 각각의 monophone으로 바꾸고 모두 14개를 이어놓으면 hmmdefs이 된다. 이때 ~o을 포함한 처음 3줄은 제외시켜야 하며, 이 3줄은 vFloors 파일의 맨 처음 시작부분에 복사/포함시킨다. 이때 varFloor 는  ‘macros’로 이름을 바꾼다. 편집된 각 파일들은 다음과 같이 나열 하였다.


proto

~o

<STREAMINFO> 1 39

<VECSIZE> 39<NULLD><MFCC_E_D_A_Z><DIAGC>

~h "proto"

<BEGINHMM>

<NUMSTATES> 5

<STATE> 2

<MEAN> 39

-1.323271e-09 -3.649464e-09 7.621371e-10 5.555854e-09 -3.588745e-09 -6.260412e-09 2.652824e-09 -2.515157e-09 1.118080e-09 -5.640129e-10 8.762483e-10 7.176442e-10 1.834113e+01 2.370309e-02 1.417491e-02 2.330957e-02 1.424802e-02 1.529965e-02 2.058828e-02 1.109756e-02 4.361491e-03 9.609834e-04 -1.174028e-02 -9.849022e-03 1.170117e-03 1.061501e-02 -2.710617e-03 -3.016717e-03 -4.007452e-03 -6.173995e-04 -2.228994e-03 -1.920041e-03 -1.151150e-03 -3.325592e-04 1.291454e-03 1.723252e-03    2.082840e-03    4.363110e-04    -2.260872e-03

<VARIANCE> 39

3.922467e+01 3.469390e+01 5.757730e+01 5.811079e+01 4.666876e+01 3.753942e+01 3.935558e+01 3.533826e+01 3.803122e+01 3.424751e+01 3.164638e+01    2.151763e+01

........


varFloor

~v varFloor1

<Variance> 39

3.922467e-01 3.469390e-01 5.757730e-01 5.811079e-01 4.666876e-01 3.753942e-01 3.935558e-01 3.533826e-01 3.803122e-01 3.424751e-01 3.164638e-01 2.151763e-01 8.765900e-02 2.003058e-02 2.003152e-02 2.962882e-02 3.378824e-02 2.888997e-02 2.685643e-02 2.750625e-02 2.594367e-02 2.617251e-02 2.399169e-02 2.160116e-02 1.597385e-02 4.177385e-03 2.902057e-03 3.130759e-03 4.434302e-03 5.383763e-03 4.890393e-03 4.648606e-03 4.878893e-03 4.632448e-03 4.567801e-03 4.222652e-03    3.765465e-03    2.874190e-03    5.361866e-04


hmm0/macros

~o

<STREAMINFO> 1 39

<VECSIZE> 39<NULLD><MFCC_E_D_A_Z><DIAGC>

~v "varFloor1"

<Variance> 39

3.922467e-01 3.469390e-01 5.757730e-01 5.811079e-01 4.666876e-01 3.753942e-01 3.935558e-01 3.533826e-01 3.803122e-01 3.424751e-01 3.164638e-01 2.151763e-01 8.765900e-02 2.003058e-02 2.003152e-02 2.962882e-02 3.378824e-02 2.888997e-02 2.685643e-02 2.750625e-02 2.594367e-02 2.617251e-02 2.399169e-02 2.160116e-02 1.597385e-02 4.177385e-03 2.902057e-03 3.130759e-03 4.434302e-03 5.383763e-03 4.890393e-03 4.648606e-03 4.878893e-03 4.632448e-03 4.567801e-03 4.222652e-03    3.765465e-03    2.874190e-03    5.361866e-04


hmm0/hmmdefs

~h "sil"

<BEGINHMM>

<NUMSTATES> 5

<STATE> 2

<MEAN> 39

-1.323271e-09 -3.649464e-09 7.621371e-10 5.555854e-09 -3.588745e-09 -6.260412e-09 2.652824e-09 -2.515157e-09 1.118080e-09 -5.640129e-10 8.762483e-10 7.176442e-10 1.834113e+01 2.370309e-02 1.417491e-02 2.330957e-02 1.424802e-02 1.529965e-02 2.058828e-02 1.109756e-02 4.361491e-03 9.609834e-04 -1.174028e-02 -9.849022e-03 1.170117e-03 1.061501e-02 -2.710617e-03 -3.016717e-03 -4.007452e-03 -6.173995e-04 -2.228994e-03 -1.920041e-03 -1.151150e-03 -3.325592e-04 1.291454e-03 1.723252e-03     2.082840e-03    4.363110e-04    -2.260872e-03

<VARIANCE> 39

3.922467e+01 3.469390e+01 5.757730e+01 5.811079e+01 4.666876e+01 3.753942e+01 3.935558e+01 3.533826e+01 3.803122e+01 3.424751e+01 3.164638e+01    2.151763e+01

........


4.3. 단계 2.3 : 초기 모델 훈련

아래의 명령어를 실행하면, 모델리스트 ‘monophones0'에 나열된 hmm0안의 모든 모델들이 로드된다.('monophones1'은 short pause model이 줄어들게 된다.) 이 때 ‘train.scp'안에 열거된 데이터를 사용하여 재평가 되어지고 새로운 모델 셋은 ’hmm1' 사전에 저장된다. 파일의 대부분은 HEREST을 사용한다. 단, ‘macros’ 파일은 예외다. 이것은 global options macro라고 불리고, 편차 floor macro인 ‘varFloor'는 보다 먼저 나타난다. global options macro는 간단하게 HMM 파라미터 종류와 벡터 크기로 정의된다.

위의 예제에서, pruning은 보통 250.0이다. 만약 재평가가 어떤 특별한 파일도 아니라면, threshold는 150.0으로 증가될 것이고, 파일은 다시 프로세스 된다. 이것은 파일이 성공적으로 프로세스 되거나 pruning의 한계인 1000.0 넘을 때까지 반복된다. 이런 점에서, 훈련 파일에 심각한 문제가 있다고 해도 안전한 것이다.  ‘hmm0' 사전 안의 monophones 집합에 이르게 하는 프로세스가 그림 3.5에 나타나 있다.

’-t‘ 옵션은 훈련하는 동안 사용될 수 있는 pruning thresholds를 지정한다. pruning(가지)은 크기의 명령에 의해 요구되는 계산량을 줄일 수 있다.

HEREST는매번 단일 재평가를 수행한다. 각각의 새로운 HMM 셋은 새로운 사전에 저장된다. HEREST 실행은 두 번이상 반복되고, ‘hmm3'(처음부터 마지막까지의 monophone을 포함하는)가 생길 때까지 사전의 입력과 출력의 디렉터리명이 변한다.

Baum-Welch algorithm을 이용해서 3~5회 training 한다. 이전에 생성 되었던 hmm0 디렉터리에 ‘hmmdefs’, ‘macros’ 파일과 발음사전에 등록된 음소들의 나열인 ‘monophones0' 파일을 입력으로 사용하여 training 결과로 업데이트된 ’hmmdefs' 과 ‘macros' 파일을 얻을 수 있으며 새로만든 hmm1 디렉터리에 생성되며, 두 번째 training으로 hmm1에 있던 파일들은 입력으로 되고 다음 hmm2 디렉터리에는 업데이트된 파일들이 생성되다. 이렇게 training을 3~5회 실시하면 되겠다. 여기선 3회만 training 하여 최종 결과는 hmm3에 남아있게 된다.


$ HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm0/macros -H hmm0/hmmdefs -M hmm1 monophones0


$ HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm1/macros -H hmm1/hmmdefs -M hmm2 monophones0


$ HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm2/macros -H hmm2/hmmdefs -M hmm3 monophones0


monophones0

sil

i

l

s

a

m

o

yu

g

ch

p

u

ng

yeo


그림 3.5 HERest command.

그림 3.5 HERest command.




4.4. 단계 2.4 : sp 모델 작성

전 단계에서 각 음소를 위해 left-to-right 3 상태로 나타내었고, 묵음 모델 ‘sil'로 나타냈다. 다음 단계는 묵음 모델 안의 상태 4에서 2로, 상태 2에서 4까지에 대한 나머지 전사들을 추가 하는 것이다. 이 생각은 훈련 데이터에서 임펄스 노이즈를 제거하기 위한 개개의 상태들로 부터 더 강인한 모델을 만들기 위한 것이다. 또한, 상태 ’sp' 모델이 생성되는데, 이것을 ‘tee-model’이라고 한다. ‘tee-model’은 전체로부터 빠져나가는 직접적인 전사가 있다. 이 ‘sp'는 소리를 내는 상태가 묵음 모델의 중간 상태로 되는 것을 말한다. 두 묵음 모델에서 요구되는 토폴로지는 그림 3.6에서 보여준다.

새로운 ‘sp' 모델을 만드는 ’sil' 모델의 중간 상태를 복사하는 ‘hmm3/hmmdefs'에 문서편집기를 사용하고, 이것은 ’sp' 모델을 포함하여 새로운 사전 ’hmm4'안에 있다.

HMM 에디터인 HHEd는 'sil' 상태 중간에 ‘sp' 상태가 오게 하고, 요구되는 나머지 전사를 첨가하는데 실행한다.

HHEd는 HHEd와 유사하게 작동한다. HMM을 수정하기 위한 스크립트 안의 명령을 적용한다. 이것을 다음 명령어와 같이 실행시켜 볼 수가 있고 실행에 앞서 파일 편집을 다음과 같이 한다.

 Hmm3에 있던 최종 training 파일들을 이용하여 새로운 'sp' 모델을 만든다. hmm3의 ‘hmmdefs' 파일에서 'sp' 모델을 추가 시키는데 'sil' 모델을 복사하여 'sil' 을 ’sp'로 바꾸어 주면 된다. 바꾸어준 파일은 hmm4 디렉터리에 넣어주면 된다. 입력 파일 ‘monophones0’에 ‘sp'만 추가하여 새로운 ’monophones1'을 생성하며 'sil.hed'도 아래와 같이 만들어 준다. 다음 명령어 수행 결과 최종 값은 hmm5에 남아 있게 된다.


$ HHEd -H hmm4/macros -H hmm4/hmmdefs -M hmm5 sil.hed monophones1


monophones1

sil

sp

i

l

s

a

m

o

yu

g

ch

p

u

ng

yeo


sil.hed

AT 2 4 0.2 {sil.transP}

AT 4 2 0.2 {sil.transP}

AT 1 3 0.3 {sp.transP}

TI silst {sil.state[3],sp.state[2]}


위의 ‘sil.hed' 파일에서 AT 명령은 주어진 전사 행렬에 전사를 첨가하는 것이고, 마지막 TI명령은 ‘silst'라 불리는 tied-state를 생성한다. tied-state의 파라미터들은 ’hmmdefs' 파일에(각 묵음 모델안에) 저장되고, 본래의 상태 파라미터는 이 매크로 이름에 의해 재 배치 된다. 매크로는 HTK도구 파라미터 공유라는 매커니즘으로 간주될 수 있다. 여기서 음소 리스트는 변화시키는데 사용되는데, 이유는 새로운 ‘sp' 모델에 의해 확장된 본래의 리스트가 ‘monophones0'이기 때문이다. 새로운 파일 (monophones1 이라 불리는) 위의 HHEd 명령에서 사용된다.


4.5. 단계 2.5 : sp 모델 출력

그림 3.6 Silence Models.

그림 3.6 Silence Models.




그림 3.7 HHEd command.

그림 3.7 HHEd command.




음소 'sp' 모델을 Baum-Welch algorithm으로 2번 training 한다. 명령어의 자세한 기능은 단계 2.3에서 이미 다루었다.


$ HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm5/macros -H hmm5/hmmdefs -M hmm6 monophones1


$ HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm6/macros -H hmm6/hmmdefs -M hmm7 monophones1



4.6. 단계 2.6 : 음성데이터 레이블링

앞에서 보았듯이, 사전은 단어를 위해 다양한 발음을 가진다. 음소 모델은 훈련데이터를 재편성하는데 사용되고, 새로운 전사를 하는데, 이것은 HTK 인식 툴인 HVite를 실행한 것이다. 즉 다음과 같은 명령은 입력 단어 레벨 전사인 ‘words.mlf'를 새로운 음소 모델 전사 ’aligned.mlf'(사전 ‘dict'에 저장된 발음들을 사용하는)로 변환하는 hmm7에 저장된 HMM을 사용한다.

단계 1.3에서 HLEd로 수행되었던 본래의 word-to-phone 매핑 방법과 이 방법과의 차이점은, 여기서 인식기는 각 단어에 대한 모든 발음을 고려하며, 음향적 데이터와 가장 잘 대응되는 발음을 출력한다는 것이다.

‘-b’ 옵션은 각 발성의 처음과 끝에 묵음 모델을 삽입하는 것을 말한다.

‘-t‘ 옵션은 pruning 레벨을 250.0으로 한다.

’-o‘ 옵션은 소스를 출력 MLF에 단어 이름과 시간 경계를 프린트하는 데 사용되고, 새로운 음소 정렬이 생성된 이후로, HERest의 다른 2가지 방법은 hmm set 파라미터를 다시 재평가 하는데 사용된다.


$ HVite -l '*' -b sil -C config -a -H hmm7/macros -H hmm7/hmmdefs -i aligned.mlf -m -t 250.0 -y lab -I words.mlf -S train.scp dict monophones1


그림 3.8 HVite command.

그림 3.8 HVite command.





4.7. 단계 2.7 : Mixture 증가

State 2에서 4까지의 mixture 개수를 4개로 증가시킨다.


$ HHEd -C config -H hmm7/macros -H hmm7/hmmdefs -M hmm8 m2.hed monophones1


$ HHEd -C config -H hmm8/macros -H hmm8/hmmdefs -M hmm9 m4.hed monophones1


m2.hed

MU 2 {*.state[2-4].mix}


m4.hed

MU 4 {*.state[2-4].mix}


4.8. 단계 2.8 : sp Mixture 증가

이번엔 음소 'sp' 모델을 Baum-Welch algorithm으로 3번 training 한다.


$ HERest -C config -I aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm9/macros -H hmm9/hmmdefs -M hmm10 monophones1


$ HERest -C config -I aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm10/macros -H hmm10/hmmdefs -M hmm11 monophones1


$ HERest -C config -I aligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm11/macros -H hmm11/hmmdefs -M hmm12 monophones1


5. 트라이폰 단위 인식기 훈련


추후에 추가할 예정이다.

6. 인식기 테스트

인식기가 수행 되고나면 평가되어야 한다. 인식 네트워크와 사전은 구축되어졌다. 그래서, HTK 분석 툴인 REsults를 사용하여 결과를 평가할 것이다.

6.1. 단계 4.1 : 인식기 평가

'test.scp'가 코드화된 테스트 파일 목록을 연다고 가정해보자. 그 때 각각의 테스트 파일은 인식 될 것이고 다음과 같이 수행되는 ‘recout.mlf'라 불리는 MLF에 그것의 전사를 출력할 것이다.

‘-p’, ‘-s’ 옵션은 word insertion penalty와 grammar scale factor 셋에서의 옵션이다. word insertion penalty는 한 단어의 끝으로부터 다음 단어의 처음으로 전사될 때의 각 토큰에 추가된 적당한 값이다. 여기서 ‘test.scp' 입력, ‘recout.mlf'는 출력이다.

$ HVite -C config -H hmm12/macros -H hmm12/hmmdefs -S test.scp -i recout.mlf -w wdnet -p -8 -s 16 dict monophones1


recout.mlf

#!MLF!#

"/home/shkim/htk/Speech/TEST/f/dfahh/dfahh000.rec"

200000 2300000 팔 -1568.338623

2300000 3900000 이 -779.553528

3900000 7400000 영 -2250.353027

7400000 9700000 오 -1231.982422

9700000 13400000 구 -2550.474121

13400000 16500000 이 -1759.799316

16500000 18000000 육 -1071.074463

.

"/home/shkim/htk/Speech/TEST/f/dfahh/dfahh001.rec"

200000 2500000 일 -1539.162964

.

"/home/shkim/htk/Speech/TEST/f/dfahh/dfahh002.rec"

400000 3300000 이 -1706.323364

3300000 6100000 영 -1727.028931

6100000 7700000 육 -1263.290161

7700000 11700000 삼 -2791.517578

........



6.2.

그림 3.9 HVite, HResults command.

그림 3.9 HVite, HResults command.




단계 4.2 : 인식률 계산

SENT 부분은 1729개의 테스트 utterances중에, 1069(61.83%)개가 정확하게 인식되었다는 것을 보여준다.

WORD 부분은 단어 레벨 통계를 보여주는데, 총 단어 8872 중에서 8126(91.59%)가 인식되었음을 보여준다. 293개의 에러(D), 453개의 substitution error(S)와 113개의 삽입 에러(I)를 나타낸다. 90.32%의 accuracy figure는 correct 퍼센트보다 떨어진다. 왜냐하면, 나중에 삽입 에러는 무시해도 되기 때문이다.


$ HResults -I words.mlf monophones1 recout.mlf


그림 3.10 인식결과.


  

7. 실시간 음성인식 방법

다음은 실질적인 음성녹음으로 인식결과를 볼 수 있는 명령어로 'config.audio' 파일을 다시 작성해 주어야 한다.


$ HVite -C config.audio -H hmm12/macros -H hmm12/hmmdefs -p -8 -s 16 -w wdnet dict monophones1


config.audio

SOURCERATE = 625

SOURCEFORMAT = HTK

SOURCEKIND = HAUDIO


TARGETRATE = 100000

TARGETFORMAT = HTK

TARGETKIND = MFCC_E_D_A



WINDOWSIZE = 160000.0

USEHAMMING = T

PREEMCOEF = 0.97

NUMCHANS = 20

NUMCEPS = 12

CEPLIFTER = 22

ENORMALISE = F

DELTAWINDOW = 2

BYTEORDER = VAX

NONUMESCAPES = T


USESILDET = T

MEASURESIL = F

8. 부록 1 : 윈도우에서 HTK를 이용한 음성인식 방법

윈도우 환경에서 HTK를 이용한 음성인식 방법은 위에서 다루었던, LINUX 환경과 비교해서 컴파일 과정만 다르고 인식절차, 즉 3장의 ‘데이터 준비’부터는 모두 같은 방법으로 하면 된다.  편집기는 윈도우용 vi 편집기를 사용 하였다.

8.1. 윈도우에서 HTK 설치 방법

8.1.1. 사용 환경

OS는 마이크로 소프트의 Windows XP를 사용 하였고, 작업은 Dos나 명령 프롬프트를 사용 면 된다. 여기서는 명령 프롬프트 사용을 설명 하겠다.

8.1.2. HTK 소스 압축 풀기

LINUX 환경에서 설치한 것과 마찬가지로 우선 HTK 사이트 http://htk.eng.cam.ac.uk/에 접속하여 인증절차를 거처 로그인 한 후에 ‘HTK-3.2.1.tar.gz’ 파일을 최신 버전으로 다운로드 한다. 다운 받은 파일을 사용자가 원하는 디렉터리를 구성하여 압축을 푼다.

8.1.3. 환경 설정

윈도우 환경에서의 컴파일러는 Visual Studio C compiler를 사용 할 것이며, 미리 PATH 설정을 하기로 한다. PATH 경로는 ‘C:\Program Files\Microsoft Visual Studio\VC98\bin’과 같이 하며, PATH 설정된 경로에 있는 ‘NMAKE.EXE' 파일과 'VCVARS32.BAT'라는 실행 파일들로 컴파일을 할 수 있게 된다.

컴파일 마지막 준비 단계로 ‘bin.win32'라는 폴더를 만들어주어 컴파일 후에 HTK 실행 파일들이 저장될 공간을 만들어 준다. 아래와 같이 명령 프롬프트에서 ’mkdir bin.win32'라고 입력하면 폴더가 생성 될 것이다. 그림 8.1은 컴파일 전의 디렉터리 구성이다.

> mkdir bin.win32






그림 8.1 컴파일 작업 디렉터리 구성.

그림 8.1 컴파일 작업 디렉터리 구성.



먼저 HTKLib 디렉터리로 이동해야 하는데, ‘cd HTKLib’과 같이 입력한다. 그 디렉터리에서 ‘VCVARS32‘라고 입력한다. 실행 후에는 그림 8.2과 같이 ’Microsoft Visual C++툴 환경이 setting‘ 되었다고 문구가 떠야 한다.

> VCVAR32


그림 8.2 환경설정 setting 문구.

여기까지가 환경설정 단계라 할 수 있고, 다음은 컴파일 절차에 대해 설명하겠다.

8.1.4. 컴파일

그림 8.2처럼 ‘HTKLib' 작업 디렉터리에서 다음 명령어를 실행하면, 컴파일 되는 작업을 볼 수 있으며, 최종적으로 디렉터리에 ‘obj' 파일들이 생성된 것을 확인할 수 있다.

 > nmake /f htk_htklib_nt.mkf all

이번에는 ‘HTKTools’ 디렉터리로 이동하여 다음과 같이 실행한다. 결과 후 마찬가지로 ‘obj' 파일들이 생성 되었고, 새로 만든 ’bin.win32' 폴더에는 HTK 구동에 필요한 실행 파일들이 생성 되었다. 그림 8.3은 새로 생성된 실행 파일들의 목록을 보여주고 있다.

> nmake /f htk_htktools_nt.mkf all


‘HLMLib’ 폴더로 이동하여 다음 명령어를 실행한다.

> nmake /f htk_hlmlib_nt.mkf all


디렉터리 ‘HLMTools'에서 명령어를 실행한다.

> nmake /f htk_hlmtools_nt.mkf all

그림 8.3 실행 파일 목록.


이와 같이 각 명령어를 실행하면 각 폴더에 ‘obj' 파일을 생성하게 되고, ’bin.win32' 폴더는 실행할 수 있는 파일들이 생성된 것을 확인할 수 있을 것이다. 사용상 편의를 위해 실행파일이 있는 폴더를 PATH 설정하기 바란다.

지금까지가 윈도우에서 HTK를 사용하기 위한 HTK 컴파일 단계였으며, 다음 단계서부터는 LINUX에서 HTK 사용하기를 참조하기 바란다.


9. 부록 2 : Vi 편집기 사용법

이 문서에서는 모든 편집 작업을 vi 편집기로 사용하므로, 사용법 및 편집 명령어를 참고하여 편집 작업을 하기 바란다.

9.1. vi 실행 방법

커맨드 라인에서 다음과 같이 입력하면, 인자로 입력한 이름의 파일을 편집할 수 있다.

  $ vi 파일_이름... 


파일의 이름에는 다수의 파일 이름을 넣을 수 있으며, vi 내에서 :n 명령으로 다음 파일로 넘어 갈 수 있다.

9.2. vi 실행 모드

그림 9.1 vi 편집기 모드.

vi 에디터는 크게 명령 모드와 입력 모드로 나눌 수 있고, 명령 모드에는 vi 명령 모드와 ex 명령 모드가 있다. vi 시작할 때, vi 명령 모드로 시작하며, 특정키를 눌러, 입력 모드 및 ex 명령 모드로 전환할 수 있다. vi 명령 모드로 돌아오기 위해서는, Esc(Escape)키를 누르면 된다. 아래에, 입력 모드 및 명령 모드에서, 자주 사용되는 명령어를 나열 하였고, 실제로는 훨씬 다양한 명령들이 있다. 


9.2.1. 입력 모드 전환 키

실질적으로 문서에 글자를 입력하기 위해서는 명령 모드에서 입력 모드로 모드 전환이 이루어져야 한다. 이 때 사용할 수 있는 키가 여러 가지가 있는데, 여기서는 그것들에 대해 설명하겠다. 단순 입력 작업이 끝나고, 커서 이동이나 편집 작업 등을 하려고 할 때는 Esc키를 눌러서 입력 모드에서 빠져 나와야 한다. 

i : 현재 커서 위치에 글자 삽입이 가능해 짐, i 키를 누르고 난 이후에 쓰는 글은 커서 위치에 쓰게 된다.

I : 현재 줄 처음에 삽입.

a : 현재 커서 다음 위치에 추가.

A : 현재 줄 마지막에 추가.

o : 아래 줄에 추가.

O : 위 줄에 추가.

s : 현재 커서 글자 지우고 입력 모드로 전환.

r : 현재 커서 글자 지우고 한 글자 입력 받아 명령 모드로 돌아 감.

Esc : 입력 모드 또는 ex 명령 모드에서 vi 명령 모드로 전환, vi 명령 모드에서 Esc키를 누르면 삑 소리가 남.


9.2.2. vi 명령 모드 키

Esc키를 눌러서 들어 올 수 있는 모드이다. vi 에디터 시작할 때의 초기 모드이기도 하다. 키 앞에 숫자를 입력하면 그 명령이 숫자만큼 반복된다. 입력 모드에서 입력 작업 완료 후, 커서 이동이나 삭제, 복사, 붙여 넣기 등의 편집 작업 등을 할 때는 Esc키를 눌러 vi 명령 모드로 전환시킨 후에 해야 한다. 

커서 이동

h : 한 문자 왼쪽으로 커서 이동.(도스용이나 윈도우즈용 vi 에디터의 경우는 대부분, 커서 이동에 방향키를 사용할 수 있으나, 방향키가 없는 터미널 키보드에서 vi 에디터를 사용하기 위해서는 여기서 설명하는 키들을 알아둘 필요가 있다.)

j : 한 줄 아래쪽으로 커서 이동.

k : 한 줄 위쪽으로 커서 이동.

l : 한 문자 오른쪽으로 커서 이동.

w : 다음 단어 첫 문자로 커서 이동.

b : 이전 단어 첫 문자로 커서 이동.

Ctrl+f : 한 페이지 아래로 커서 이동.

Ctrl+b : 한 페이지 위로 커서 이동.

G : 마지막 줄로 커서 이동, 숫자G로 눌렀을 때, 숫자에 해당되는 줄로 커서 이동.

^ : 공백 문자가 아닌, 현재 줄의 첫 문자로 커서 이동.

0 : 공백 문자를 포함한, 현재 줄 첫 문자로 커서 이동.

$ : 현재 줄 마지막 문자로 커서 이동.

 

삭제 ≫ 

삭제된 것은 버퍼에 저장되므로 p나 P 명령으로 붙여 넣기가 가능함.

x : 현재 커서 위치 문자 삭제.

X : 현재 커서 위치 이전 문자 삭제.

dw : 현재 커서 위치 단어 삭제, 숫자dw로 쓰면 숫자만큼의 단어가 삭제됨, 다른 삭제 명령도 마찬가지로 숫자 입력 방식이 적용됨.

db : 현재 커서 위치 이전 단어 삭제.

dd : 현재 커서 위치 줄 삭제, 숫자dd로 쓰면 숫자만큼의 줄이 삭제됨.

d^ : 현재 줄에서 현재 커서 위치 이전 문자열 삭제.

d$ : 현재 줄에서 현재 커서 위치 이후 문자열 삭제.

D : d$와 같음.


 ≪ 복사, 붙여 넣기

여기서의 복사란, 버퍼로의 복사를 말하며, 실제로 붙여 넣기를 하려면 p나 P키를 눌러야 한다. 붙여 넣은 다른 방법은 원하는 위치에 커서를 이동시킨 후 마우스 왼쪽 오른쪽 버튼을 동시에 클릭하면 붙여 넣기가 되기도 한다.

yw : 현재 커서 이후 단어 복사, 숫자yw로 쓰면 숫자만큼의 단어가 복사됨, 다른 복사 명  령에도 이와 같은 숫자 입력 방식이 적용됨.

yb : 현재 커서 이전 단어 복사.

yy : 현재 줄 복사, 숫자yy로 쓰면 숫자만큼의 줄이 복사됨.

p : 복사된 항목을 현재 커서 위치 이후에 붙여 넣기, 삭제된 항목도 붙여 넣기 가능.

P : 복사된 항목을 현재 커서 위치 이전에 붙여 넣기, 삭제된 항목도 붙여 넣기 가능.

 

검색

/검색어 : 전진 검색.

?검색어 : 후진 검색.

n : 검색 반복.

N : 반대 방향 검색 반복.

 

되돌리기

u : 되돌리기(undo). u키를 계속 치게 되면, undo 버퍼가 빌 때까지 계속 되돌리기를 할 수 있음.

U : 라인 되돌리기. 한 줄에 대해서 모든 편집을 없던 것으로 하고 원상태로 되돌림.

Ctrl+r : Redo(undo)

 

기타

J : 커서 위치 아랫줄을 현재 줄에 붙임. 커서 이동의 j와 혼동될 수가 있으므로, 대소문자 구별에 유의해야 함.

. : 이전 실행 명령 반복. 같은 명령을 빠르게 반복하고자 할 때 유용함. 참고로, 문자열 입력 후, 명령 모드로 돌아와서 .을 입력하면 입력된 문자열이 커서 위치에 삽입됨.

ZZ : 현재 문서 저장하고, 종료하기.

 

9.2.3. ex 명령 모드

ex 라인 에디터의 명령어를 사용할 수 있다. vi 명령 모드 상태에서, : 키를 눌러서 들어가고, Esc키를 눌러서 다시 vi 명령 모드로 빠져나온다. 각각의 명령을 입력한 후, 실행을 하기 위해서는 엔터키를 누르면 된다.

시작줄번호,끝줄번호d : 시작줄번호에서 끝줄번호까지의 줄을 지움, 붙여 넣기 가능, 문서의 처음 줄은 1, 현재 줄은 . , 마지막 줄은 $로 지정 가능, 줄번호 입력 없이 d만 입력했을 경우에는, 현재 줄을 지움.

시작줄번호,끝줄번호y : 시작줄번호에서 끝줄번호까지의 줄을 복사.


시작줄번호,끝줄번호s/찾을문자열/바꿀문자열/g : 시작줄번호에서 끝줄번호까지 '찾을문자열'을 찾아 '바꿀문자열'로 바꿈, g를 사용하지 않으면, 한 줄에 '찾을문자열'이 여러 개 있더라도, 그 줄에 대해서는 한 번만 바꿔짐. 유닉스 정규 표현식을 써서 강력한 검색 및 치환이 가능함.


se nu : 줄 번호 표시.

n : 다음 파일 편집, vi 실행할 때 인자로 입력한 파일이 여러 개일 경우에 해당.

r 파일이름 : '파일이름'의 파일을 읽어 와서 현재 커서 아랫줄에 삽입.

sh : 쉘로 잠깐 빠져 나가기, 쉘에서 exit 치면, 다시 vi로 돌아옴. vi를 백그라운드로 돌려서(Ctrl+z), 쉘로 나가 다른 작업을 한 후, fg로 돌아오는 방법도 있음.

! 명령 : 밖으로 빠져 나가지 않고 바로 '명령'을 실행시킴.

w : 저장하기, w!로 쓰면, 강제로 저장하기.

w 파일이름 : '파일이름'으로 저장하기.

q : vi 종료하기, q!로 쓰면 강제로 종료하기.

wq : 저장하고, 종료하기. wq!로 쓰면 강제로 저장하고 종료하기.


≪ 파일 편집에 유용한 명령어를 예로 설명

표 9.1 파일 편집의 예.

입력

설 명

:1,10 co 50

1 줄부터 10 줄 까지를 50 줄 이후로 복사.

:34,50 d

34 줄부터 50 줄 까지 삭제.

:100,150 m 10

100 줄부터 150 줄까지를 10 줄 이후로 옮김.

:.,$ d

현재 줄부터 끝까지 지우기.

:1,30 s/old/new/g

1 줄부터 30 줄까지 old를 new로 바꾸기.

:g/pattern/ s/old/new/g

pattern이 있는 줄을 찾아서 old를 new로 바꾸기.

:1,30 s/his/the/gc

1 줄부터 30 줄까지 his를 the 로 바꾸면서 확인하기.

:g/BX/ s/Esc/ESC/g

 BX가 있는 줄만 찾아서 Esc를 ESC 로 바꾸기.

:% s/editer/editor/g

처음 줄부터 마지막 줄까지, editer를 editor 로 바꾸기.

:g/editer/ s//editor/g

위와 동일("s/" 다음에 인자가 없어서 윗줄과 같은 효과)

10. 참고문헌

[1]  Steve Young, The HTK Book, Cambridge University, 현재 버전 3.2

[2] 음성인식, http://speech.chungbuk.ac.kr/~owkwon/srhome/index.html

[3] vi 사용법,  http://cafe.naver.com/cygpg/89, http://www.vim.org/