Przewodnik po klasyfikacji audio w przeglądarce

Zadanie MediaPipe Audio Classifier umożliwia klasyfikację danych audio. Możesz użyć tego zadania do identyfikowania zdarzeń dźwiękowych z zestawu nauczonych kategorii. Z tych instrukcji dowiesz się, jak używać Klasyfikatora dźwięku w węzłach i aplikacjach internetowych.

Aby zobaczyć, jak działa to zadanie, obejrzyj prezentację. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod Audio Classifier zawiera pełną implementację tego zadania w JavaScript do celów referencyjnych. Ten kod pomoże Ci przetestować to zadanie i zacząć tworzyć własną aplikację do klasyfikacji dźwięków. Możesz wyświetlić, uruchomić i edytować przykładowy kod Klasyfikatora dźwięku w przeglądarce internetowej.

Konfiguracja

W tej sekcji znajdziesz opis kluczowych kroków, które należy wykonać, aby skonfigurować środowisko programistyczne i projektować kodowanie na potrzeby Klasyfikatora audio. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby zadań MediaPipe, w tym o wymaganiach dotyczących wersji platformy, znajdziesz w przewodniku konfiguracji dla aplikacji internetowych.

Pakiety JavaScript

Kod klasyfikacji audio jest dostępny w pakiecie @mediapipe/tasks-audio NPM MediaPipe. Te biblioteki możesz znaleźć i pobrać za pomocą linków dostępnych w przewodniku po konfiguracji platformy.

Wymagane pakiety możesz zainstalować za pomocą tego polecenia na potrzeby lokalnego środowiska wykonawczego, korzystając z tego polecenia:

npm install @mediapipe/tasks-audio

Jeśli chcesz zaimportować kod zadania przez usługę sieci dostarczania treści (CDN), dodaj ten kod do 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 zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach Klasyfikatora dźwięku znajdziesz w sekcji poświęconej modelom na temat zadań.

Wybierz i pobierz model, a następnie zapisz go w katalogu projektu, na przykład:

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

Tworzenie zadania

Użyj 1 z funkcji Klasyfikatora dźwięku createFrom...(), aby przygotować zadanie do uruchamiania 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 skompilować 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"
    }
  });

Implementacja przykładowego kodu Klasyfikatora dźwięku pozwala użytkownikowi wybrać tryb przetwarzania. Takie podejście zwiększa złożoność kodu tworzenia zadania i może nie być odpowiednie w Twoim przypadku. Poszczególne tryby są widoczne w funkcjach runAudioClassification() i runStreamingAudioClassification() w example code.

Opcje konfiguracji

To zadanie ma następujące opcje konfiguracji dla aplikacji internetowych i JavaScript:

Nazwa opcji Opis Zakres wartości Wartość domyślna
displayNamesLocale Ustawia język etykiet, które mają być używane w przypadku nazw wyświetlanych w metadanych modelu zadania (jeśli są dostępne). Wartość domyślna w języku angielskim to en. Za pomocą TensorFlow Lite MetadataWriter API możesz dodawać zlokalizowane etykiety do metadanych modelu niestandardowego. Kod języka en
maxResults Określa opcjonalną maksymalną liczbę zwracanych wyników klasyfikacji o najwyższych wynikach. Jeśli wartość jest mniejsza niż 0, zostaną zwrócone 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 istnieją). Wyniki poniżej tej wartości zostały odrzucone. [0,0; 1,0] Nie ustawiono
categoryAllowlist Ustawia opcjonalną listę dozwolonych nazw kategorii. Jeśli nie będzie pusty, wyniki klasyfikacji, których nazwy kategorii nie ma w tym zbiorze, zostaną odfiltrowane. Zduplikowane i nieznane nazwy kategorii są ignorowane. Ta opcja wzajemnie się wyklucza, categoryDenylist i ich użycie kończy się błędem. Dowolne ciągi Nie ustawiono
categoryDenylist Ustawia opcjonalną listę niedozwolonych nazw kategorii. Jeśli pole nie jest puste, wyniki klasyfikacji, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane. Zduplikowane i nieznane nazwy kategorii są ignorowane. Ta opcja wzajemnie się wyklucza z categoryAllowlist, a korzystanie z obu daje błąd. Dowolne ciągi Nie ustawiono

Przygotuj dane

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

Uruchamianie zadania

Klasyfikator dźwięku korzysta z metody classify() do uruchamiania wnioskowania w przypadku plików klipów audio lub strumieni audio. Interfejs Audio Classifier API zwraca możliwe kategorie zdarzeń audio rozpoznawanych w wejściowej ścieżce audio.

Wywołania metody classify() Klasyfikatora dźwięku są uruchamiane synchronicznie i blokują wątek interfejsu użytkownika. Jeśli zaklasyfikujesz dźwięk z mikrofonu urządzenia, każda klasyfikacja zablokuje wątek główny. Aby temu zapobiec, zaimplementuj instancje robocze, które uruchamiają classify() w innym wątku.

Ten kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadań:

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

Pełną implementację uruchamiania zadania Klasyfikatora dźwięku znajdziesz w przykładowym kodzie.

Obsługa i wyświetlanie wyników

Po zakończeniu uruchomienia wnioskowania zadanie Audio Classifier zwraca obiekt AudioClassifierResult zawierający listę możliwych kategorii obiektów w wejściowej ścieżce dźwiękowej.

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 dźwięku pokazuje, jak wyświetlać wyniki klasyfikacji zwrócone przez zadanie. Więcej informacji znajdziesz w przykładowym kodzie.