Tworzenie podstawowej aplikacji do klasyfikacji dźwięku

1. Zanim zaczniesz

TensorFlow to wszechstronna platforma systemów uczących się. Może być używany do trenowania dużych modeli w klastrach w chmurze lub do uruchamiania modeli lokalnie w osadzonym systemie, takim jak telefon.

To wyzwanie korzysta z TensorFlow Lite do uruchamiania modelu klasyfikacji audio na urządzeniu z Androidem.

Czego się nauczysz

  • Jak znaleźć wytrenowany model systemów uczących się gotowy do użycia.
  • Jak klasyfikować dźwięk w czasie rzeczywistym?
  • Dowiedz się, jak korzystać z Biblioteki pomocy TensorFlow Lite, aby wstępnie przetwarzać dane wejściowe modelu i dokonać ich przetwarzania.
  • Jak korzystać z Biblioteki zadań audio, aby wykonywać wszystkie zadania związane z dźwiękiem.

Co stworzysz

Prosta aplikacja do rozpoznawania dźwięku, która uruchamia model rozpoznawania dźwięku TensorFlow Lite do identyfikowania dźwięku z mikrofonu w czasie rzeczywistym

33af0fdb0a027fa8.png

Czego potrzebujesz

  • Najnowsza wersja Androida Studio (wersja 4.1.2 lub nowsza)
  • Fizyczne urządzenie z Androidem w wersji API 23 (Android 6.0)
  • Przykładowy kod
  • Podstawowa wiedza na temat rozwoju Androida w Kotlinie

2. Pobieranie przykładowego kodu

Pobieranie kodu

Aby pobrać cały kod do tych ćwiczeń z programowania, kliknij ten link:

Rozpakuj pobrany plik ZIP. Spowoduje to rozpakowanie folderu głównego (odml-pathways) ze wszystkimi potrzebnymi zasobami. W tym ćwiczeniu z programowania będziesz potrzebować tylko źródeł w podkatalogu audio_classification/codelab1/android.

Uwaga: jeśli wolisz, możesz skopiować repozytorium:

git clone https://github.com/googlecodelabs/odml-pathways.git

Podkatalog android w repozytorium audio_classification/codelab1/android zawiera 2 katalogi:

  • folder_android_studio.pngstarter – kod uruchamiany na potrzeby tego ćwiczenia.
  • folder_android_studio.pngfinal (końcowy) – gotowy kod gotowej aplikacji.

Importowanie aplikacji startowej

Zacznijmy od zaimportowania aplikacji startowej do Android Studio.

  1. Otwórz Androida Studio i wybierz Importuj projekt (Gradle, Eclipse ADT itp.)
  2. Otwórz folder starter (audio_classification/codelab1/android/starter) z pobranego wcześniej kodu źródłowego.

7C0f27882a2698ac.png

Aby mieć pewność, że wszystkie zależności są dostępne dla Twojej aplikacji, musisz zsynchronizować projekt z plikami Gradle po zakończeniu procesu importowania.

  1. Na pasku narzędzi Androida Studio wybierz Sync Project with Gradle Files (Synchronizuj projekt z plikami Gradle) (b451ab2d04d835f9.png).

Uruchamianie aplikacji startowej

Po zaimportowaniu projektu do Android Studio możesz uruchomić aplikację po raz pierwszy.

Podłącz urządzenie z Androidem przez USB do komputera i kliknij Uruchom ( wykonaj.png) na pasku narzędzi Android Studio.

5518972c21705945.png

3. Znajdowanie wytrenowanego modelu

Klasyfikacja dźwięku jest niezbędna. Zacznij od wytrenowanego modelu, aby nie trzeba było go trenować samodzielnie.

Aby znaleźć wytrenowane modele, użyj TensorFlow Hub ( www.tfhub.dev).

91e39900ff58818c

Modele są podzielone na domeny. Obecnie potrzebne są domeny problemów z dźwiękiem.

9d44d38c297bf3dc.png

