오디오 분류를 위한 기본 앱 만들기

1. 시작하기 전에

TensorFlow는 다목적 머신러닝 프레임워크입니다. 클라우드의 클러스터 전반에서 대규모 모델을 학습시키거나 휴대폰과 같은 임베디드 시스템에서 로컬로 모델을 실행하는 데 사용할 수 있습니다.

이 Codelab에서는 TensorFlow Lite를 사용하여 Android 기기에서 오디오 분류 모델을 실행합니다.

실습 내용

  • 즉시 사용할 수 있는 선행 학습된 머신러닝 모델을 찾는 방법
  • 실시간으로 캡처된 오디오에서 오디오 분류를 수행하는 방법
  • TensorFlow Lite 지원 라이브러리를 사용하여 모델 입력을 사전 처리하고 모델 출력을 후처리하는 방법
  • 오디오 작업 라이브러리를 사용하여 모든 오디오 관련 작업을 수행하는 방법

빌드할 항목

TensorFlow Lite 오디오 인식 모델을 실행하여 마이크에서 실시간으로 오디오를 식별하는 간단한 오디오 인식기 앱

33af0fdb0a027fa8.png

준비물

  • 최신 버전의 Android 스튜디오 (v4.1.2 이상)
  • API 버전 23 (Android 6.0)의 Android 버전을 사용하는 실제 Android 기기
  • 샘플 코드
  • Kotlin의 Android 개발에 관한 기본 지식

2 샘플 코드 가져오기

코드 다운로드

다음 링크를 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

다운로드한 ZIP 파일의 압축을 해제합니다. 그러면 필요한 모든 리소스가 포함된 루트 폴더 (odml-pathways)가 압축 해제됩니다. 이 Codelab에서는 audio_classification/codelab1/android 하위 디렉터리의 소스만 필요합니다.

참고: 원하는 경우 저장소를 클론할 수 있습니다.

git clone https://github.com/googlecodelabs/odml-pathways.git

audio_classification/codelab1/android 저장소의 android 하위 디렉터리에는 두 디렉터리가 포함됩니다.

  • android_studio_folder.pngstarter: 이 Codelab에서 빌드하는 시작 코드입니다.
  • android_studio_folder.png최종: 완료된 샘플 앱의 완성된 코드입니다.

시작 앱 가져오기

먼저 시작 앱을 Android 스튜디오로 가져옵니다.

  1. Android 스튜디오를 열고 Import Project (Gradle, Eclipse ADT 등)를 선택합니다.
  2. 이전에 다운로드한 소스 코드에서 starter 폴더 (audio_classification/codelab1/android/starter)를 엽니다.

7c0f27882a2698ac.png

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 가져오기 프로세스가 완료되었을 때 프로젝트를 Gradle 파일과 동기화해야 합니다.

  1. Android 스튜디오 툴바에서 Sync Project with Gradle Files ( b451ab2d04d835f9.png)를 선택합니다.

시작 앱 실행

프로젝트를 Android 스튜디오로 가져왔으므로 이제 앱을 처음으로 실행할 수 있습니다.

USB를 통해 Android 기기를 컴퓨터에 연결하고 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다.

5518972c21705945.png

3. 선행 학습된 모델 찾기

오디오 분류를 수행하려면 모델이 필요합니다. 선행 학습된 모델로 시작하여 직접 학습할 필요가 없습니다.

선행 학습된 모델을 찾으려면 TensorFlow Hub ( www.tfhub.dev)를 사용하세요.

91e39900ff58818c.png

모델은 도메인을 기준으로 분류됩니다. 현재 필요한 것은 오디오 문제 도메인에서 가져온 것입니다.

9d44d38c297bf3dc.png

앱의 경우 YAMNet 모델을 사용하여 이벤트 분류를 수행합니다.

YAMNet은 오디오 파형을 입력으로 사용하여 521개의 오디오 이벤트마다 개별적으로 예측을 수행하는 오디오 이벤트 분류기입니다.

모델 yamnet/classification은 이미 TensorFlow Lite로 변환되었으며 오디오용 TFLite Task Library를 사용하여 휴대기기에서 모델을 더 쉽게 사용할 수 있도록 하는 특정 메타데이터를 포함합니다.

65dc0f610eb27762.png

적절한 탭(TFLite(yamnet/classification/tflite)을 선택)을 클릭하고 다운로드를 클릭합니다. 하단의 모델의 메타데이터도 확인할 수 있습니다.

cfb3cfeb310e1f51.png

이 모델 파일 (lite-model_yamnet_classification_tflite_1.tflite)은 다음 단계에서 사용됩니다.

4. 새 모델을 기본 앱으로 가져옵니다.

첫 번째 단계는 다운로드한 모델을 이전 단계의 앱 애셋 폴더로 옮기는 것입니다.

Android 스튜디오의 프로젝트 탐색기에서 assets 폴더를 마우스 오른쪽 버튼으로 클릭합니다.

7cca2c22ed8cf4c8.png

옵션 목록이 포함된 팝업이 표시됩니다. 파일 시스템 중 하나에서 폴더를 엽니다. Mac에서는 Reveal in Finder, Windows에서는 Open in Explorer, Ubuntu에서는 Show in Files입니다. 운영체제에 맞는 플랫폼을 찾아 선택합니다.

95e0eca881d35f6b.png

그런 다음 다운로드한 모델을 여기에 복사합니다.

이 작업을 완료하면 Android 스튜디오로 돌아가면 assets 폴더 내에 파일이 표시됩니다.

703b1842fb09e893.png

5 기본 앱에서 새 모델 로드

