#4 음성인식 KALDI 툴을 이용한 한국어 음성인식(zeroth project)

2019. 8. 18. 21:59 개발 이야기/머신러닝(딥러닝)

#1 음성인식 기초(오디오파일 구조)

#2 음성인식 이해

#3 음성인식 KALDI 툴 설치


 

KALDI 툴을 설치해 보고 영어 음성인식을 테스트 해봤는데요!

이어서 우리가 사용하는! 우리에게 필요한 한국어 음성인식을 시도해보겠습니다

 

먼저 제로스 프로젝트에 대해서 말씀을 드릴게요

 

 

제로스 프로젝트는 KALDI 툴을 이용해서 구현된 한국어 음성 인식을 위한 

 

오픈소스 프로젝트이며 

 

현재는 https://www.atlaslabs.ai/

 

아틀라스랩스 | Atlas Labs

아틀라스랩스는 음성인식 AI 솔루션을 통해, 기업에 맞는 제품과 서비스를 개발할 수 있도록 지원합니다.

www.atlaslabs.ai

회사 형태로 운영되고 있으며 

굵직한 고객을 소유하고 있습니다

 

오픈소스는 역시 돈이 되는군요!

 

저도 이 프로젝트를 통해서 음성인식을 구현했는데요!

 

먼저 무료로 제공하는 음성데이터를 이용해서 

 

토이(Toy) 수준의 음성인식 툴을 만들어 보겠습니다!

 

먼저 #3 음성인식 KALDI 툴 설치 를 진행한 후에 이어서 해주시기 바랍니다!

 

먼저 한국어다 보니 로케일 설정이 필요한데요! 사실 설정을 따로 안해줘도

 

러닝할 때 스크립트 내에 로케일 설정이 있기 때문에 안해줘도 무관한 것으로 판단 했으나!

 

저화 다른 환경에서 구현하고 계신분들도 분명히 ! 계시기 때문에 로케일 설정부터 진행 하겠습니다!

 

locale-gen ko_KR.UTF-8
vi /etc/default/locale

 

이렇게 UTF-8 한국어 모드로 로케일을 설정 해준 뒤!

 

패키지와 파이썬 모듈을 설치해줍니다!

 

python -m pip install awscli;
apt install unzip;
apt-get install flac;
apt-get install sox;
apt-get install sox libsox-fmt-mp3;
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py";
python get-pip.py;
python3 get-pip.py;
apt-get install gawk;


apt-get install parallel
add-apt-repository ppa:openjdk-r/ppa 
apt-get update
apt-get install g++ openjdk-7-jdk python-dev python3-dev
python3 -m pip install JPype1-py3
python3 -m pip install konlpy
apt-get install curl
bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

apt-get install libatlas-base-dev:i386 libatlas-base-dev

그리고 cuda를 설치해줄 껀데요! cuda 설치는 

 

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=deblocal

 

CUDA Toolkit 10.1 Update 2 Download

*/

developer.nvidia.com

해당 URL을 통해서 설치해주시면 됩니다!

 

그리고 가장 키포인트가 있는데요!

 

CUDA는 호환되는 GCC 버전이 존재합니다

 

우리가 보통 사용하게 될 9, 10 ,10.1 버전은

 

gcc-7, g++-7 버전을 설치해서 이용하면됩니다!

설정 방법은

////  cuda 설치 하고 지원하는 gcc, g++ 7.4이하 버전 꼭 맞춰놔야함///
sudo apt install gcc-7 g++-7

////  next, link them into your cuda stack///

sudo ln -s /usr/bin/gcc-7 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-7 /usr/local/cuda/bin/g++

 

이런식으로 설치 후 심볼릭 링크까지 걸어주시면 됩니다!

 

잊으시면 안되요!!

 


네 그리고 SRILM 을 설치할 껀데요!

 

이 SRILM은 라이센스 문제 때문에 홈페이지에 들어가서 라이센스 동의 후! 다운로드가 가능해요!

////  SRILM 설치 = http://www.speech.sri.com/projects/srilm/
//// Tools 디렉토리에 설치
$ mv srilm.tgz kaldi/tools
///  kaldi에 준비되어 있는 installer를 통해 설치
srilm-1.7.2.tar.gz
$cd kaldi/tools
$./install_srilm.sh

이렇게 설치를하려고 하면 분명히 에러가 날꺼에요!

이유는 단순하게 파일명이 안맞아서 그러는건데요!

vi /opt/kaldi/tools/install_srilm.sh

vi 명령어로 인스톨 스크립트를 열어보면

 

자 17라인과, 30 라인에 보면 이름이 

우리가 다운로드받은 srilm-1.7.2.tar.gz 과는 다르죠?

 

이름만 맞춰주고 다시 ./install_srilm.sh를 실행합니다!

그리고 대망의 zeroth 소스코드를 깃으로 가져옵니다

 

git clone https://github.com/goodatlas/zeroth

cd ./zeroth/s5

다운로드 받은 소스코드로 가서 이제 run_openslr.sh를 실행하면 되는데요!

 

그전에 빨간색으로된 심볼릭 링크를 정상적으로 되도록 수정해줍니다!

 

//// 먼저 잘못된 링크를 지우고!
rm steps utils

ln -s /opt/kaldi/egs/wsj/s5/steps steps
ln -s /opt/kaldi/egs/wsj/s5/utils utils

 요렇게!

 

아 그리고!!

vi 명령어로 path.sh 파일을 열어주고 KALDI_ROOT 의 경로를 설정해줘야 됩니다!

vi /opt/zeroth/s5/path.sh

 

KALDI_ROOT 변경 전

 

