Rozpoznawanie dźwięków i słów dla Androida

W tym samouczku pokazano, jak używać TensorFlow Lite z wstępnie zbudowanymi modelami uczenia maszynowego do rozpoznawania dźwięków i wypowiadanych słów w aplikacji na Androida. Modeli klasyfikacji dźwięku, takich jak te pokazane w tym samouczku, można używać do wykrywania aktywności, identyfikowania działań lub rozpoznawania poleceń głosowych.

Animowane demo rozpoznawania dźwięku W tym samouczku pokazano, jak pobrać przykładowy kod, załadować projekt do Android Studio i objaśnić kluczowe części przykładowego kodu, dzięki czemu można rozpocząć dodawanie tej funkcji do własnej aplikacji. Przykładowy kod aplikacji korzysta z biblioteki zadań TensorFlow dla audio , która obsługuje większość nagrywania i wstępnego przetwarzania danych audio. Aby uzyskać więcej informacji na temat wstępnego przetwarzania dźwięku na potrzeby modeli uczenia maszynowego, zobacz Przygotowanie i powiększanie danych audio .

Klasyfikacja dźwięku za pomocą uczenia maszynowego

Model uczenia maszynowego przedstawiony w tym samouczku rozpoznaje dźwięki lub słowa na podstawie próbek audio nagranych za pomocą mikrofonu na urządzeniu z systemem Android. Przykładowa aplikacja w tym samouczku umożliwia przełączanie między YAMNet/classifier , modelem rozpoznającym dźwięki, a modelem rozpoznającym określone słowa mówione, który został przeszkolony przy użyciu narzędzia TensorFlow Lite Model Maker . Modele przeprowadzają prognozy na klipach audio, które zawierają 15600 pojedynczych próbek na klip i trwają około 1 sekundy.

Przykład konfiguracji i uruchomienia

W pierwszej części tego samouczka pobierz przykład z GitHub i uruchom go przy użyciu Android Studio. W poniższych sekcjach tego samouczka omówiono odpowiednie sekcje przykładu, dzięki czemu można je zastosować do własnych aplikacji na Androida.

Wymagania systemowe

  • Android Studio w wersji 2021.1.1 (Bumblebee) lub nowszej.
  • Android SDK w wersji 31 ​​lub nowszej
  • Urządzenie z systemem Android z minimalną wersją systemu operacyjnego SDK 24 (Android 7.0 - Nougat) z włączonym trybem programisty.

Pobierz przykładowy kod

Utwórz lokalną kopię przykładowego kodu. Użyjesz tego kodu, aby utworzyć projekt w Android Studio i uruchomić przykładową aplikację.

Aby sklonować i skonfigurować przykładowy kod:

  1. Sklonuj repozytorium git
    git clone https://github.com/tensorflow/examples.git
    
  2. Opcjonalnie skonfiguruj instancję git tak, aby korzystała z rzadkiego pobierania, aby mieć tylko pliki przykładowej aplikacji:

    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/audio_classification/android
    

Zaimportuj i uruchom projekt

Utwórz projekt na podstawie pobranego przykładowego kodu, skompiluj projekt, a następnie uruchom go.

Aby zaimportować i zbudować przykładowy projekt kodu:

  1. Uruchom Android Studio .
  2. W Android Studio wybierz opcję Plik > Nowy > Importuj projekt .
  3. Przejdź do przykładowego katalogu kodu zawierającego plik build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) i wybierz ten katalog.

Jeśli wybierzesz właściwy katalog, Android Studio utworzy nowy projekt i go zbuduje. Ten proces może zająć kilka minut, w zależności od szybkości komputera i tego, czy korzystałeś z Android Studio w innych projektach. Po zakończeniu kompilacji Android Studio wyświetla komunikat BUILD SUCCESSFUL w panelu stanu wyników kompilacji .

Aby uruchomić projekt:

  1. W Android Studio uruchom projekt, wybierając opcję Uruchom > Uruchom „aplikację” .
  2. Wybierz podłączone urządzenie z systemem Android z mikrofonem, aby przetestować aplikację.

