Przewodnik po klasyfikacji audio w przeglądarce

Zadanie MediaPipe Audio Classifier umożliwia klasyfikowanie danych audio. Możesz użyć tego zadania do identyfikowania zdarzeń dźwiękowych z zestawu wytrenowanych kategorii. Te instrukcje pokazują, jak używać klasyfikatora dźwięku w aplikacjach Node.js i internetowych.

Możesz zobaczyć to zadanie w działaniu, oglądając demo. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w Przeglądzie.

Przykładowy kod

Przykładowy kod klasyfikatora dźwięku zawiera pełną implementację tego zadania w JavaScript. Ten kod pomoże Ci przetestować to zadanie i zacząć tworzyć własną aplikację do klasyfikacji dźwięku. Możesz wyświetlać, uruchamiać i edytować przykład klasyfikatora dźwięku za pomocą przeglądarki.

Konfiguracja

W tej sekcji opisujemy najważniejsze kroki, które należy wykonać, aby skonfigurować środowisko programistyczne i projekty kodu do korzystania z klasyfikatora dźwięku. Ogólne informacje o konfigurowaniu środowiska programistycznego do korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku po konfiguracji na potrzeby internetu.

Pakiety JavaScript

Kod klasyfikatora dźwięku jest dostępny w pakiecie MediaPipe @mediapipe/tasks-audio NPM. Te biblioteki możesz znaleźć i pobrać, korzystając z linków podanych w przewodniku po konfiguracji platformy.

Wymagane pakiety możesz zainstalować za pomocą tego kodu w przypadku lokalnego środowiska testowego za pomocą tego polecenia:

npm install @mediapipe/tasks-audio

Jeśli chcesz zaimportować kod zadania za pomocą usługi sieci dostarczania treści (CDN), dodaj ten kod w tagu w pliku HTML:

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

Model

Zadanie MediaPipe Audio Classifier wymaga wytrenowanego modelu, który jest z nim zgodny. Więcej informacji o dostępnych wytrenowanych modelach klasyfikatora dźwięku znajdziesz w sekcji Modele w omówieniu zadania.

Wybierz i pobierz model, a następnie zapisz go w katalogu projektu, np.:

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

Tworzenie zadania

Użyj jednej z funkcji klasyfikatora dźwięku createFrom...(), aby przygotować zadanie do uruchomienia wnioskowania. Użyj funkcji createFromModelPath() ze ścieżką względną lub bezwzględną do wytrenowanego pliku modelu. Jeśli model jest już załadowany do pamięci, możesz użyć metody createFromModelBuffer().

Poniższy przykładowy kod pokazuje, jak skonfigurować zadanie za pomocą funkcji createFromOptions(). Funkcja createFromOptions umożliwia dostosowanie klasyfikatora dźwięku za pomocą opcji konfiguracji. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.

Poniższy kod pokazuje, jak utworzyć i skonfigurować zadanie z opcjami niestandardowymi:

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

Pełny przykład znajdziesz na stronie example code.

Opcje konfiguracji

To zadanie ma te opcje konfiguracji w przypadku aplikacji internetowych i aplikacji napisanych w języku JavaScript:

Nazwa opcji Opis Zakres wartości Wartość domyślna
displayNamesLocale Ustawia język etykiet, które mają być używane w przypadku wyświetlanych nazw podanych w metadanych modelu zadania (jeśli są dostępne). Wartość domyślna to en w przypadku języka angielskiego. Możesz dodać zlokalizowane etykiety do metadanych modelu niestandardowego za pomocą interfejsu TensorFlow Lite Metadata Writer API. Kod języka en
maxResults Ustawia opcjonalną maksymalną liczbę wyników klasyfikacji o najwyższych wynikach, które mają zostać zwrócone. Jeśli wartość jest mniejsza od 0, zwracane są wszystkie dostępne wyniki. dowolne liczby dodatnie, -1
scoreThreshold Ustawia próg wyniku prognozy, który zastępuje próg podany w metadanych modelu (jeśli taki istnieje). Wyniki poniżej tej wartości są odrzucane. [0.0, 1.0] Nie ustawiono
categoryAllowlist Ustawia opcjonalną listę dozwolonych nazw kategorii. Jeśli nie jest pusta, wyniki klasyfikacji, których nazwa kategorii nie znajduje się w tym zbiorze, zostaną odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja wyklucza się wzajemnie z opcją categoryDenylist, a użycie obu powoduje błąd. Dowolne ciągi Nie ustawiono
categoryDenylist Ustawia opcjonalną listę nazw kategorii, które są niedozwolone. Jeśli ten zbiór nie jest pusty, wyniki klasyfikacji, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja wyklucza się wzajemnie z opcją categoryAllowlist, a użycie obu powoduje błąd. Dowolne ciągi Nie ustawiono

Przygotuj dane

Klasyfikator dźwięku działa z klipami i strumieniami audio oraz z plikami audio w dowolnym formacie obsługiwanym przez przeglądarkę hosta. Zadanie obsługuje wstępne przetwarzanie danych wejściowych, w tym ponowne próbkowanie, buforowanie i kadrowanie.

Uruchamianie zadania

Klasyfikator audio używa metody classify() do przeprowadzania wnioskowania w przypadku plików z klipami audio lub strumieni audio. Interfejs Audio Classifier API zwraca możliwe kategorie zdarzeń audio rozpoznanych w wejściowym nagraniu.

Wywołania metody Audio Classifier classify() działają synchronicznie i blokują wątek interfejsu użytkownika. Jeśli klasyfikujesz dźwięk z mikrofonu urządzenia, każda klasyfikacja będzie blokować główny wątek. Możesz temu zapobiec, wdrażając web workerów, aby uruchamiać classify() w innym wątku.

Poniższy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadania:

Klipy audio

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

Strumień audio

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

Aby zobaczyć pełniejszą implementację zadania klasyfikatora dźwięku, zapoznaj się z przykładem.

Obsługa i wyświetlanie wyników

Po zakończeniu wnioskowania zadanie klasyfikatora dźwięku zwraca obiekt AudioClassifierResult, który zawiera listę możliwych kategorii obiektów w dźwięku wejściowym.

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

Przykładowy kod klasyfikatora audio pokazuje, jak wyświetlać wyniki klasyfikacji zwrócone przez zadanie. Więcej informacji znajdziesz w przykładzie.