ウェブ向け音声分類ガイド

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

このタスクの実際の動作は、デモで確認できます。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

参考として、音声分類器のサンプルコードでは、このタスクの完全な実装を JavaScript で提供しています。このコードは、このタスクをテストし、独自の音声分類アプリの作成を開始する際に役立ちます。音声分類器のサンプルコードをウェブブラウザだけで表示、実行、編集できます。

セットアップ

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

JavaScript パッケージ

音声分類器のコードは、MediaPipe @mediapipe/tasks-audio NPM パッケージを通じて提供されます。これらのライブラリは、プラットフォームの設定ガイドに記載されているリンクから検索してダウンロードできます。

次のコマンドを使用して、ローカル ステージングに必要な次のコードを含む必要なパッケージをインストールできます。

npm install @mediapipe/tasks-audio

コンテンツ配信ネットワーク(CDN)サービスを介してタスクコードをインポートする場合は、HTML ファイルのタグに次のコードを追加します。

<!-- Replace "my-cdn-service.com" with your CDN -->
<head>
  <script src="https://my-cdn-service.com/npm/@mediapipe/tasks-audio/audio_bundle.js"
    crossorigin="anonymous"></script>
</head>

モデル

MediaPipe 音声分類タスクには、このタスクと互換性のあるトレーニング済みモデルが必要です。音声分類に使用できるトレーニング済みモデルの詳細については、タスクの概要のモデル セクションをご覧ください。

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

<dev-project-root>/app/shared/models/

タスクを作成する

音声分類の createFrom...() 関数のいずれかを使用して、推論を実行するタスクを準備します。トレーニング済みモデルファイルへの相対パスまたは絶対パスを指定して、createFromModelPath() 関数を使用します。モデルがすでにメモリに読み込まれている場合は、createFromModelBuffer() メソッドを使用できます。

次のコード例は、createFromOptions() 関数を使用してタスクをセットアップする方法を示しています。createFromOptions 関数を使用すると、構成オプションを使用して音声分類をカスタマイズできます。構成オプションの詳細については、構成オプションをご覧ください。

次のコードは、カスタム オプションを使用してタスクをビルドして構成する方法を示しています。

const audio = await FilesetResolver.forAudioTasks(
    "https://my-cdn-service.com/npm/@mediapipe/tasks-audio/wasm"
  );

const audioClassifier = await AudioClassifier.createFromOptions(audio, {
    baseOptions: {
      modelAssetPath:
        "https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite"
    }
  });

音声分類サンプルコードを実装すると、ユーザーは処理モードを選択できます。このアプローチでは、タスク作成コードが複雑になり、実際のユースケースには適さない可能性があります。各モードについては、example coderunAudioClassification() 関数と runStreamingAudioClassification() 関数をご覧ください。

構成オプション

このタスクには、ウェブ アプリケーションと JavaScript アプリケーション用の次の構成オプションがあります。

オプション名 説明 値の範囲 デフォルト値
displayNamesLocale タスクのモデルのメタデータで提供される表示名に使用するラベルの言語を設定します(利用可能な場合)。英語の場合、デフォルトは en です。TensorFlow Lite Metadata Writer API を使用して、カスタムモデルのメタデータにローカライズされたラベルを追加できます。言語 / 地域コード en
maxResults 返されるトップスコアの分類結果の最大数を設定します(省略可)。0 未満の場合、利用可能なすべての結果が返されます。 任意の正の数 -1
scoreThreshold モデル メタデータ(存在する場合)で指定された値をオーバーライドする予測スコアのしきい値を設定します。この値を下回る結果は拒否されます。 [0.0, 1.0] 未設定
categoryAllowlist 許可されるカテゴリ名のオプション リストを設定します。空でない場合、カテゴリ名がこのセットにない分類結果は除外されます。重複するカテゴリ名や不明なカテゴリ名は無視されます。 このオプションは categoryDenylist と相互に排他的であり、両方を使用するとエラーが発生します。 任意の文字列 未設定
categoryDenylist 使用できないカテゴリ名のオプション リストを設定します。空でない場合、カテゴリ名がこのセットに含まれる分類結果は除外されます。重複するカテゴリ名や不明なカテゴリ名は無視されます。このオプションは categoryAllowlist と相互に排他的であり、両方を使用するとエラーになります。 任意の文字列 未設定

データの準備

音声分類器は、音声クリップと音声ストリーム、ホストブラウザでサポートされている任意の形式の音声ファイルに対応しています。このタスクは、リサンプリング、バッファリング、フレーミングなどのデータ入力の前処理を処理します。

タスクを実行する

音声分類器は、classify() メソッドを使用して、音声クリップ ファイルまたは音声ストリームの推論を実行します。Audio Classifier API は、入力音声で認識された音声イベントに対して取り得るカテゴリを返します。

音声分類器の classify() メソッドの呼び出しは同期的に実行され、ユーザー インターフェース スレッドをブロックします。デバイスのマイクからの音声を分類すると、分類ごとにメインスレッドがブロックされます。これを防ぐには、別のスレッドで classify() を実行するウェブ ワーカーを実装します。

次のコードは、タスクモデルを使用して処理を実行する方法を示しています。

音声クリップ

// Create audio buffer
const sample = await response.arrayBuffer();
const audioBuffer = await audioCtx.decodeAudioData(sample);

// Use AudioClassifier to run classification
const results = audioClassifier.classify(
  audioBuffer.getChannelData(0),
  audioBuffer.sampleRate
);
  

音声ストリーム

stream = await navigator.mediaDevices.getUserMedia(constraints);
audioCtx = new AudioContext({ sampleRate: 16000 });

const source = audioCtx.createMediaStreamSource(stream);
const scriptNode = audioCtx.createScriptProcessor(16384, 1, 1);

scriptNode.onaudioprocess = function (audioProcessingEvent) {
  const inputBuffer = audioProcessingEvent.inputBuffer;
  let inputData = inputBuffer.getChannelData(0);

  // Classify the audio
  const result = audioClassifier.classify(inputData);
  const categories = result[0].classifications[0].categories;
};
  

音声分類タスクの実行の完全な実装については、コードサンプルをご覧ください。

結果を処理して表示する

推論実行が完了すると、音声分類タスクは AudioClassifierResult オブジェクトを返します。このオブジェクトには、入力音声内のオブジェクトのカテゴリのリストが含まれています。

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

音声分類器のサンプルコードは、タスクから返された分類結果を表示する方法を示しています。詳しくは、コードサンプルをご覧ください。