カスタム事前トレーニング済み音声分類モデルの構築

1. 始める前に

前の Codelab では、音声分類用の基本的なアプリを作成しました。

音声分類モデルをカスタマイズして、事前トレーニング済みモデルに存在しないさまざまなクラスの音声を認識したい場合はどうすればよいでしょうか。 独自のデータでモデルをカスタマイズする場合はどうでしょうか。

この Codelab では、事前トレーニング済みの音声分類モデルをカスタマイズして、鳥の鳴き声を検出します。独自のデータを使用して同じ手法を再現できます。

前提条件

この Codelab は、機械学習の経験がある経験豊富なモバイル デベロッパーを対象としています。以下について把握しておく必要があります。

  • Kotlin と Android Studio を使用した Android 開発
  • 基本的な Python 構文

学習内容

  • 音声ドメインの転移学習を行う方法
  • 独自のデータを作成する方法
  • Android アプリに独自のモデルをデプロイする方法

必要なもの

  • 最新バージョンの Android Studio(v4.1.2 以降)
  • API バージョン 23(Android 6.0)の Android 搭載実機
  • サンプルコード
  • Kotlin による Android 開発の基本的な知識

2. Birds データセット

すでに使いやすい Birdsong データセットを使用します。すべての音声ファイルは Xeno-canto ウェブサイトから入手しています。

このデータセットに含まれる曲:

名前: House Sparrow

コード: houspa

コロンビアのアルメニアの Alejandro Bayer Tamayo による House Sparrow 種の鳥の画像。

[音声]

名前: レッド クロスビル

コード: redcro

Elaine Wilson による赤色のクロスビル鳥の画像

[音声]

名前: ホワイトブレスト ウッドレン

コード: wbwwre1

ホワイト ブレスト ウッドレンの画像(不明)。

[音声]

名前: 栗のアントピッタ

コード: chcant2

栗の頭のアントピッタの画像

[音声]

名前: Azara's Spinetail

コード: azaspi1

アザラのスピネーテール鳥の画像。

[音声]

このデータセットは zip ファイルで、その内容は次のとおりです。

  • 各音声ファイルに関するすべての情報を含む metadata.csv。音声の録音者、録音場所、ライセンス、鳥の名前などが含まれます。
  • トレーニング フォルダとテストフォルダ
  • train/test フォルダ内には、鳥の各コード用のフォルダがあります。各ファイルには、そのバージョンに属するすべての .wav ファイルが含まれます。

音声ファイルはすべて wav 形式であり、この仕様に従います。

この形式のデータを必要とするベースモデルを使用するため、この仕様は重要です。詳しくは、こちらのブログ投稿をご覧ください。

プロセス全体を簡単にするため、マシンにデータセットをダウンロードする必要はありません。データセットは Google Colab(このガイドの後半)で使用します。

独自のデータを使用する場合は、すべての音声ファイルがこの特定の形式になっている必要があります。

3. サンプルコードを取得する

コードをダウンロードする

次のリンクをクリックして、この Codelab のコードをすべてダウンロードします。

必要であれば、リポジトリのクローンを作成します。

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

ダウンロードした zip ファイルを解凍すると、ルートフォルダ(odml-pathways)が展開され、必要なリソースがすべて揃います。この Codelab では、audio_classification/codelab2/android サブディレクトリ内のソースのみが必要です。

audio_classification/codelab2/android リポジトリの android サブディレクトリには、次の 2 つのディレクトリがあります。

  • android_studio_folder.pngstarter: この Codelab で土台として使うコードを元に、
  • android_studio_folder.pngfinal: 完成したサンプルアプリの完成したコードです。

スターター アプリをインポートする

まず、スターター アプリを Android Studio にインポートします。

  1. Android Studio を開き、[Import Project (Gradle, Eclipse ADT, etc.)] を選択します。
  2. 先ほどダウンロードしたソースコードから starter フォルダ(audio_classification/codelab2/android/starter)を開きます。

7c0f27882a2698ac.png

すべての依存関係をアプリで使用できるようにするには、インポート プロセスの完了後に、プロジェクトを Gradle ファイルと同期する必要があります。

  1. Android Studio のツールバーで [Sync Project with Gradle Files](b451ab2d04d835f9.png)を選択します。

4.スターター アプリを理解する

このアプリは、音声分類用に最初の Codelab で音声分類用の基本的なアプリを作成するで作成したものと同じです。

コードについて理解を深めるために、この Codelab を続行する前に確認することをおすすめします。

すべてのコードは MainActivity にあります(できる限りシンプルにします)。

要約すると、コードは次のタスクを実行します。

  • モデルの読み込み
val classifier = AudioClassifier.createFromFile(this, modelPath)
  • オーディオ レコーダーを作成して録音を開始する
val tensor = classifier.createInputTensorAudio()

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

val record = classifier.createAudioRecord()
record.startRecording()
  • 推論を実行するためのタイマー スレッドの作成。scheduleAtFixedRate メソッドのパラメータは、実行を開始するまでの待機時間と、タスクが連続して実行される間隔です。以下のコードでは、1 ミリ秒で開始し、500 ミリ秒ごとに再実行されます。
