Android 向け音声分類ガイド

MediaPipe 音声分類タスクを使用すると、音声データの分類を実行できます。Google Chat では このタスクを使用して、トレーニング済みの一連のカテゴリからサウンドに関するイベントを特定します。これらの では、Android アプリで音声分類器を使用する方法について説明します。

機能、モデル、構成オプションの詳細については、 概要をご覧ください。

サンプルコード

MediaPipe Tasks のサンプルコードは、音声分類器の単純な実装です。 アプリこの例では、物理的な Android デバイスのマイクを使用して、 継続的に音声を分類し、音声ファイルでも分類器を実行可能 保存されることはありません。

独自の Android アプリの出発点としてアプリを使用することも、アプリ自体に言及することもできます。 変更する際の注意点があります。音声分類器のサンプルコードは GitHub

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

次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。

<ph type="x-smartling-placeholder">

サンプルコードをダウンロードするには:

  1. 次のコマンドを使用して Git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成します。 そのため、オーディオ分類サンプルアプリのファイルのみになります。
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

サンプルコードのローカル バージョンを作成したら、プロジェクトをインポートできます。 アプリを実行します。手順については、次をご覧ください: Android 向けセットアップ ガイド

主要コンポーネント

次のファイルには、この音声に不可欠なコードが含まれています。 分類のサンプル アプリケーション:

  • AudioClassifierHelper.kt - 音声分類器を初期化し、モデルとデリゲートを処理する 選択します。
  • RecorderFragment.kt - ライブ音声録音のユーザー インターフェースと制御コードを作成します。
  • LibraryFragment.kt - 音声ファイルを選択するためのユーザー インターフェースと制御コードを作成します。
  • ProbabilitiesAdapter.kt - 分類器の予測結果を処理し、フォーマットする。

セットアップ

このセクションでは、開発環境をセットアップする主な手順と 特に音声分類器を使用するコード プロジェクトです。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Android の設定ガイド

<ph type="x-smartling-placeholder">

依存関係

音声分類器は com.google.mediapipe:tasks-audio ライブラリを使用します。こちらの build.gradle ファイルに依存関係を追加して、 Android アプリ開発プロジェクト。必要な依存関係をインポートする 次のコードを使用します。

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-audio:latest.release'
}

モデル

MediaPipe Audio Classifier タスクには、これと互換性のあるトレーニング済みモデルが必要です タスクを実行します。音声分類器で使用可能なトレーニング済みモデルについて詳しくは、以下をご覧ください。 タスクの概要のモデル セクションをご覧ください。

モデルを選択してダウンロードし、プロジェクト ディレクトリに保存します。

<dev-project-root>/src/main/assets

BaseOptions.Builder.setModelAssetPath() メソッドを使用してパスを指定する 使用されます。このメソッドは、次のコードサンプルで参照されています。 。

音声分類器のコード例 モデルは AudioClassifierHelper.kt で定義されています。 表示されます。

タスクを作成する

タスクを作成するには、createFromOptions 関数を使用します。「 createFromOptions 関数は、実行などの構成オプションを受け入れます。 モード、表示名のロケール、結果の最大数、信頼度のしきい値、 カテゴリの許可リストまたは拒否リストが含まれますリソースの構成について 構成の概要をご覧ください。

音声分類タスクは、音声クリップの次の入力データ型をサポートしています。 ストリーミングできます対応する実行モードを指定する必要があります。 入力データ型を指定します。対応するタブを選択してください タスクの作成方法と推論の実行方法を確認できます。

音声クリップ

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_CLIPS)
        .setMaxResults(5)
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

音声ストリーム

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_STREAM)
        .setMaxResults(5)
        .setResultListener(audioClassifierResult -> {
             // Process the classification result here.
        })
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

音声分類器のコード実装例では、 処理モードを選択できますこのアプローチでは、タスク作成コードが複雑になり、 ユースケースに適さない場合がありますモード切り替えのコードは initClassifier() 関数で、 AudioClassifierHelper

構成オプション

このタスクには、Android アプリ用に次の構成オプションがあります。

オプション名 説明 値の範囲 デフォルト値
runningMode タスクの実行モードを設定します。音声分類器には次の 2 つのモードがあります。

AUDIO_CLIPS: 独立したオーディオ クリップでオーディオ タスクを実行するためのモード。

