Skip to content

Docker, 음성인식 AI, FastAPI 기반 한국어 발음 교정 시스템

License

Notifications You must be signed in to change notification settings

DevTae/SpeechFeedback

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SpeechFeedback

End-to-End ASR (Automatic Speech Recognition) Feedback System

IPA 변환을 통하여 발음 그대로 인식하도록 하고 그에 대한 발음 피드백을 진행할 수 있도록 하는 것이 목표이다.

KoSpeech 툴킷 : sooftware/kospeech 을 활용하여 프로젝트를 진행하였다.

Baidu Research – Silicon Valley AI Lab, Deep Speech 2: End-to-End Speech Recognition in English and Mandarin, Computation and Language, Dec 2015

  • 다음 논문에서의 모델 구조를 참고하였습니다.

장민정, 정선진, 노준용, 한국어 동시조음 모델에 기반한 스피치 애니메이션 생성, 컴퓨터그래픽스학회, Jun 2020

  • 다음 논문에서의 혀 모델 시각 자료를 활용하였습니다.

Contents

  1. Folder Structure
  2. Environment Setting
  3. Docker Image
  4. How to done Preprocessing (IPA and Character Dictionary)
  5. Model Architecture
  6. How to train Deep Speech 2 model
  7. How to evaluate Deep Speech 2 model
  8. How to inference the audio file using Deep Speech 2 model
  9. Performance After Using IPA
  10. ETC


Folder Structure

📦SpeechFeedback
 ┣ 📂docs
 ┣ 📂feedback       // 음성 피드백 기능 시연을 위한 클라이언트 코드
 ┣ 📂kospeech
 ┃ ┣ 📂bin          // 모델 학습, 평가, 추론 함수가 있음. FastAPI 서버로 음성 피드백 정보 제공.
 ┃ ┣ 📂configs      // 모델 하이퍼파라미터 설정
 ┃ ┣ 📂dataset
 ┃ ┃ ┗ 📂kspon      // 데이터셋에 대한 전처리 작업공간
 ┃ ┣ 📂docs
 ┃ ┣ 📂kospeech
 ┃ ┗ 📂test
 ┣ 📂preprocess     // 데이터 전처리를 위한 코드 꾸러미 (kospeech 폴더에는 이미 반영됨)
 ┗ 📂data           // 해당 디렉토리에 KsponSpeech 데이터셋 다운

Environment Setting

  • 실험 환경
    • Docker Image : devtae/kospeech
    • OS : Linux 5.4.0-148-generic x86_64
    • CPU : 12th Gen Intel(R) Core(TM) i9-12900K
    • GPU : (NVIDIA GeForce RTX 4090 24GB) X 2
    • CUDA version : 12.0
    • PyTorch version : 1.9.0+cu111

Docker Image

KoSpeech (Using CUDA 12.0) : https://hub.docker.com/r/devtae/kospeech

  1. sudo docker run -it --gpus all --name devtae -v {하위 디렉토리}/한국어\ 음성:/workspace/data devtae/kospeech

    • 공유 디렉토리 기능을 사용하여, {하위 디렉토리}/한국어\ 음성 폴더에 있는 파일들이 /workspace/data 과 연동된다.
    • 원활한 공유 디렉토리 설정을 위하여 데이터셋 다운로드 후에 수행하는 것을 추천한다.
  2. Docker 이미지 내에서 작업하기 위해 다음 명령어를 입력한다.

    • sudo docker attach devtae
    • exit
    • sudo docker restart devtae && sudo docker attach devtae
    • (선택) 한글 지원을 위하여 다음 명령어를 입력
      • apt-get update && apt-get install language-pack-ko
      • vi ~/.bashrc 의 맨 아래에 export LANG="ko_KR.UTF-8" 추가
      • vi ~/.vimrc 아래에 set encoding=utf-8 추가
      • bash 를 통하여 터미널 재접속
  3. 현재 레포를 clone 하여 kospeech 폴더를 workspace 폴더 안에 넣고 작업을 진행한다.


