Przewodnik po klasyfikacji audio w Androidzie

Zadanie MediaPipe Audio Classifier umożliwia klasyfikację danych audio. Dostępne opcje użyj tego zadania do zidentyfikowania zdarzeń dźwiękowych na podstawie zestawu nauczonych kategorii. Te te instrukcje pokażą Ci, jak używać klasyfikatora dźwięku z aplikacjami na Androida.

Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przeglądem.

Przykładowy kod

Przykładowy kod MediaPipe Tasks to prosta implementacja klasyfikatora dźwięku na Androida. W tym przykładzie użyto mikrofonu urządzenia z Androidem, nieustannie klasyfikować dźwięki, a także uruchamiać klasyfikator dla plików dźwiękowych. zapisanych na urządzeniu.

Możesz użyć tej aplikacji jako punktu wyjścia dla własnej aplikacji na Androida lub odnieść się do niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod klasyfikatora audio jest hostowany GitHub

Pobieranie kodu

Poniżej znajdziesz instrukcje tworzenia lokalnej kopii przykładu. za pomocą narzędzia wiersza poleceń git.

Aby pobrać przykładowy kod:

  1. Sklonuj repozytorium git za pomocą tego polecenia:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opcjonalnie możesz skonfigurować instancję git tak, aby wykorzystywała rozproszony proces płatności, masz więc tylko pliki z przykładowej aplikacji Klasyfikator dźwięku:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Po utworzeniu lokalnej wersji przykładowego kodu możesz zaimportować projekt w Android Studio i uruchom aplikację. Instrukcje znajdziesz w Przewodnik po konfiguracji na Androida

Kluczowe elementy

Te pliki zawierają kluczowy kod dla tego dźwięku przykład zastosowania klasyfikacji:

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których wykorzystano klasyfikator audio. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy, patrz Przewodnik po konfiguracji na Androida

Zależności

Klasyfikator dźwięku korzysta z biblioteki com.google.mediapipe:tasks-audio. Dodaj to zależności od pliku build.gradle Projekt tworzenia aplikacji na Androida. Zaimportuj wymagane zależności za pomocą: ten kod:

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

Model

Zadanie MediaPipe Audio Classifier wymaga wytrenowanego modelu zgodnego z tym zadanie. Więcej informacji o dostępnych wytrenowanych modelach na potrzeby klasyfikatora dźwięku znajdziesz tutaj zapoznaj się z omówieniem zadania sekcją Modele.

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

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

Użyj metody BaseOptions.Builder.setModelAssetPath(), aby podać ścieżkę używane przez model. Tę metodę przywołaliśmy w przykładzie kodu w następnym .

W przykładowy kod klasyfikatora dźwięku, model jest zdefiniowany w AudioClassifierHelper.kt .

Tworzenie zadania

Do utworzenia zadania możesz użyć funkcji createFromOptions. Funkcja createFromOptions akceptuje opcje konfiguracji, w tym uruchomione tryb, język wyświetlanych nazw, maksymalna liczba wyników, próg ufności, oraz listy dozwolonych lub odrzuconych kategorii. Więcej informacji o konfiguracji Więcej informacji znajdziesz w artykule Omówienie konfiguracji.

Zadanie Klasyfikator dźwięku obsługuje te typy danych wejściowych: klipy audio i strumienie audio. Musisz określić tryb działania odpowiadający parametrowi typ danych wejściowych podczas tworzenia zadania. Wybierz kartę odpowiadającą typ danych wejściowych, aby zobaczyć, jak utworzyć zadanie i uruchomić wnioskowanie.

Klipy audio

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

Strumień audio

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

Przykładowa implementacja kodu klasyfikatora audio pozwala użytkownikowi przełączać się między i przetwarzania danych. Takie podejście sprawia, że kod tworzenia zadań jest bardziej skomplikowany, może nie być odpowiednia w Twoim przypadku użycia. Zobaczysz kod przełączania trybu w funkcji initClassifier() funkcji AudioClassifierHelper

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji na Androida:

Nazwa opcji Opis Zakres wartości Wartość domyślna
runningMode Ustawia tryb działania zadania. Klasyfikator dźwięku ma 2 tryby:

AUDIO_CLIPS: tryb uruchamiania zadania audio na niezależnych klipach audio.

