Leitfaden zur Audioklassifizierung für Android

Mit der Aufgabe „MediaPipe Audio Classifier“ können Sie Audiodaten klassifizieren. Sie können verwenden, um Geräuschereignisse aus einer Reihe trainierter Kategorien zu identifizieren. Diese Anleitung zur Verwendung des Audioklassifikators mit Android-Apps.

Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen Sehen Sie sich die Übersicht an.

Codebeispiel

Der Beispielcode von MediaPipe Tasks ist eine einfache Implementierung eines Audioklassifikators. für Android. In diesem Beispiel wird das Mikrofon eines physischen Android-Geräts verwendet, um Klassifizieren Sie kontinuierlich Geräusche und können den Klassifikator für Audiodateien die auf dem Gerät gespeichert sind.

Du kannst die App als Ausgangspunkt für deine eigene Android-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für den Audioklassifikator wird auf GitHub

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie eine lokale Kopie des Beispiels erstellen. mit dem Befehlszeilentool git erstellen.

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

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout. Sie haben also nur die Dateien für die Beispiel-App „Audioklassifikator“:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt importieren in Android Studio ein und führen die App aus. Anweisungen finden Sie in der Einrichtungsleitfaden für Android

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für diese Audiodatei. Beispielanwendung für die Klassifizierung:

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und für die Verwendung des Audioklassifikators. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversionsanforderungen finden Sie in der Einrichtungsleitfaden für Android

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

Abhängigkeiten

Der Audioklassifikator verwendet die com.google.mediapipe:tasks-audio-Bibliothek. Dieses Element hinzufügen Abhängigkeit zur build.gradle-Datei Ihres Android-App-Entwicklungsprojekt Importieren Sie die erforderlichen Abhängigkeiten mit den folgenden Code:

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

Modell

Für die Aufgabe „MediaPipe Audioklassifikator“ ist ein trainiertes Modell erforderlich, das mit diesem für die Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für den Audioklassifikator finden Sie unter in der Aufgabenübersicht im Abschnitt „Modelle“.

Wählen Sie das Modell aus, laden Sie es herunter und speichern Sie es dann in Ihrem Projektverzeichnis:

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

Verwenden Sie die Methode BaseOptions.Builder.setModelAssetPath(), um den Pfad anzugeben. die vom Modell verwendet werden. Diese Methode wird im Codebeispiel in den .

Im Beispielcode für den Audioklassifikator Das Modell ist in AudioClassifierHelper.kt definiert. -Datei.

Aufgabe erstellen

Zum Erstellen der Aufgabe können Sie die Funktion createFromOptions verwenden. Die Die Funktion createFromOptions akzeptiert Konfigurationsoptionen, einschließlich der Ausführung Modus, Anzeigenamen, Sprache, maximale Anzahl von Ergebnissen, Konfidenzgrenzwert, und einer Sperr- oder Zulassungsliste für Kategorien. Weitere Informationen zur Konfiguration finden Sie unter Konfigurationsübersicht.

Die Aufgabe „Audioklassifikator“ unterstützt die folgenden Eingabedatentypen: Audioclips und Audiostreams. Sie müssen den Laufmodus für Eingabedatentyp beim Erstellen einer Aufgabe. Wählen Sie die Registerkarte für um zu sehen, wie die Aufgabe erstellt und eine Inferenz ausgeführt wird.

Audioclips

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

Audiostream

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);
    

Mit der Implementierung des Beispielcodes für den Audioklassifikator kann der Nutzer zwischen Verarbeitungsmodi. Dieser Ansatz macht den Code zur Aufgabenerstellung komplizierter und ist möglicherweise für Ihren Anwendungsfall ungeeignet. Sie können den Code für den Moduswechsel sehen, in der Funktion initClassifier() der AudioClassifierHelper

Konfigurationsoptionen

Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Android-Apps:

Option Beschreibung Wertebereich Standardwert
runningMode Legt den Ausführungsmodus für die Task fest. Der Audioklassifikator hat zwei Modi:

AUDIO_CLIPS: Der Modus zum Ausführen der Audioaufgabe für unabhängige Audioclips.

