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:
- Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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:
- AudioClassifierHelper.kt Initialisiert den Audioklassifikator und verarbeitet das Modell und delegieren Auswahl.
- RecorderFragment.kt: Erstellt die Benutzeroberfläche und den Steuercode für die Live-Audioaufnahme.
- LibraryFragment.kt Erstellt die Benutzeroberfläche und den Steuercode für die Auswahl von Audiodateien.
- ProbabilitiesAdapter.kt Verarbeitet und formatiert die Vorhersageergebnisse des Klassifikators.
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 user’s device as a float array. // Convert a float array to a MediaPipe’s 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.