How to done Preprocessing (IPA and Character Dictionary)

  • 음성 데이터 수집 및 전처리

  • AIHub 데이터셋 전처리에 대한 툴을 바탕으로 전처리 과정을 쉽게 진행할 수 있다.

    • DevTae/AIHubSpeechPreprocessingTool
    • git clone https://github.com/DevTae/AIHubSpeechPreprocessingTool.git 를 진행하고 README.md 의 메뉴얼을 바탕으로 전처리를 진행한다.
    • /workspace/data 디렉토리의 aihub_labels.csvtranscripts.txt 파일을 바탕으로 학습을 진행한다.
  • 해당 레포에 있는 코드는 Training 데이터에 대해서만 전처리하는 것이며, Evaluation 데이터를 이용하지 않는다. 따라서 별 다른 수정 없이 사용한다면, Training 에서 원하는 데이터들을 바탕으로 transcripts 를 형성시키고, 그 중에서도 일부를 떼어내 따로 evaluation 용 transcripts_test.txt 파일을 만들어 사용하면 된다.

  • 현재 적용된 한국어 IPA 변환 결과에 맞는 후처리 스크립트를 적용한 상태이니, 한국어가 아닌 외국어를 학습하거나 다른 IPA 변환 툴을 사용한다면 SpeechFeedback/kospeech/kospeech/vocabs/ksponspeech.py 에서 self.sanitize 함수를 제거해서 사용하면 된다.


Model Architecture

  • Deep Speech 2 모델 구조

    • 3-Layer CNN
      • 다음 링크의 메뉴얼을 바탕으로 2-Layer CNN 에서 3-Layer CNN 으로 수정할 수 있음
    • Bi-directional GRU Layer x 7
      • RNN 레이어 수는 하이퍼 파라미터 튜닝에서 설정 가능
    • Fully Connected Layer x 1
    • Batch Normalization
      • 모든 레이어에 momentum=0.99 으로 설정
    • CTC Loss
    • 현재 저장소에는 2-Layer CNN + Bi-directional GRU Layer x 3 으로 구성되어 있음
  • 하이퍼 파라미터 튜닝

    • Baidu Deep Speech 2 Paper 를 바탕으로 하이퍼 파라미터 튜닝을 진행함.

How to train Deep Speech 2 model

  1. KoSpeech/kospeech/data/data_loader.py 에서 train, validation 데이터 수를 설정한다. (transcripts.txt 파일에서의 데이터 수)

    • 만약 train : validation : test 비율을 설정하고자 할 때는, train+validation 만큼 transcripts.txt 에 있도록 하고, 나머지 test 만큼 transcripts_test.txt 에 있도록 한다.
    • train 과 validation 데이터 개수는 data_loader.py (kspon) 에서 설정한다.
  2. python ./bin/main.py model=ds2 train=ds2_train train.dataset_path=/workspace/data 를 실행한다.

  • (optional) CTC Loss 계산식에서 nan 이 뜨는 것을 방지하고 싶다면 데이터 보정하이퍼 파라미터 수정을 하거나 torch.nan_to_num(outputs) 함수를 이용한다.
    • torch.nan_to_num(outputs) 의 경우, 다음 코드와 같이 바꾸면 된다.
    # in kospeech/kospeech/trainer/supervised_learning.py:454L
    ...
    elif architecture in ('deepspeech2', 'jasper'):
        outputs, output_lengths = model(inputs, input_lengths)
        outputs = torch.nan_to_num(outputs)
        loss = self.criterion(outputs.transpose(0, 1), targets[:, 1:], output_lengths, target_lengths)
    ...

How to evaluate Deep Speech 2 model

  • 아래 코드를 바탕으로 평가를 진행한다.

  • python ./bin/eval.py eval.dataset_path=/workspace/data eval.transcripts_path=/workspace/kospeech/dataset/kspon/transcripts_test.txt eval.model_path=/workspace/kospeech/outputs/{date}/{time}/model.pt

    • Greedy Search 진행

How to inference the audio file using Deep Speech 2 model

  • 아래 코드를 바탕으로 해당 오디오 파일에 대하여 추론을 한다.

  • python3 ./bin/inference.py --model_path /workspace/kospeech/outputs/{date}/{time}/model.pt --audio_path /workspace/data/{sub_path}/{audio_file}.wav --device "cpu"


Performance After Using IPA

23 7 20 aihub_labels csv

  • 단어사전 경우의 수(출력층)를 2000 → 44 개로 축소할 수 있었다.
  • IPA 문자 형태에 맞게 최소 단위로 나뉠 수 있도록 전처리 진행하였다.

image

23 6 20 Feedback GUI System


ETC