AUDIO_STREAM: Der Modus zum Ausführen der Audioaufgabe in einem Audiostream, z. B. vom Mikrofon. In diesem Modus muss der resultListener wird aufgerufen, um einen Listener einzurichten, der die Klassifizierungsergebnisse empfängt asynchron programmiert.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale Legt die Sprache der Labels fest, die für Anzeigenamen in der Metadaten des Aufgabenmodells, falls verfügbar. Standardwert ist en für Englisch. Sie können den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen mit der TensorFlow Lite Metadata Writer API Gebietsschemacode de
maxResults Legt die optionale maximale Anzahl der am besten bewerteten Klassifizierungsergebnisse fest auf zurückgeben. Wenn < 0 setzen, werden alle verfügbaren Ergebnisse zurückgegeben. Beliebige positive Zahlen -1
scoreThreshold Legt den Schwellenwert für die Vorhersagepunktzahl fest, der den Wert in die Modellmetadaten (falls vorhanden). Ergebnisse unter diesem Wert werden abgelehnt. [0,0; 1,0] Nicht festgelegt
categoryAllowlist Legt die optionale Liste der zulässigen Kategorienamen fest. Wenn das Feld nicht leer ist, Klassifizierungsergebnisse, deren Kategoriename nicht in dieser Gruppe enthalten ist, werden herausgefiltert. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt sich mit categoryDenylist gegenseitig aus und verwendet führt beides zu einem Fehler. Alle Strings Nicht festgelegt
categoryDenylist Legt die optionale Liste der unzulässigen Kategorienamen fest. Wenn nicht leer ist, werden Klassifizierungsergebnisse gefiltert, deren Kategoriename in diesem Satz enthalten ist. aus. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option ausschließlich mit categoryAllowlist und die Verwendung beider führt zu einem Fehler. Alle Strings Nicht festgelegt
resultListener Legt den Ergebnis-Listener so fest, dass er die Klassifizierungsergebnisse empfängt asynchron, wenn sich der Audioklassifikator im Audiostream befindet . Kann nur verwendet werden, wenn der Ausführungsmodus auf AUDIO_STREAM festgelegt ist Nicht festgelegt
errorListener Legt einen optionalen Fehler-Listener fest. Nicht festgelegt

Daten vorbereiten

Der Audioklassifikator funktioniert mit Audioclips und Audiostreams. Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Sampling, Zwischenspeichern und Framing. Sie müssen die Eingabeaudiodaten jedoch in ein com.google.mediapipe.tasks.components.containers.AudioData-Objekt, bevor es an die Aufgabe des Audioklassifikators übergeben wird.

Audioclips

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);
    

Audiostream

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)
    

Aufgabe ausführen

Sie können die Funktion classify für Ihren Laufmodus aufrufen, um Inferenzen auslösen. Die Audio Classifier API gibt die möglichen Kategorien für die in den eingegebenen Audiodaten erkannten Audioereignisse.

Audioclips

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Audiostream

// 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);
    

Wichtige Hinweise:

  • Bei Ausführung im Audiostreammodus musst du auch die Audioklassifikatoraufgabe mit einem Zeitstempel, der erfasst, welche Audiodaten in der Stream für die Inferenz verwendet wurde.
  • Bei der Ausführung im Audioclipmodell blockiert die Aufgabe „Audioklassifikator“ bis die Verarbeitung der Audioeingabe abgeschlossen ist. Um zu vermeiden, dass Antworten auf der Benutzeroberfläche blockiert werden, führen Sie die Verarbeitung in einem im Hintergrund.

Ein Beispiel für die Verwendung des Audioklassifikators mit Audioclips finden Sie auf der AudioClassifierHelper Klasse im Codebeispiel an.

Ergebnisse verarbeiten und anzeigen

Nach einer Inferenz gibt die Aufgabe des Audioklassifikators eine Liste möglicher Kategorien für die Audioereignisse innerhalb der Audioeingabe. Der folgende Eintrag zeigt ein Beispiel für die Ausgabedaten dieser Aufgabe:

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

In einer Android-App gibt die Aufgabe ein ClassificationResult zurück, das ein Liste mit AudioClassifierResult-Objekten, die Vorhersagen für einen Audioereignis, einschließlich Kategorielabel und Konfidenzwert.

Audioclips

// 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();
}
    

Audiostream

// 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();
    

Im Beispiel sehen Sie, wie die Klassifizierung Ergebnisse dieser Aufgabe in der Klasse ProbabilitiesAdapter der Codebeispiel an.