export KALDI_ROOT= 이 부분을 칼디를 설치한 경로로 변경해주세요!

KALDI_ROOT 변경 후

 

그리고 !!!! 

컴퓨터에 부착된 GPU 갯수를 확인하시고 맞는 갯수를 설정해줘야합니다

cd /opt/zetorh/s5

vi local/chain/run_tdnn_1n.sh

 

라인 30, 31 부분을 변경해줘야하는데요

num_jobs_initial은 처음에 몇개의 GPU를 이용할것인가?

num_jobs_final은 총 몇개까지 GPU를 이용할 것인가?

 

이런 컨피그입니다

이 부분을 GPU가 한개인 경우 둘다 1로 변경해주시면 됩니다!

그리고 혹시 GPU가 없으신 경우!

그런 경우에는 222 라인의 --use-gpu true를

false로 변경해주시면 되는데요!

 

gpu를 사용하지 않을경우 엄청나게 오랜시간이 걸리기 때문에 gpu를 사용하시는 것을 권장드립니다!

 

자 그러면 이제 실행!

// 우선 gpu를 사용하기 위해
nvidia-smi --compute-mode=3

// 저는 로그를 보고싶어서 nohup 명령어를 이용해서 실행을 했습니다

cd /opt/zeroth/s5

// 실행 부분
nohup ./run_openslr.sh

// 일시 정지
ctrl + z (컨트롤 키와 Z를 눌러 일시정지를 한 후!)

// 백그라운드 실행
bg

// ssh 쉘이 끊어저도 동작하도록 실행 소유권을 없애줍니다
disown

// 소유권이 잘 없어졌는지 확인 
jobs
// 아무것도 안나오면 정상동작


// 로그 보는 방법은 
tail -f ./nohup.out

 

 

이렇게 되면 9기가 정도의 음성데이터를 다운로드 받아 러닝이 진행되는데요

정상적으로 끝나게되면 

이런 로그를 만나게 됩니다!

저는 처음에 이 로그를 보고 굉장히 신났었어요 !

 

자그럼 사용을 해볼껀데요!

끝은 났는데 결과물이 어딨는지 절대 처음에는 모르실거에요

cd /opt/zeroth/s5/local
vi export.sh

export.sh을 이용해서 결과물을 가져올 것데요 스크립트가 짧기 때문에

한번 보시면 금방 사용하실 수 있습니다!

딱 보니 /home/ubuntu/_prjs_ 이부분을 우리가 설치한 경로로 변경해줘야할것같이 생겼죠?

변경후 추출할 경로로 파라미터를 넣어 실행하면 됩니다!

 

 

그러면 어떻게 실행하냐?

같은 위치에 

vi decode.sh

decode.sh 파일이 존재하는데요 이 스크립트를 이용해서 디코딩을 진행합니다.

 

저는 사용상 편의를 위해 조금 수정해서 사용하는데요 

원래는 

이렇게 되어 있는 부분을 

이렇게 변경해서 디코딩 하고자 하는 음성 파일만 파라미터로 받아서 실행합니다!

 

이렇게 실행

cd /etc/zeroth/s5

cp ./local/decode.sh ./

./decode.sh 변경하고자 하는 파일의 파일명.flac

여기서 중요한 것은 음성 파일의 세부 스펙인데요

#1 음성인식 기초(오디오파일 구조)

잘모르시는 분은 위의 링크를 확인해주시구요!

자 칼디는 16bit의 16000hz의 스펙만 디코딩 지원을 하고 있는데요

 

때문에 스펙이 다르더라도 sox나 ,ffmpeg을 이용해서 스펙을 변경해줍니다

 

그렇게 알맞은 스펙으로 디코딩을 실시하면!

 

이런식으로 한글로 출력되는것을 확인할 수 있습니다!

 

자 여기서 #3 음성인식 KALDI 툴 설치 

 

#3 음성인식 KALDI 툴 설치

#1 음성인식 기초(오디오파일 구조) #2 음성인식 이해 지난번에 소개했던 wFST 기반의 음성인식 툴 KALDI의 간략한 소개와 함께 설치 방법에 대해서 알아보자! Kaldi 이름의 유래? 칼디는 원래 커피 식물을 발견한..

bourbonkk.tistory.com

KALDI 툴 설치할 때 말씀드렸던 메모리 필요 부분에 대해서 말씀드릴껀데요

메모리가 왜 60GB나 필요한가

 

그것은 #2 음성인식 이해 에서 설명드렸던

 

N-grams의 영향인데

run_openslr.sh를 열어봤을때 

이렇게 tglarge, fglarge 의 러닝 부분이 있습니다

 

3-grams, 4-grams 차이인데요 

당연히 숫자가 낮아질 수록 낮은 사양이고 낮은 음서인식률을 보여줍니다.

3-grams로 설정을하면 메모리는 약 28G

4-grams로 설정을 하면 메모리는 약 56G 

소요되는 것을 확인했습니다.

 

이부분에 대해서는 

https://groups.google.com/forum/#!forum/zeroth-help

제로스 헬프 포럼에 검색하시면 금방 찾아보실수 있는데요!

저는 이부분을 잘 몰라서 맨땅에 헤딩하느라 조금 많은 시간을 소요했었습니다

 

다른 분들은 맨땅에 헤딩하지 마시고 꼭! 본인이 가지고 있는 PC 스펙을 맞춰서 진행하시길 바랍니다!!

 

이상으로 토이(Toy) 수준의 음성인식 셋팅 방법이었구요

 

더많은 음성파일을 모아서 스크립트를 수정하시면

훨씬 좋은 결과물을 보실수 있습니다!