본문 바로가기

TechTrend

Teachable Machine과 TFLite를 활용한 음성인식 모델 만들기

December 02, 2020

본 게시글은 TensorFlow 개발자 Khanh LeViet에 의해 포스팅된 글을 번역하였습니다.

 

음성 분류는 강아지 짖는 소리, 자동차 경적 소리와 같이 미리 정해놓은 카테고리에

분류할 몇몇 소리들을 넣어주어야 하는 머신러닝 작업이다.

 

예시로는 불법적으로 삼림을 불태우는 활동을 감지한다거나,

고래의 자연스러운 행동을 더 잘 이해하기위해 울음소리를 추적하는 등의 프로그램들이 많이 있다.

 

우리는 'Teachable Machine'으로 음성 분류모델을 학습시키고,

TFLite 형식으로 추출할 수 있다는 소식을 전하게 되어 기쁘다.

 

이제 모바일앱이나 IoT디바이스에 TFLite 모델을 적용시킬 수 있다.

이 방법은 음성 분류를 빠르게 만들어 실행시켜 볼 수 있는 정말 쉬운 방법이다.

또, 만든 모델을 파이썬을 통해 확인볼 수도 있다.

다음 단계에서는 TFLite로 추출하는 것도 알아보자.

 

  • 모델의 구성

 

 

이 모델은 1초 짜리 음성을 분류할 때 사용되는 작은 합성곱신경망이다.

그림에서와 같이 이 모델은 spectrogram을 받아서

Conv2D과 Max Pooling으로 이루어진 연속적인 Layer를 지난다.

그리고 끝에는 학습중에 오버피팅을 줄이기 위한 목적으로

dropout Layer들이 배치된 다수의 Dense Layer가 있다.

마지막으로 출력은 인식하도록 학습된 각 클래스들 중에 하나를 나타낼 수 있는

확률값으로 이루어진 배열이다.

 

여기에 가면 파이썬으로 위에서 구성한 모델처럼 자신만의 모델을 학습시킬 수 있는 튜토리얼이 있다.

 

  • 자신의 데이터셋으로 학습시키기

아래와 같이 두 가지 방법이 있다.

 

간단한 방법 : Teachable Machine을 사용하면 코드 한 줄 안 쓰고 전부 브라우저로

데이터를 수집하고 학습할 수 있다.

그래서 프로토타입을 빨리 만들어보고 싶을 때 유용하다.

 

로버스트(Robust)한 방법 : 미리 학습데이터를 녹음하고, 파이썬을 통해 학습시키고 검증해라.

물론 이 방법이, 코드로 작성하기 때문에 미리 작성된 스니펫이 있다면

앞서 소개드린 간단한 방법보다 덜 수고롭다.

( Rorust : 특정 값이 영향을 많이 받지 않게 한다는 통계학적 용어다. )

 

  • Teachable Machine을 통해 모델 학습시키기

 

Teachable Machine은 데이터셋을 생성하거나 이미지, 포즈, 소리 분류를 포함한

몇 가지 머신러닝 모델을 학습할 수 있는 그래픽 환경을 제공한다.

 

Teachable Machine은 모델을 학습시킬 때 내부적으로 TensorFlow.js를 사용한다.

그래서 웹 브라우저에 TensorFlow.js 형식으로 배포할 수 있고,

IoT 디바이스나 모바일 앱에 TFLite 형식으로 배포할 수 있다.

 

모델을 학습시키기 위한 단계

1. Teachable Machine 사이트에 방문한다.

2. 오디오 프로젝트를 생성한다.

3. 인식하길 원하는 각 카테고리에 클립을 기록한다.

각 카테고리에 음성데이터들을 8초여야 한다.

4. 학습을 시작하고, 끝이 나면 바로 테스트 해볼 수 있다.

5. TFLite 형식으로 배포해보자.

 

  • Python을 통해 모델 학습시키기

학습할 데이터셋이 크거나, 녹음 파일이 몇 시간짜리 또는 많은 카테고리를 가지는데,

웹 브라우저로 학습한다면 아마 많은 시간이 걸릴 것이다.

그런 경우, 미리 학습데이터를 모으고 WAV형식으로 전환하여

Colab notebook을 사용해서 모델을 학습시켜라.

Google의 Colab은 무료 GPU를 제공하기에 

상당히 빨리 학습시킬 수 있을 것이다.

 

  • TensorFlow Lite로 안드로이드 모델 배포하기

TFLite 음성 분류모델의 학습을 마쳤다면,

테스트를 위해 간단한 안드로이드 샘플 앱에 넣어볼 수 있다.

 

다음 단계를 보자.

 

1. 깃헙으로부터 샘플앱 가져오기

git clone https://github.com/tensorflow/examples.git

 

2. Android Studio에서 sound classification Android app 불러오기

'lite/examples/sound_classification/android'

위 경로로 프로젝트를 연다.

 

3. 'soundclassifier.tflite'(내가 학습시킨) 와 'labels.txt'(내가 학습시킨)를 둘 다 

'src/main/assets' 경로에 추가해 준다.

아마 이미 예시모델이 있는데 덮어써야 할 것이다.

 

4. 이제 빌드를 하고 디바이스에 배포하면,

이제 실시간으로 분류할 수 있을 것이다.

 

 

이를 입맛에 맞게 다루기 위해서는 샘플 앱과 TFLite model로부터

'SoundClassifier.kt'클래스를 자신의 앱에 복사해야한다

그러면 아래처럼 모델을 사용할 수 있다.

 

1. 자신의 `Activity` 와 `Fragment`클래스에 `SoundClassifier`인스턴스를 초기화한다.

var soundClassifier: SoundClassifier
soundClassifier = SoundClassifier(context).also {
    it.lifecycleOwner = context
}

 

2. 기기의 마이크로부터 음성을 가져오고, 실시간 분류를 해낸다.

soundClassifier.start()

 

3. 실시간으로 분류된 결과를 보기 좋은 표와 현재 들리는 음성이 분류된 확률로 받는다.

let labelName = soundClassifier.labelList[0] // e.g. "Clap"
soundClassifier.probabilities.observe(this) { resultMap ->
    let probability = result[labelName] // e.g. 0.7
}

 

  • What's next?

우리는 몇 주 후에 공개될 IOS 버전의 샘플앱을 만들고 있습니다. 

또, 우리는 파이썬에서 하던 음성분류학습을 쉽게 하기 위해

TensorFlow Lite Model Maker라는 것을 만들고 있습니다.

계속 지켜봐주세요!

 

  • Acknowledgements

이 프로젝트는 구글의 다수의 팀이 참여한 합동 프로젝트입니다. 감사합니다.

  • Google Research: Shanqing Cai, Lisie Lillianfeld
  • TensorFlow team: Tian Lin
  • Teachable Machine team: Gautam Bose, Jonas Jongejan
  • Android team: Saryong Kang, Daniel Galpin, Jean-Michel Trivi, Don Turner

 

아이폰 버전이 나오면 또 포스팅하겠습니다.

감사합니다. : )