Leitfaden zur Audioklassifizierung für das Web

Mit der MediaPipe Audio Classifier-Aufgabe können Sie Audio-Daten klassifizieren. Mit dieser Aufgabe können Sie Soundereignisse aus einer Reihe trainierter Kategorien identifizieren. In dieser Anleitung wird beschrieben, wie Sie den Audio Classifier für Node- und Web-Apps verwenden.

In der Demo können Sie sich ansehen, wie diese Aufgabe funktioniert. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.

Codebeispiel

Der Beispielcode für den Audio Classifier enthält eine vollständige Implementierung dieser Aufgabe in JavaScript. Mit diesem Code können Sie diese Aufgabe testen und mit der Entwicklung Ihrer eigenen Audio-Klassifizierungs-App beginnen. Sie können das Audio Classifier Beispiel einfach in Ihrem Webbrowser ansehen, ausführen und bearbeiten.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Ihrer Codeprojekte für die Verwendung des Audio Classifiers beschrieben. Allgemeine Informationen zum Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich der Anforderungen an die Plattformversion, finden Sie in der Einrichtungsanleitung für das Web.

JavaScript-Pakete

Der Audio Classifier-Code ist über das MediaPipe @mediapipe/tasks-audio NPM-Paket verfügbar. Sie können diese Bibliotheken über die Links in der Einrichtungsanleitung für die Plattform finden und herunterladen.

Sie können die erforderlichen Pakete mit dem folgenden Code für das lokale Staging installieren:

npm install @mediapipe/tasks-audio

Wenn Sie den Aufgabencode über einen CDN-Dienst (Content Delivery Network) importieren möchten, fügen Sie den folgenden Code im Tag in Ihrer HTML-Datei hinzu:

<!-- 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>

Modell

Für die MediaPipe Audio Classifier-Aufgabe ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu den verfügbaren trainierten Modellen für den Audio Classifier finden Sie unter Aufgabenübersicht Modelle.

Wählen Sie ein Modell aus, laden Sie es herunter und speichern Sie es dann in Ihrem Projektverzeichnis, z. B.:

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

Aufgabe erstellen

Verwenden Sie eine der createFrom...()-Funktionen des Audio Classifiers, um die Aufgabe für die Ausführung von Inferenzläufen vorzubereiten. Verwenden Sie die Funktion createFromModelPath() mit einem relativen oder absoluten Pfad zur trainierten Modelldatei. Wenn Ihr Modell bereits in den Arbeitsspeicher geladen wurde, können Sie die Methode createFromModelBuffer() verwenden.

Das folgende Codebeispiel zeigt, wie Sie die Funktion createFromOptions() verwenden, um die Aufgabe einzurichten. Mit der Funktion createFromOptions können Sie den Audio Classifier mit Konfigurationsoptionen anpassen. Weitere Informationen zu Konfigurations optionen finden Sie unter Konfigurationsoptionen.

Der folgende Code zeigt, wie Sie die Aufgabe mit benutzerdefinierten Optionen erstellen und konfigurieren:

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

Ein vollständiges Beispiel finden Sie unter example code.

Konfigurationsoptionen

Für diese Aufgabe sind die folgenden Konfigurationsoptionen für Web- und JavaScript-Anwendungen verfügbar:

Option Beschreibung Wertebereich Standardwert
displayNamesLocale Legt die Sprache der Labels fest, die für Anzeigenamen verwendet werden sollen, die in den Metadaten des Modells der Aufgabe angegeben sind, sofern verfügbar. Der Standardwert ist en für Englisch. Sie können den Metadaten eines benutzerdefinierten Modells lokalisierte Labels mit der TensorFlow Lite Metadata Writer API hinzufügen. Locale-Code de
maxResults Legt die optionale maximale Anzahl der Klassifizierungsergebnisse mit der höchsten Bewertung fest, die zurückgegeben werden sollen. Wenn der Wert kleiner als 0 ist, werden alle verfügbaren Ergebnisse zurückgegeben. Alle positiven Zahlen -1
scoreThreshold Legt den Schwellenwert für die Vorhersagebewertung fest, der den in den Metadaten des Modells angegebenen Wert überschreibt (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 die Liste nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename nicht in dieser Liste enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt categoryDenylist aus. Wenn Sie beide verwenden, tritt ein Fehler auf. Alle Strings Nicht festgelegt
categoryDenylist Legt die optionale Liste der Kategorienamen fest, die nicht zulässig sind. Wenn die Liste nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename in dieser Liste enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt categoryAllowlist aus. Wenn Sie beide verwenden, tritt ein Fehler auf. Alle Strings Nicht festgelegt

Daten vorbereiten

Der Audio Classifier funktioniert mit Audioclips und Audiostreams und kann mit Audiodateien in jedem Format verwendet werden, das vom Hostbrowser unterstützt wird. Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Resampling, Pufferung und Framing.

Aufgabe ausführen

Der Audio Classifier verwendet die Methode classify(), um Inferenzläufe für Audioclipdateien oder Audiostreams auszuführen. Die Audio Classifier API gibt die möglichen Kategorien für Audioereignisse zurück, die in den Audioeingabedaten erkannt wurden.

Aufrufe der Methode classify() des Audio Classifiers werden synchron ausgeführt und blockieren den Thread der Benutzeroberfläche. Wenn Sie Audio vom Mikrofon eines Geräts klassifizieren, wird der Hauptthread bei jeder Klassifizierung blockiert. Sie können dies verhindern, indem Sie Web-Worker implementieren, um classify() in einem anderen Thread auszuführen.

Der folgende Code zeigt, wie Sie die Verarbeitung mit dem Aufgabenmodell ausführen:

Audio clips

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

Audio stream

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

Eine vollständigere Implementierung der Ausführung einer Audio Classifier-Aufgabe finden Sie im Beispiel.

Ergebnisse verarbeiten und anzeigen

Nach Abschluss eines Inferenzlaufs gibt die Audio Classifier-Aufgabe ein AudioClassifierResult-Objekt zurück, das die Liste der möglichen Kategorien für die Objekte in den Audioeingabedaten enthält.

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

Der Beispielcode für den Audio Classifier zeigt, wie Sie die Klassifizierungsergebnisse anzeigen, die von der Aufgabe zurückgegeben werden. Weitere Informationen finden Sie im Beispiel .