Python 音声分類ガイド

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

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

サンプルコード

参考までに、音声分類器のサンプルコードでは、このタスクの完全な実装を Python で提供しています。このコードは、このタスクをテストして独自の音声分類器の作成を開始するうえで役立ちます。Google Colab でウェブブラウザを使用して、音声分類器のサンプルコードを表示、実行、編集できます。この例のソースコードは GitHub で確認できます。

Raspberry Pi 用の音声分類を実装する場合は、Raspberry Pi サンプルアプリをご覧ください。

セットアップ

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

パッケージ

音声分類器は mediapipe pip パッケージのタスクを実行します。この依存関係は、次のコマンドでインストールできます。

$ python -m pip install mediapipe

インポート

音声分類タスク関数にアクセスするには、次のクラスをインポートします。

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import audio

モデル

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

モデルを選択してダウンロードし、ローカル ディレクトリに保存します。推奨の Yamnet モデルを使用できます。

model_path = '/absolute/path/to/lite-model_yamnet_classification_tflite_1.tflite'

次のように、[モデル名] パラメータ内にモデルのパスを指定します。

base_options = BaseOptions(model_asset_path=model_path)

タスクを作成する

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

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

音声クリップ

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=AudioRunningMode.AUDIO_CLIPS)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

音声ストリーム

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioClassifierResult = mp.tasks.audio.AudioClassifierResult
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

def print_result(result: AudioClassifierResult, timestamp_ms: int):
    print(AudioClassifierResult result: {}’.format(result))

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=AudioRunningMode.AUDIO_STREAM,
    max_results=5,
    result_callback=print_result)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
  

音声で使用する音声分類器の作成例については、コードサンプルをご覧ください。

構成オプション

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

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

AUDIO_CLIPS: 独立した音声クリップに対して音声タスクを実行するモード。

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

データの準備

音声分類器は、音声クリップと音声ストリームに対して機能します。このタスクは、リサンプリング、バッファリング、フレーミングなどのデータ入力の前処理を処理します。

音声ファイルまたは numpy 配列として入力を準備し、MediaPipe AudioData オブジェクトに変換します。SciPy などの外部ライブラリを使用して、入力音声を numpy 配列として読み込むことができます。

次の例は、使用可能な各データ型の処理用にデータを準備する方法を説明および示しています。

音声クリップ

import numpy as np
from scipy.io import wavfile

AudioData = mp.tasks.components.containers.AudioData

sample_rate, buffer = wavfile.read('/path/to/audio.wav')
audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

音声ストリーム

import numpy as np

AudioData = mp.tasks.components.containers.AudioData

# Read microphone data as np arrays, then call

audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

タスクを実行する

実行モードに対応する分類関数を呼び出して、推論をトリガーします。Audio Classifier API は、入力オーディオ バッファ内のオーディオ イベントに該当するカテゴリを返します。

音声クリップ

# Perform audio classification on the provided audio clip.
audio_classifier_result_list = classifier.classify(audio_data)
    

音声ストリーム

# Send live audio data to perform audio classification.
# Results are sent to the `result_callback` provided in the `AudioClassifierOptions`
classifier.classify_async(audio_data, timestamp_ms)
    

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

  • 音声ストリーム モードで実行する場合は、入力音声データのタイムスタンプも音声分類タスクに提供する必要があります。
  • 音声クリップ モデルで実行する場合、音声分類タスクは入力音声の処理が完了するまで現在のスレッドをブロックします。

音声クリップを使用して音声分類を実行する詳細な例については、コードサンプルをご覧ください。

結果を処理して表示する

推論を実行すると、音声分類タスクは 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

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