Timer().scheduleAtFixedRate(1, 500) {
...
}
  • キャプチャした音声に対して推論を実行する
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
  • スコアが低い場合のフィルタ分類
val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}
  • 結果を画面に表示する
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
   .joinToString(separator = "\n")

runOnUiThread {
   textView.text = outputStr
}

アプリを実行してそのまま使用することはできますが、より汎用的な事前トレーニング済みモデルを使用していることに注意してください。

5. Model Maker を使用してカスタム音声分類モデルをトレーニングする

前のステップでは、事前トレーニング済みモデルを使用して音声イベントを分類するアプリをダウンロードしました。場合によっては、対象のオーディオ イベントに合わせてこのモデルをカスタマイズしたり、より具体的なバージョンにしたりする必要があります。

前述のように、鳥の鳴き声に特化したモデルを扱います。 鳥の音声を含むデータセットは、Xeno-canto ウェブサイトから集めたものです。

Colaboratory

次に、Google Colab に移動して、カスタムモデルをトレーニングしましょう。

カスタムモデルのトレーニングには 30 分ほどかかります。

このステップをスキップする場合は、提供されたデータセットを使用する Codelab でトレーニングを行ったモデルをダウンロードして、次のステップに進みます。

6. カスタム TFLite モデルを Android アプリに追加する

独自の音声分類モデルをトレーニングしてローカルに保存したら、そのモデルを Android アプリのアセット フォルダに配置する必要があります。

まず、ダウンロードしたモデルを前のステップからアプリのアセット フォルダに移動します。

  1. Android Studio の [Android Project] ビューで、assets フォルダを右クリックします。

7cca2c22ed8cf4c8.png

  1. ポップアップが開き、オプションが表示されます。そのうちの 1 つが、ファイル システムでフォルダを開くことです。使用しているオペレーティング システムに合ったものを選択します。Mac では [Finder in Shower]、Windows では [Open in Explorer]、Ubuntu では [Show in Files] に表示されます。

275ec0881d35f6b.png

  1. ダウンロードしたモデルをフォルダにコピーします。

確認したら、Android Studio に戻ると、アセット フォルダにファイルが表示されます。

52bda66abe201fe5.png

7. ベースアプリに新しいモデルを読み込む

ベースアプリはすでに事前トレーニング済みモデルを使用しています。先ほどトレーニングしたものに置き換えます。

  1. TODO 1: 新しいモデルを assets フォルダに追加した後で読み込むには、modelPath 変数の値を変更します。
var modelPath = "my_birds_model.tflite"

新しいモデルには 2 つの出力(ヘッド)があります。

  • 使用したベースモデル(この例では YAMNet)からの、より汎用的な元の出力。
  • トレーニングで使用した鳥固有のセカンダリ出力。

これは YAMNet が一般的な複数のクラスを認識するので便利です。たとえば、サイレント クラスを使えば、多くのクラスを認識できます。これにより、データセットに追加しなかった他のクラスを気にする必要がなくなります。

ここで行うのは、YAMNet 分類で bird クラスのスコアが高い場合、もう一方の出力でどの鳥なのかを調べます。

2016-0111

  1. TODO 2: 最初に分類した人物の信頼度が高い場合は、鳥の音であるかどうかを確認します。ここでは、フィルタを変更して、Bird 以外のものも除外します。
val filteredModelOuput = output[0].categories.filter {
   it.label.contains("Bird") && it.score > .3
}
  1. TODO 3: モデルのベースヘッドが音声にバードが含まれる可能性が高いことが検出されると、2 番目のヘッドに現れる鳥を取得します。
if (filteredModelOutput.isNotEmpty()) {
   Log.i("Yamnet", "bird sound detected!")
   filteredModelOutput = output[1].categories.filter {
       it.score > probabilityThreshold
   }
}

これで、トレーニングしたモデルを使用するのは、モデルを変更するだけです。

次のステップでテストを行います。

8. 新しいモデルでアプリをテストする

音声分類モデルをアプリに組み込んだので、それをテストします。

  1. Android デバイスを接続し、Android Studio ツールバーの [Run](execute.png)をクリックします。

アプリは、鳥の音声を正確に予測できる必要があります。パソコンからの音声(前のステップで確認した音声)を再生すると、簡単にテストできます。正しく設定されると、鳥の名前と正しい確率が画面に表示されます。

bec397de3c8aaf32.png

9. 完了

この Codelab では、Model Maker で独自の音声分類モデルを作成し、TensorFlow Lite を使用してモバイルアプリにデプロイする方法を学びました。TFLite の詳細については、他の TFLite のサンプルをご覧ください。

学習した内容

  • 独自のデータセットを準備する方法
  • モデルメーカーを使用して音声分類のための転移学習を行う方法
  • Android アプリでモデルを使用する方法

次の手順

  • 独自のデータで試す
  • 作成したものを共有する

詳細

質問がある場合

問題の報告