데이터 종류에 따른 성능 개선

  • 원본 데이터를 직접 들어본 결과, 강의의 오디오를 바탕으로 만든 데이터셋으로 잡음 및 오디오의 전체적인 톤이 높았다.
  • 따라서, 한국인 대화음성에서 한국어 음성으로 바꾼 결과, 오디오가 일반인 대화에 적용하기에 더욱 적합함을 확인할 수 있었다.

데이터 라벨링 개수 추가 확보에 따른 성능 개선

  • 이전에는 표준발음 변환기 사이트에서 데이터 수집을 진행하였는데, 사이트 트래픽 문제로 약 1 만 개의 데이터 밖에 훈련에 적용할 수 없는 상태였다.
  • 따라서, 1 epoch 에 대하여 학습되는 양(batch_size=32 기준으로 step size 가 625 개)이 적었다.
  • GitHub 에 publish 된 R 코드(stannam/hangul_to_ipa)를 바탕으로 IPA 변환해주는 파이썬 스크립트로 변환하였고 데이터 수를 1 만 개에서 60 만 개까지 늘릴 수 있었다.
  • 그 결과 1 epoch 에 대한 step size 가 37500 개로 약 60배 커졌고 동일 epoch 에 대하여 CER 이 향상될 수 있었다.

CNN 및 RNN 레이어 수 상승을 통한 성능 개선

  • Deep Speech 2 논문에 있는 내용을 바탕으로 모델 구조를 적용하고자 하였는데, KoSpeech 의 기본 구조는 CNN * 2, RNN * 3 으로 구성되어 있었다.
  • Baidu 의 Deep Speech 2 논문에 따르면 CNN * 3, RNN * 7 가 성능이 좋다는 것을 찾을 수 있었다.
  • 발음 피드백 시스템 적용을 위하여 심층적인 모델이 필요하다고 판단하였고, 이를 적용하기 위해 코드를 수정할 수 있었다.
  • 그 대신, 레이어가 겹쳐질수록 모델의 복잡성이 올라가 학습 속도가 현저히 느려지므로 해당 trade-off 관계에서 적당한 설정으로 접근하고자 하였다.

momentum 계수 수정을 통한 학습 성능 개선

  • Deep Speech 2 논문 내용을 바탕으로 모든 BatchNorm 에 대하여 momentum 계수를 0.99 으로 적용하는 것을 알 수 있었다.
  • 하지만, KoSpeech 의 momentum 계수 기본 설정은 0.1 이었고, 이에 따라, 모든 BatchNorm 에 대하여 momentum 계수에 0.99 를 적용할 수 있었다.
  • 이러한 결과로 기울기에 이전 관성이 적용되어 local minima 현상을 억제할 수 있었으며 CER 감소 추세가 보다 linear 하게 바뀐 것을 확인할 수 있었다.

warmup step 설정을 통한 local minima 현상 개선

image

(사진 출처 : sooftware/pytorch-lr-scheduler)

  • adam optimizer 를 바탕으로 한 학습 초반에는 local minima 가 발생할 확률이 높다. (너무 성큼성큼 움직여서)
  • 이러한 이유로 KoSpeech 에서는 학습 초반의 learning rate 를 조절하는 warmup step 방식인 TriStageLRSchedule 를 적용하였다.
  • TriStageLRSchedule 스케줄러 알고리즘의 코드를 바탕으로 전체 학습에 대하여 처음부터 정해진 단계만큼 warmup 을 하고 절반까지 최댓값을 유지했다가 이후부터는 learning rate 가 감소하는 방식임을 알 수 있었다.
  • 해당 스케줄러의 warmup 설정 관점을 보아하니 적어도 전체 step size 의 10%만큼은 warmup step 으로 설정해야겠음을 느꼈고 이를 적용해보았다.
  • 그 결과, 이전에 대비하여 학습 초반부터 높은 loss와 CER 값에 수렴하는 local minima 를 개선할 수 있었다.
  • (23.8.26) 추가적으로, warmup step 을 너무 높게 설정하는 것이 오히려 학습 저하를 일어킬 수 있다. 적당한 수치를 찾는 것이 중요하다. 따라서, 10% 가 아닌 constant 하게 1000 등의 수치를 적용하는 방법으로 접근할 수 있다.

About

Docker, 음성인식 AI, FastAPI 기반 한국어 발음 교정 시스템

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages