2019. 8. 18. 21:59 ㆍ개발 이야기/머신러닝(딥러닝)
KALDI 툴을 설치해 보고 영어 음성인식을 테스트 해봤는데요!
이어서 우리가 사용하는! 우리에게 필요한 한국어 음성인식을 시도해보겠습니다
먼저 제로스 프로젝트에 대해서 말씀을 드릴게요
제로스 프로젝트는 KALDI 툴을 이용해서 구현된 한국어 음성 인식을 위한
오픈소스 프로젝트이며
회사 형태로 운영되고 있으며
굵직한 고객을 소유하고 있습니다
오픈소스는 역시 돈이 되는군요!
저도 이 프로젝트를 통해서 음성인식을 구현했는데요!
먼저 무료로 제공하는 음성데이터를 이용해서
토이(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 설치는
해당 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
export 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
여기서 중요한 것은 음성 파일의 세부 스펙인데요
잘모르시는 분은 위의 링크를 확인해주시구요!
자 칼디는 16bit의 16000hz의 스펙만 디코딩 지원을 하고 있는데요
때문에 스펙이 다르더라도 sox나 ,ffmpeg을 이용해서 스펙을 변경해줍니다
그렇게 알맞은 스펙으로 디코딩을 실시하면!
이런식으로 한글로 출력되는것을 확인할 수 있습니다!
자 여기서 #3 음성인식 KALDI 툴 설치
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) 수준의 음성인식 셋팅 방법이었구요
더많은 음성파일을 모아서 스크립트를 수정하시면
훨씬 좋은 결과물을 보실수 있습니다!
'개발 이야기 > 머신러닝(딥러닝)' 카테고리의 다른 글
#Back to basic 머신러닝이란? (0) | 2019.09.29 |
---|---|
#5 음성인식 노이즈 제거 (15) | 2019.09.20 |
#3 음성인식 KALDI 툴 설치 (12) | 2019.08.18 |
#2 음성인식 이해 (0) | 2019.08.10 |
#1 음성인식 기초(오디오 파일의 구조) (0) | 2019.08.10 |