W przypadku aplikacji przeprowadzisz klasyfikację zdarzeń za pomocą modelu YAMNet.

YAMNet to klasyfikator zdarzeń dźwiękowych, który wykorzystuje falę dźwiękową jako dane wejściowe i tworzy niezależne prognozy dla każdego zdarzenia audio 521.

Model yamnet/classification został już przekonwertowany na kod TensorFlow Lite i zawiera określone metadane, które umożliwiają użycie biblioteki zadań TFLite dla audio, aby ułatwić korzystanie z tego modelu na urządzeniach mobilnych.

65dc0f610eb27762.png

Wybierz odpowiednią kartę: TFLite (yamnet/classification/tflite) i kliknij Download (Pobierz). Na dole możesz też zobaczyć metadane modelu.

gk3cfeb310e1f51.png

Ten plik modelu (lite-model_yamnet_classification_tflite_1.tflite) zostanie użyty w następnym kroku.

4. Importowanie nowego modelu do aplikacji podstawowej

Pierwszym krokiem jest przeniesienie pobranego modelu z poprzedniego kroku do folderu zasobów w aplikacji.

W Android Studio w eksploratorze projektu kliknij prawym przyciskiem myszy folder assets.

7cca2c22ed8cf4c8.png

Pojawi się wyskakujące okienko z listą opcji. Jednym z nich jest otwarcie folderu w systemie plików. Na Macu będzie to Reveal Finder, w systemie Windows – Open in Explorer (Otwórz w Eksploratorze), a w systemie Ubuntu – Show in Files. Wybierz odpowiednią dla swojego systemu operacyjnego i wybierz ją.

95e0eca881d35f6b.png

Następnie skopiuj do niego pobrany model.

Gdy to zrobisz, wróć do Androida Studio – plik powinien znajdować się w folderze assets.

703b1842fb09e893.png

5. Wczytaj nowy model do aplikacji podstawowej

Teraz wykonasz niektóre zadania do wykonania i włączysz klasyfikację dźwięku na podstawie modelu dodanego przed chwilą do projektu w poprzednim kroku.

Aby znaleźć Listę zadań do wykonania, w Android Studio otwórz menu: Widok > Narzędzie Windows > TODO. Otworzy się okno z listą i możesz go kliknąć, aby przejść bezpośrednio do kodu.

W pliku build.gradle (w wersji modułu) znajdziesz pierwsze zadanie.

TODO 1: dodaj zależności Androida:

implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'

Pozostałe zmiany w kodzie zostaną udostępnione MainActivity

TODO 2.1 tworzy zmienną o nazwie modelu w celu wczytania w następnych krokach.

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

TODO 2.2 zdefiniujesz minimalny próg, który chcesz zaakceptować na podstawie prognozy. Ta zmienna zostanie użyta później.

var probabilityThreshold: Float = 0.3f

TODO 2.3 to miejsce, w którym możesz wczytać model z folderu zasobów. Klasa AudioClassifier zdefiniowana w Bibliotece zadań audio jest gotowa do załadowania modelu i udostępnia wszystkie metody potrzebne do uruchamiania wnioskowania, a także pomaga w tworzeniu nagrania.

val classifier = AudioClassifier.createFromFile(this, modelPath)

6. Przechwytuj dźwięk

Interfejs Audio Tasks API ma kilka metod pomocnych w tworzeniu rejestratora dźwięku o odpowiedniej konfiguracji, której oczekuje Twój model (np. częstotliwość próbkowania, szybkość transmisji bitów, liczba kanałów). Dzięki temu nie musisz go znajdować ręcznie. Możesz też tworzyć obiekty konfiguracyjne.

TODO 3.1: utwórz zmienną tensora, która będzie przechowywać nagranie do wnioskowania i utwórz specyfikację formatu dla dyktafonu.

val tensor = classifier.createInputTensorAudio()

TODO 3.2: wyświetla dane techniczne Dyktafonu zdefiniowane przez metadane modelu w poprzednim kroku.

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