W kolejnych sekcjach przedstawiono modyfikacje, które należy wprowadzić w istniejącym projekcie, aby dodać tę funkcjonalność do własnej aplikacji, używając tej przykładowej aplikacji jako punktu odniesienia.

Dodaj zależności projektu

We własnej aplikacji musisz dodać określone zależności projektu, aby uruchomić modele uczenia maszynowego TensorFlow Lite i uzyskać dostęp do funkcji narzędziowych, które konwertują standardowe formaty danych, takie jak audio, na format danych tensorowy, który może być przetwarzany przez używany model.

Przykładowa aplikacja korzysta z następujących bibliotek TensorFlow Lite:

Poniższe instrukcje pokazują, jak dodać wymagane zależności projektu do własnego projektu aplikacji na Androida.

Aby dodać zależności modułów:

  1. W module korzystającym z TensorFlow Lite zaktualizuj plik build.gradle modułu, aby uwzględnić następujące zależności. W przykładowym kodzie plik ten znajduje się tutaj: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. W Android Studio zsynchronizuj zależności projektu, wybierając: Plik > Synchronizuj projekt z plikami Gradle .

Zainicjuj model ML

W aplikacji na Androida musisz zainicjować model uczenia maszynowego TensorFlow Lite z parametrami, zanim uruchomisz prognozy z modelem. Te parametry inicjalizacji zależą od modelu i mogą obejmować ustawienia, takie jak domyślne minimalne progi dokładności przewidywań i etykiety słów lub dźwięków rozpoznawanych przez model.

Model TensorFlow Lite zawiera plik *.tflite zawierający model. Plik modelu zawiera logikę przewidywania i zazwyczaj zawiera metadane dotyczące sposobu interpretacji wyników przewidywań, takie jak nazwy klas przewidywań. Pliki modeli powinny być przechowywane w katalogu src/main/assets Twojego projektu deweloperskiego, jak w przykładzie kodu:

  • <project>/src/main/assets/yamnet.tflite

Dla wygody i czytelności kodu w przykładzie zadeklarowano obiekt towarzyszący, który definiuje ustawienia modelu.

Aby zainicjować model w aplikacji:

  1. Utwórz obiekt towarzyszący, aby zdefiniować ustawienia modelu:

    companion object {
      const val DISPLAY_THRESHOLD = 0.3f
      const val DEFAULT_NUM_OF_RESULTS = 2
      const val DEFAULT_OVERLAP_VALUE = 0.5f
      const val YAMNET_MODEL = "yamnet.tflite"
      const val SPEECH_COMMAND_MODEL = "speech.tflite"
    }
    
  2. Utwórz ustawienia dla modelu, budując obiekt AudioClassifier.AudioClassifierOptions :

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. Użyj tego obiektu ustawień, aby skonstruować obiekt TensorFlow Lite AudioClassifier zawierający model:

    classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
    

Włącz akcelerację sprzętową

Inicjując model TensorFlow Lite w aplikacji, należy rozważyć użycie funkcji akceleracji sprzętowej, aby przyspieszyć obliczenia predykcyjne modelu. Delegaci TensorFlow Lite to moduły oprogramowania, które przyspieszają wykonywanie modeli uczenia maszynowego przy użyciu specjalistycznego sprzętu przetwarzającego na urządzeniu mobilnym, takiego jak jednostka przetwarzania grafiki (GPU) lub jednostka przetwarzania tensor (TPU). Przykładowy kod wykorzystuje delegata NNAPI do obsługi sprzętowego przyspieszania wykonywania modelu:

val baseOptionsBuilder = BaseOptions.builder()
   .setNumThreads(numThreads)
...
when (currentDelegate) {
   DELEGATE_CPU -> {
       // Default
   }
   DELEGATE_NNAPI -> {
       baseOptionsBuilder.useNnapi()
   }
}

Zalecane jest używanie delegatów do uruchamiania modeli TensorFlow Lite, ale nie jest to wymagane. Aby uzyskać więcej informacji na temat używania delegatów z TensorFlow Lite, zobacz Delegaty TensorFlow Lite .

