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:
- Sklonuj repozytorium git za pomocą tego polecenia:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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:
- AudioClassifierHelper.kt – Inicjuje klasyfikator audio, obsługuje model i przekazuje dostęp do niego wyboru.
- RecorderFragment.kt – Tworzy interfejs i kod sterujący do nagrywania dźwięku na żywo.
- LibraryFragment.kt – Tworzy interfejs i kod sterowania wyboru plików audio.
- ProbabilitiesAdapter.kt – Obsługuje i formatuje wyniki prognoz klasyfikatora.
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 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);
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.