92e81894674a5b0.png

TODO 3.3: utwórz rejestrator dźwięku i rozpocznij nagrywanie.

val record = classifier.createAudioRecord()
record.startRecording()

Obecnie aplikacja słucha dźwięku z mikrofonu telefonu, ale nie ma to żadnych wpływu na działanie. W następnym kroku zajmiemy się tą sprawą.

7. Dodaj wnioskowanie do modelu

W tym kroku dodasz kod sugerowany do aplikacji i pokażesz go na ekranie. Kod ma już wątek minutnika, który jest uruchamiany co pół sekundy. To w nim będzie wykonywane wnioskowanie.

Parametry metody scheduleAtFixedRate określają, jak długo musi upłynąć, zanim rozpocznie się wykonywanie zadania, oraz czas między kolejnymi wykonaniami. Użyj kodu poniżej 500 milisekund.

Timer().scheduleAtFixedRate(1, 500) {
...
}

TODO 4.1 Dodaj kod, by użyć modelu. Najpierw wczytaj nagranie do tensora audio i przekaż je do klasyfikatora:

tensor.load(record)
val output = classifier.classify(tensor)

TODO 4.2, by uzyskać lepsze wyniki wnioskowania, odfiltrowujemy wszystkie klasyfikacje o bardzo małym prawdopodobieństwie. W tym miejscu użyjesz zmiennej utworzonej w poprzednim kroku (probabilityThreshold):

val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}

TODO 4.3: Aby ułatwić odczytywanie wyników, utwórz ciąg znaków z filtrowanymi wynikami:

val outputStr = filteredModelOutput.sortedBy { -it.score }
   .joinToString(separator = "\n") { "${it.label} -> ${it.score} " }

TODO 4.4 Zaktualizuj interfejs użytkownika. W tej prostej aplikacji wynik jest po prostu wyświetlany w elemencie TextView. Ponieważ klasyfikacja nie jest w wątku głównym, musisz zaktualizować te elementy za pomocą modułu obsługi.

runOnUiThread {
   textView.text = outputStr
}

Dodano cały kod niezbędny do:

  • Wczytaj model z folderu zasobów
  • Utwórz rejestrator dźwięku z odpowiednią konfiguracją
  • Bieżące sprawdzanie
  • Pokaż najlepsze wyniki na ekranie

Teraz wystarczy tylko przetestować aplikację.

8. Uruchamianie ostatecznej wersji aplikacji

Zintegrowano z aplikacją model klasyfikacji dźwięku, więc przetestujmy go.

Podłącz urządzenie z Androidem i kliknij Uruchom ( wykonaj.png) na pasku narzędzi Android Studio.

Przy pierwszym uruchomieniu musisz przyznać aplikacji uprawnienia do nagrywania dźwięku.

Gdy to zrobisz, aplikacja będzie korzystać z mikrofonu telefonu. Aby przetestować tę funkcję, zacznij mówić w pobliżu telefonu, ponieważ jedną z klas wykrytych przez YAMNet jest mowa. Inna klasa, którą można łatwo przetestować, to pękanie lub klaśnięcie.

Możesz też wykrywać szczekanie psa i wiele innych zdarzeń (521). Pełną listę znajdziesz w kodzie źródłowym tych plików. Możesz też bezpośrednio przejrzeć metadane w pliku etykiet.

33af0fdb0a027fa8.png

9. Gratulacje!

Dzięki nim dowiesz się, jak znaleźć wytrenowany model do klasyfikacji dźwięku i wdrożyć go w aplikacji mobilnej za pomocą TensorFlow Lite. Aby dowiedzieć się więcej o TFLite, zobacz inne przykłady TFLite.

Omawiane zagadnienia

  • Jak wdrożyć model TensorFlow Lite w aplikacji na Androida.
  • Jak znaleźć i wykorzystać modele z TensorFlow Hub.

Następne kroki

  • Dostosuj model na podstawie własnych danych.

Więcej informacji

Masz pytanie?

Zgłaszanie problemów