Przygotuj dane do modelu

W aplikacji na Androida kod dostarcza dane do modelu w celu interpretacji, przekształcając istniejące dane, takie jak klipy audio, w format danych Tensor , który może być przetwarzany przez model. Dane w Tensorze przekazywane do modelu muszą mieć określone wymiary lub kształt pasujący do formatu danych używanych do uczenia modelu.

Model YAMNet/klasyfikatora i dostosowane modele poleceń głosowych użyte w tym przykładzie kodu akceptują obiekty danych Tensor, które reprezentują jednokanałowe lub monofoniczne klipy audio nagrane przy częstotliwości 16 kHz w klipach trwających 0,975 sekundy (15600 próbek). Uruchamiając prognozy dotyczące nowych danych audio, aplikacja musi przekształcić te dane audio w obiekty danych Tensor o odpowiednim rozmiarze i kształcie. Interfejs API audio biblioteki zadań TensorFlow Lite obsługuje transformację danych za Ciebie.

W przykładowym kodzie klasy AudioClassificationHelper aplikacja nagrywa dźwięk na żywo z mikrofonów urządzenia przy użyciu obiektu Android AudioRecord . Kod używa AudioClassifier do zbudowania i skonfigurowania tego obiektu w celu nagrywania dźwięku z częstotliwością próbkowania odpowiednią dla modelu. Kod używa również AudioClassifier do zbudowania obiektu TensorAudio do przechowywania przekształconych danych audio. Następnie obiekt TensorAudio przekazywany jest do modelu w celu analizy.

Aby dostarczyć dane audio do modelu ML:

  • Użyj obiektu AudioClassifier , aby utworzyć obiekt TensorAudio i obiekt AudioRecord :

    fun initClassifier() {
    ...
      try {
        classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options)
        // create audio input objects
        tensorAudio = classifier.createInputTensorAudio()
        recorder = classifier.createAudioRecord()
      }
    

Uruchom prognozy

Po połączeniu obiektów AudioRecord i TensorAudio z obiektem AudioClassifier w aplikacji na Androida możesz uruchomić model na podstawie tych danych, aby uzyskać przewidywanie lub wnioskowanie . Przykładowy kod tego samouczka uruchamia prognozy klipów z nagranego na żywo strumienia wejściowego audio z określoną szybkością.

Wykonywanie modelu zużywa znaczne zasoby, dlatego ważne jest, aby uruchamiać prognozy modelu ML w osobnym wątku w tle. Przykładowa aplikacja używa obiektu [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) aby odizolować przetwarzanie modelu od innych funkcji aplikacji.

Modele klasyfikacji dźwięku, które rozpoznają dźwięki z wyraźnym początkiem i końcem, np. słowa, mogą generować dokładniejsze prognozy dotyczące przychodzącego strumienia audio poprzez analizę nakładających się klipów audio. Takie podejście pomaga modelowi uniknąć brakujących przewidywań dla słów uciętych na końcu klipu. W przykładowej aplikacji za każdym razem, gdy uruchamiasz prognozę, kod pobiera najnowszy klip o długości 0,975 sekundy z bufora nagrywania audio i analizuje go. Można zmusić model do analizowania nakładających się klipów audio, ustawiając wartość interval puli wykonywania wątków analizy modelu na długość krótszą niż długość analizowanych klipów. Na przykład, jeśli model analizuje 1-sekundowe klipy i ustawisz interwał na 500 milisekund, model będzie za każdym razem analizować ostatnią połowę poprzedniego klipu i 500 milisekund nowych danych audio, tworząc nakładanie się analizy klipów na poziomie 50%.