AUDIO_STREAM: tryb uruchamiania zadania dotyczącego dźwięku w strumieniu audio, np. z mikrofonu. W tym trybie detektor wyników musi mieć wartość wywołana w celu skonfigurowania detektora odbierającego wyniki klasyfikacji asynchronicznie.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale Ustawia język etykiet, które mają być używane w przypadku nazw wyświetlanych w kolumnie metadane modelu zadania, jeśli są dostępne. Wartość domyślna to en dla Angielski. Do metadanych modelu niestandardowego możesz dodać zlokalizowane etykiety za pomocą interfejsu TensorFlow Lite Metadata Writer API. Kod języka en
maxResults Ustawia opcjonalną maksymalną liczbę wyników klasyfikacji na . Jeśli < 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 polu metadane modelu (jeśli występują). Wyniki poniżej tej wartości zostały odrzucone. [0,0; 1,0] Nie ustawiono
categoryAllowlist Ustawia opcjonalną listę dozwolonych nazw kategorii. Jeśli pole nie jest puste, wyniki klasyfikacji, których nazwa kategorii nie znajduje się w tym zbiorze, zostaną zostały odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja nie działa z usługą categoryDenylist i korzysta z funkcji skutkuje to błędem. Dowolne ciągi Nie ustawiono
categoryDenylist Ustawia opcjonalną listę nazw kategorii, które nie są dozwolone. Jeśli niepuste, wyniki klasyfikacji, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane na zewnątrz. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja jest wzajemna tylko w polu categoryAllowlist, co spowoduje błąd. Dowolne ciągi Nie ustawiono
resultListener Konfiguruje detektor wyników, aby otrzymywać wyniki klasyfikacji asynchronicznie, gdy klasyfikator dźwięku jest w strumieniu audio. i trybu uzyskiwania zgody. Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na AUDIO_STREAM Nie dotyczy Nie ustawiono
errorListener Ustawia opcjonalny detektor błędów. Nie dotyczy Nie ustawiono

Przygotuj dane

Klasyfikator dźwięku działa z klipami audio i strumieniami audio. Zadanie obsługuje wstępne przetwarzanie danych wejściowych, w tym ponowne próbkowanie, buforowanie i ramkowanie. Należy jednak przekonwertować wejściowe dane dźwiękowe na com.google.mediapipe.tasks.components.containers.AudioData przed przekazaniem go do zadania Klasyfikator dźwięku.

Klipy audio

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

Strumień audio

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)
    

Uruchamianie zadania

Możesz wywołać funkcję classify odpowiadającą Twojemu trybowi biegowemu, aby: zależności wyzwalaczy. Interfejs Audio Classifier API zwraca możliwe kategorie zdarzenia dźwiękowe rozpoznawane w wejściowych danych dźwiękowych.

Klipy audio

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Strumień audio

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

Pamiętaj:

  • Jeśli działasz w trybie strumienia audio, musisz też podać: Zadanie klasyfikatora dźwięku z sygnaturą czasową do śledzenia, jakie dane dźwiękowe są w nim zawarte strumień posłużył do wnioskowania.
  • W przypadku modelu klipów audio zadanie Klasyfikatora dźwięku blokuje zadania. w bieżącym wątku aż do zakończenia przetwarzania wejściowego dźwięku. Aby uniknąć blokowania odpowiedzi interfejsu, wykonaj przetwarzanie w w wątku w tle.

Oto przykład uruchomienia klasyfikatora audio z klipami audio. Zobacz AudioClassifierHelper zajęcia w przykładowy kod.

Obsługa i wyświetlanie wyników

Po przeprowadzeniu wnioskowania zadanie Klasyfikator dźwięku zwraca listę możliwych kategorii zdarzeń dźwiękowych w wejściowym dźwięku. Następująca strona pokazuje przykładowe dane wyjściowe tego zadania:

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

W aplikacji na Androida zadanie zwraca ClassificationResult, który zawiera lista obiektów AudioClassifierResult reprezentujących prognozy dla zdarzenie dźwiękowe, w tym etykietę kategorii i wskaźnik ufności.

Klipy audio

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

Strumień audio

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

Oto przykład, jak wyświetlić klasyfikację wyników zwróconych przez to zadanie w klasie ProbabilitiesAdapter funkcji przykładowy kod.