이제 몇 가지 TODO를 따르고 이전 단계에서 프로젝트에 추가한 모델로 오디오 분류를 사용 설정합니다.

할 일을 쉽게 찾으려면 Android 스튜디오에서 View > Tool Windows > TODO 메뉴로 이동합니다. 목록이 있는 창이 열리면 코드를 클릭하기만 하면 됩니다.

build.gradle 파일 (모듈 버전)에서 첫 번째 작업을 찾습니다.

TODO 1은 Android 종속 항목을 추가하는 것입니다.

implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'

나머지 코드 변경사항은 모두 MainActivity에 적용됩니다.

TODO 2.1은 다음 단계에서 로드할 모델 이름으로 변수를 만듭니다.

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

TODO 2.2는 모델에서 예측을 수락할 수 있는 최소 기준을 정의합니다. 이 변수는 나중에 사용됩니다.

var probabilityThreshold: Float = 0.3f

TODO 2.3은 애셋 폴더에서 모델을 로드할 위치입니다. 오디오 작업 라이브러리에 정의된 AudioClassifier 클래스는 모델을 로드할 준비를 하고 추론을 실행하고 오디오 녹음기를 만드는 데 필요한 모든 메서드를 제공합니다.

val classifier = AudioClassifier.createFromFile(this, modelPath)

6. 오디오 캡처

Audio Tasks API에는 모델에서 예상하는 적절한 구성 (예: 샘플링 레이트, 비트 전송률, 채널 수)으로 오디오 레코더를 만드는 데 도움이 되는 도우미 메서드가 있습니다. 이렇게 하면 직접 찾지 않고도 구성 객체를 만들 수 있습니다.

TODO 3.1: 추론을 위한 녹음을 저장하고 녹음기의 형식 사양을 빌드하는 텐서 변수를 만듭니다.

val tensor = classifier.createInputTensorAudio()

TODO 3.2: 이전 단계에서 모델의 메타데이터로 정의한 오디오 레코더 사양을 표시합니다.

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

92e81894674a5b0.png

TODO 3.3: 오디오 레코더를 만들고 녹음을 시작합니다.

val record = classifier.createAudioRecord()
record.startRecording()

현재 앱은 휴대전화의 마이크를 통해 수신 대기 중이지만 여전히 추론을 진행하지 않습니다. 다음 단계에서 이 문제를 해결합니다.

7 모델에 추론 추가

이 단계에서는 앱에 추론 코드를 추가하고 화면에 표시합니다. 코드에는 이미 0.5초마다 실행되는 타이머 스레드가 있으며 여기서 추론이 실행됩니다.

메서드 scheduleAtFixedRate의 매개변수는 500밀리초 미만의 코드에서 실행 시작과 연속 작업 실행 간의 대기 시간입니다.

Timer().scheduleAtFixedRate(1, 500) {
...
}

TODO 4.1 코드를 추가하여 모델을 사용합니다. 먼저 녹음을 오디오 텐서에 로드하고 분류기에 전달합니다.

tensor.load(record)
val output = classifier.classify(tensor)

TODO 4.2는 더 나은 추론 결과를 얻으려면 가능성이 매우 낮은 분류를 필터링합니다. 여기서는 이전 단계 (probabilityThreshold)에서 만든 변수를 사용합니다.

val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}

TODO 4.3: 결과를 더 쉽게 읽을 수 있도록 필터링된 결과가 포함된 문자열을 만들어 보겠습니다.

val outputStr = filteredModelOutput.sortedBy { -it.score }
   .joinToString(separator = "\n") { "${it.label} -> ${it.score} " }

TODO 4.4 UI를 업데이트합니다. 매우 간단한 앱에서 결과는 TextView에 표시됩니다. 분류가 기본 스레드에 없으므로 이 업데이트를 처리하려면 핸들러를 사용해야 합니다.

runOnUiThread {
   textView.text = outputStr
}

다음과 같은 데 필요한 코드를 모두 추가했습니다.

  • 애셋 폴더에서 모델 로드
  • 올바른 구성으로 오디오 레코더 만들기
  • 추론 실행
  • 화면에 최상의 검색결과 표시

이제 앱을 테스트하기만 하면 됩니다.

8 최종 앱 실행

오디오 분류 모델을 앱에 통합했으므로 테스트하겠습니다.

Android 기기를 연결하고 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다.

처음 실행할 때 앱에 오디오 오디오 녹음 권한을 부여해야 합니다.

권한을 부여하면 시작 시 앱에서 휴대전화의 마이크를 사용합니다. YAMNet에서 감지한 클래스 중 하나가 음성이므로 테스트하려면 휴대전화 근처에서 말하기 시작합니다. 간편하게 테스트할 수 있는 또 다른 클래스는 손가락 치기 또는 박수입니다.

개 짖는 소리 및 기타 여러 이벤트 (521)를 감지할 수도 있습니다. 전체 목록은 소스 코드를 확인하거나 직접 라벨 파일의 메타데이터를 참조할 수도 있습니다.

33af0fdb0a027fa8.png

9. 축하합니다.

이 Codelab에서는 오디오 분류를 위해 선행 학습된 모델을 찾고 TensorFlow Lite를 사용해 모바일 앱에 배포하는 방법을 배웠습니다. TFLite에 관해 자세히 알아보려면 다른 TFLite 샘플을 살펴보세요.

학습한 내용

  • Android 앱에 TensorFlow Lite 모델을 배포하는 방법
  • TensorFlow Hub에서 모델을 찾고 사용하는 방법

다음 단계

  • 자체 데이터로 모델을 맞춤설정합니다.

자세히 알아보기

질문이 있으신가요?

문제 신고