AUDIO_STREAM: マイクからなどのオーディオ ストリームでオーディオ タスクを実行するためのモード。このモードでは、resultListener は 分類結果を受け取るリスナーを設定するために呼び出されます。 使用できます。
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale 指定された表示名に使うラベルの言語を設定します。 タスクのモデルのメタデータ(利用可能な場合)。デフォルトは en です。 英語。カスタムモデルのメタデータにローカライズされたラベルを追加できます。 TensorFlow Lite Metadata Writer API を使用 言語 / 地域コード en
maxResults オプションの上位スコアの分類結果の最大数を設定します。 戻ります。<0 の場合、利用可能な結果がすべて返されます。 正の数 -1
scoreThreshold 予測スコアのしきい値を設定します。このしきい値は、 モデル メタデータ(存在する場合)この値を下回る結果は拒否されます。 [0.0、1.0] 未設定
categoryAllowlist 許可するカテゴリ名のオプション リストを設定します。空でない場合、 カテゴリ名がこのセットにない分類結果は、 フィルタで除外されます重複または不明なカテゴリ名は無視されます。 このオプションは categoryDenylist とは相互に排他的であり、 どちらの結果もエラーになります 任意の文字列 未設定
categoryDenylist 許可されていないカテゴリ名のオプション リストを設定します。条件 空でない場合、カテゴリ名がこのセットに含まれている分類結果はフィルタされます できます。重複または不明なカテゴリ名は無視されます。このオプションは categoryAllowlist と排他的であり、両方を使用するとエラーになります。 任意の文字列 未設定
resultListener 分類結果を受け取るように結果リスナーを設定します。 音声分類器が音声ストリーム内にある場合、非同期で行われます。 モードです。実行モードが AUDIO_STREAM に設定されている場合にのみ使用できます なし 未設定
errorListener オプションのエラーリスナーを設定します。 なし 未設定

データの準備

音声分類器は、音声クリップと音声ストリームで機能します。タスク は、リサンプリング、バッファリング、フレーム処理を含むデータ入力の前処理を処理します。 ただし、入力音声データは音声変換されて com.google.mediapipe.tasks.components.containers.AudioData オブジェクトを作成してから、オーディオ分類タスクに渡します。

音声クリップ

import com.google.mediapipe.tasks.components.containers.AudioData;

// Load an audio on the users device as a float array.

// Convert a float array to a MediaPipes AudioData object.
AudioData audioData =
    AudioData.create(
        AudioData.AudioDataFormat.builder()
            .setNumOfChannels(numOfChannels)
            .setSampleRate(sampleRate)
            .build(),
        floatData.length);
audioData.load(floatData);
    

音声ストリーム

import android.media.AudioRecord;
import com.google.mediapipe.tasks.components.containers.AudioData;

AudioRecord audioRecord =
    audioClassifier.createAudioRecord(/* numChannels= */ 1, /* sampleRate= */ 16000);
audioRecord.startRecording();

...

// To get a one second clip from the AudioRecord object:
AudioData audioData =
    AudioData.create(
        16000 /*sample counts per second*/);
        AudioData.AudioDataFormat.create(audioRecord.getFormat()),
audioData.load(audioRecord)
    

タスクを実行する

ランニング モードに対応する classify 関数を呼び出して、 推論をトリガーできますAudio Classifier API は、指定されたイベントに対して 認識されたオーディオ イベントを識別します。

音声クリップ

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

音声ストリーム

// Run inference on the audio block. The classifications results will be available
// via the `resultListener` provided in the `AudioClassifierOptions` when
// the audio classifier was created.
audioClassifier.classifyAsync(audioBlock, timestampMs);
    

次の点にご留意ください。

  • 音声ストリーム モードで実行する場合は、 タイムスタンプ付きの音声分類タスクで、 ストリームが推論に使用されました
  • 音声クリップモデルで実行する場合、音声分類タスクは、 入力音声の処理が完了するまで、現在のスレッドを待機状態にします。 ユーザー インターフェースのレスポンスがブロックされないようにするには、 使用します。

音声クリップを使用して音声分類器を実行する例は、 AudioClassifierHelper クラス コードサンプルをご覧ください。

結果の処理と表示

推論の実行後、オーディオ分類タスクは可能性のあるリストを返します。 入力オーディオ内のオーディオ イベントのカテゴリ。次の掲載情報 に、このタスクからの出力データの例を示します。

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

Android アプリでは、タスクは ClassificationResult を返します。 特定のエンティティに対する予測を表す AudioClassifierResult オブジェクトのリスト 音声イベントが含まれます。

音声クリップ

// In the audio clips mode, the classification results are for the entire audio
// clip. The results are timestamped AudioClassifierResult objects, each
// classifying an interval of the entire audio clip that starts at
// ClassificationResult.timestampMs().get().

for (ClassificationResult result : audioClassifierResult.classificationResults()) {
  // Audio interval start timestamp:
  result.timestampMs().get();
  // Classification result of the audio interval.
  result.classifications();
}
    

音声ストリーム

// In the audio stream mode, the classification results list only contains one
// element, representing the classification result of the audio block that
// starts at ClassificationResult.timestampMs in the audio stream.

ClassificationResult result = audioClassifierResult.classificationResults().get(0);
// The audio block start timestamp
audioClassifierResult.timestampMs();
// Alternatively, the same timestamp can be retrieved from
// result.timestampMs().get();

// Classification result.
result.classifications();
    

分類結果を時系列で表示する方法の例を ProbabilitiesAdapter クラスでこのタスクから返された結果 コードサンプルをご覧ください。