Aby rozpocząć prognozowanie danych audio:

  1. Użyj metody AudioClassificationHelper.startAudioClassification() , aby rozpocząć nagrywanie dźwięku dla modelu:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. Ustaw częstotliwość, z jaką model generuje wnioski na podstawie klipów audio, ustawiając stały interval w obiekcie ScheduledThreadPoolExecutor :

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. Obiekt classifyRunnable w powyższym kodzie wykonuje metodę AudioClassificationHelper.classifyAudio() , która ładuje najnowsze dostępne dane audio z rejestratora i przeprowadza prognozę:

    private fun classifyAudio() {
      tensorAudio.load(recorder)
      val output = classifier.classify(tensorAudio)
      ...
    }
    

Zatrzymaj przetwarzanie prognoz

Upewnij się, że kod aplikacji przestaje klasyfikować dźwięk, gdy fragment lub działanie przetwarzania dźwięku w aplikacji stracą ostrość. Ciągłe uruchamianie modelu uczenia maszynowego ma znaczący wpływ na żywotność baterii urządzenia z Androidem. Użyj metody onPause() działania lub fragmentu systemu Android powiązanego z klasyfikacją dźwięku, aby zatrzymać nagrywanie dźwięku i przetwarzanie prognoz.

Aby zatrzymać nagrywanie i klasyfikację dźwięku:

  • Aby zatrzymać nagrywanie i wykonanie modelu, użyj metody AudioClassificationHelper.stopAudioClassification() , jak pokazano poniżej w klasie AudioFragment :

    override fun onPause() {
      super.onPause()
      if (::audioHelper.isInitialized ) {
        audioHelper.stopAudioClassification()
      }
    }
    

Obsługuj dane wyjściowe modelu

W aplikacji na Androida po przetworzeniu klipu audio model generuje listę przewidywań, które musi obsłużyć kod aplikacji, wykonując dodatkową logikę biznesową, wyświetlając wyniki użytkownikowi lub podejmując inne działania. Dane wyjściowe dowolnego modelu TensorFlow Lite różnią się pod względem liczby generowanych przez niego prognoz (jednej lub wielu) oraz informacji opisowych dla każdej prognozy. W przypadku modeli w przykładowej aplikacji podpowiedzią jest albo lista rozpoznanych dźwięków, albo słów. Obiekt opcji AudioClassifier użyty w przykładzie kodu umożliwia ustawienie maksymalnej liczby przewidywań za pomocą metody setMaxResults() , jak pokazano w sekcji Inicjowanie modelu ML .

Aby uzyskać wyniki prognoz z modelu:

  1. Pobierz wyniki metody classify() obiektu AudioClassifier i przekaż je do obiektu słuchacza (odniesienie do kodu):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. Użyj funkcji onResult() odbiornika do obsługi danych wyjściowych, wykonując logikę biznesową lub wyświetlając wyniki użytkownikowi:

    private val audioClassificationListener = object : AudioClassificationListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        requireActivity().runOnUiThread {
          adapter.categoryList = results
          adapter.notifyDataSetChanged()
          fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
        }
      }
    

Model użyty w tym przykładzie generuje listę przewidywań z etykietą sklasyfikowanego dźwięku lub słowa oraz wynikiem przewidywania od 0 do 1 jako Float reprezentującym pewność przewidywania, gdzie 1 oznacza najwyższy wskaźnik pewności. Ogólnie przewidywania z wynikiem poniżej 50% (0,5) uważa się za niejednoznaczne. Jednak sposób obsługi wyników przewidywania o niskiej wartości zależy od Ciebie i potrzeb Twojej aplikacji.

Gdy model zwróci zestaw wyników przewidywań, aplikacja może zastosować się do tych przewidywań, prezentując wyniki użytkownikowi lub wykonując dodatkową logikę. W przypadku przykładowego kodu aplikacja wyświetla listę zidentyfikowanych dźwięków lub słów w interfejsie użytkownika aplikacji.

Następne kroki

Dodatkowe modele TensorFlow Lite do przetwarzania dźwięku można znaleźć w TensorFlow Hub oraz na stronie przewodnika po modelach wstępnie przeszkolonych . Aby uzyskać więcej informacji na temat wdrażania uczenia maszynowego w aplikacji mobilnej za pomocą TensorFlow Lite, zobacz Przewodnik programisty TensorFlow Lite .