Android 音訊分類指南

MediaPipe 音訊分類器工作可讓您對音訊資料執行分類。你可以 使用這項工作,從一組已訓練的類別中找出聲音事件。這些 操作說明,示範如何將音訊分類器與 Android 應用程式搭配使用。

進一步瞭解功能、模型和設定選項 請參閱總覽

程式碼範例

MediaPipe Tasks 範例程式碼是音訊分類器的簡易實作, App Engine 應用程式這個範例會使用實體 Android 裝置的麥克風 持續分類聲音,也可以對音效檔案執行分類器 儲存在裝置上。

您可以將應用程式做為起點,當做 Android 應用程式的起點,也可以參照應用程式 做出決定Audio Classifier 範例程式碼是由 GitHub

下載程式碼

以下說明如何建立範例的本機副本 git 指令列工具編寫程式碼。

如要下載範例程式碼,請按照下列步驟操作:

  1. 使用下列指令複製 git 存放區:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 您也可以選擇設定 Git 執行個體,以使用稀疏結帳功能。 所以只能使用 Audio Classifier 範例應用程式的檔案:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

建立範例程式碼的本機版本後,您可以匯入專案 然後執行應用程式如需操作說明,請參閱 Android 設定指南

重要元件

下列檔案含有這個音訊的重要程式碼 分類範例應用程式

設定

本節說明設定開發環境的重要步驟,以及 專門使用 Audio Classifier 的程式碼專案。如需 設定開發環境以使用 MediaPipe 工作,包括: 平台版本需求,請參閱 Android 設定指南

依附元件

音訊分類器使用 com.google.mediapipe:tasks-audio 程式庫。新增此項目 build.gradle 檔案的依附元件 Android 應用程式開發專案。使用下列指令匯入必要的依附元件 下列程式碼:

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

型號

MediaPipe 音訊分類器工作需要經過訓練且與此模型相容的模型。 工作。如要進一步瞭解音訊分類器可用的已訓練模型,請參閱: 工作總覽的「模型」一節

選取並下載模型,然後將模型儲存在專案目錄中:

<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 設定任務的執行模式。音訊分類器提供兩種模式:

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 程式碼範例