Распознавание звуков и слов для Android

В этом руководстве показано, как использовать TensorFlow Lite с готовыми моделями машинного обучения для распознавания звуков и произнесенных слов в приложении Android. Модели классификации звука, подобные показанным в этом руководстве, можно использовать для обнаружения активности, определения действий или распознавания голосовых команд.

Анимированная демонстрация распознавания звука В этом руководстве показано, как загрузить пример кода, загрузить проект в Android Studio , а также объясняются ключевые части примера кода, чтобы вы могли начать добавлять эту функцию в свое собственное приложение. В примере кода приложения используется библиотека задач TensorFlow для аудио , которая выполняет большую часть записи и предварительной обработки аудиоданных. Дополнительные сведения о предварительной обработке звука для использования в моделях машинного обучения см. в разделе Подготовка и увеличение аудиоданных .

Классификация аудио с помощью машинного обучения

Модель машинного обучения в этом руководстве распознает звуки или слова из аудиосэмплов, записанных с помощью микрофона на устройстве Android. Пример приложения в этом руководстве позволяет переключаться между YAMNet/classifier , моделью, распознающей звуки, и моделью, распознающей определенные произнесенные слова, обученной с помощью инструмента TensorFlow Lite Model Maker . Модели выполняют прогнозы для аудиоклипов, которые содержат 15 600 отдельных семплов в каждом клипе и имеют продолжительность около 1 секунды.

Пример установки и запуска

В первой части этого руководства вы загружаете образец с GitHub и запускаете его с помощью Android Studio. В следующих разделах этого руководства рассматриваются соответствующие разделы примера, чтобы вы могли применить их к своим собственным приложениям для Android.

Системные Требования

  • Android Studio версии 2021.1.1 (Bumblebee) или выше.
  • Android SDK версии 31 или выше
  • Устройство Android с минимальной версией ОС SDK 24 (Android 7.0 – Nougat) с включенным режимом разработчика.

Получить пример кода

Создайте локальную копию кода примера. Вы будете использовать этот код для создания проекта в Android Studio и запуска примера приложения.

Чтобы клонировать и настроить пример кода:

  1. Клонируйте репозиторий git
    git clone https://github.com/tensorflow/examples.git
    
  2. При желании настройте свой экземпляр git на использование разреженной проверки, чтобы у вас были только файлы для примера приложения:

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

Импортируйте и запустите проект

Создайте проект на основе загруженного примера кода, соберите его и запустите.

Чтобы импортировать и построить проект примера кода:

  1. Запустите Android-студию .
  2. В Android Studio выберите «Файл» > «Создать» > «Импортировать проект» .
  3. Перейдите в каталог примера кода, содержащий файл build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ), и выберите этот каталог.

Если вы выберете правильный каталог, Android Studio создаст новый проект и соберет его. Этот процесс может занять несколько минут, в зависимости от скорости вашего компьютера и того, использовали ли вы Android Studio для других проектов. По завершении сборки Android Studio отображает сообщение BUILD SUCCESSFUL на панели состояния вывода сборки .

Чтобы запустить проект:

  1. В Android Studio запустите проект, выбрав «Выполнить» > «Запустить приложение» .
  2. Выберите подключенное устройство Android с микрофоном, чтобы протестировать приложение.

В следующих разделах показаны изменения, которые необходимо внести в существующий проект, чтобы добавить эту функциональность в ваше собственное приложение, используя этот пример приложения в качестве ориентира.

Добавить зависимости проекта

В вашем собственном приложении вы должны добавить определенные зависимости проекта для запуска моделей машинного обучения TensorFlow Lite и получить доступ к служебным функциям, которые преобразуют стандартные форматы данных, такие как аудио, в формат тензорных данных, который может обрабатываться используемой вами моделью.

В примере приложения используются следующие библиотеки TensorFlow Lite:

  • Библиотека задач TensorFlow Lite Audio API — предоставляет необходимые классы ввода аудиоданных, выполнение модели машинного обучения и выходные результаты обработки модели.

Следующие инструкции показывают, как добавить необходимые зависимости проекта в ваш собственный проект приложения Android.

Чтобы добавить зависимости модуля:

  1. В модуле, использующем TensorFlow Lite, обновите файл build.gradle модуля, включив в него следующие зависимости. В примере кода этот файл находится здесь: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. В Android Studio синхронизируйте зависимости проекта, выбрав « Файл» > «Синхронизировать проект с файлами Gradle» .

Инициализируйте модель машинного обучения

В своем приложении для Android вы должны инициализировать модель машинного обучения TensorFlow Lite с параметрами, прежде чем выполнять прогнозы с использованием модели. Эти параметры инициализации зависят от модели и могут включать такие параметры, как минимальные пороговые значения точности по умолчанию для прогнозов и метки для слов или звуков, которые может распознавать модель.

Модель TensorFlow Lite включает файл *.tflite , содержащий модель. Файл модели содержит логику прогнозирования и обычно включает метаданные о том, как интерпретировать результаты прогнозирования, например имена классов прогнозирования. Файлы модели должны храниться в каталоге src/main/assets вашего проекта разработки, как в примере кода:

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

Для удобства и читаемости кода в примере объявляется сопутствующий объект, определяющий параметры модели.

Чтобы инициализировать модель в вашем приложении:

  1. Создайте сопутствующий объект, чтобы определить настройки модели:

    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. Создайте настройки модели, создав объект AudioClassifier.AudioClassifierOptions :

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. Используйте этот объект настроек для создания объекта AudioClassifier TensorFlow Lite, содержащего модель:

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

Включить аппаратное ускорение

При инициализации модели TensorFlow Lite в вашем приложении вам следует рассмотреть возможность использования функций аппаратного ускорения, чтобы ускорить прогнозные расчеты модели. Делегаты TensorFlow Lite — это программные модули, которые ускоряют выполнение моделей машинного обучения с использованием специализированного оборудования обработки на мобильном устройстве, такого как графический процессор (GPU) или тензорный процессор (TPU). В примере кода используется делегат NNAPI для аппаратного ускорения выполнения модели:

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

Использование делегатов для запуска моделей TensorFlow Lite рекомендуется, но не обязательно. Дополнительные сведения об использовании делегатов с TensorFlow Lite см. в разделе Делегаты TensorFlow Lite .

Подготовьте данные для модели

В вашем приложении Android ваш код предоставляет данные модели для интерпретации путем преобразования существующих данных, таких как аудиоклипы, в формат данных Tensor , который может быть обработан вашей моделью. Данные в тензоре, которые вы передаете в модель, должны иметь определенные размеры или форму, соответствующие формату данных, используемых для обучения модели.

Модель YAMNet/классификатора и настраиваемые модели речевых команд , используемые в этом примере кода, принимают объекты данных Tensor, которые представляют одноканальные или монофонические аудиоклипы, записанные с частотой 16 кГц в клипах длительностью 0,975 секунды (15 600 выборок). Выполняя прогнозирование новых аудиоданных, ваше приложение должно преобразовать эти аудиоданные в объекты данных Tensor такого размера и формы. Аудио API библиотеки задач TensorFlow Lite выполнит преобразование данных за вас.

В примере кода класса AudioClassificationHelper приложение записывает звук в реальном времени с микрофонов устройства с помощью объекта Android AudioRecord . Код использует AudioClassifier для создания и настройки этого объекта для записи звука с частотой дискретизации, соответствующей модели. Код также использует AudioClassifier для создания объекта TensorAudio для хранения преобразованных аудиоданных. Затем объект TensorAudio передается модели для анализа.

Чтобы предоставить аудиоданные в модель ML:

  • Используйте объект AudioClassifier для создания объекта TensorAudio и объекта AudioRecord :

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

Запуск прогнозов

В вашем приложении для Android после подключения объекта AudioRecord и объекта TensorAudio к объекту AudioClassifier вы можете запустить модель на основе этих данных для получения прогноза или вывода . Пример кода для этого руководства выполняет прогнозирование клипов из входного аудиопотока, записанного в реальном времени, с определенной скоростью.

Выполнение модели требует значительных ресурсов, поэтому важно запускать прогнозы модели ML в отдельном фоновом потоке. В примере приложения используется объект [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) , чтобы изолировать обработку модели от других функций приложения.

Модели классификации аудио, которые распознают звуки с четким началом и концом, например слова, могут давать более точные прогнозы для входящего аудиопотока путем анализа перекрывающихся аудиоклипов. Этот подход помогает модели избежать пропущенных прогнозов для слов, обрезанных в конце клипа. В примере приложения каждый раз, когда вы запускаете прогноз, код извлекает последний клип продолжительностью 0,975 секунды из буфера аудиозаписи и анализирует его. Вы можете заставить модель анализировать перекрывающиеся аудиоклипы, установив для interval выполнения пула потоков анализа модели длину, меньшую, чем длина анализируемых клипов. Например, если ваша модель анализирует клипы продолжительностью 1 секунда и вы установили интервал в 500 миллисекунд, модель каждый раз будет анализировать последнюю половину предыдущего клипа и 500 миллисекунд новых аудиоданных, создавая перекрытие анализа клипа на 50%.

Чтобы начать прогнозирование аудиоданных:

  1. Используйте метод AudioClassificationHelper.startAudioClassification() , чтобы начать запись звука для модели:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. Установите, как часто модель генерирует выводы из аудиоклипов, задав фиксированный interval частоты в объекте ScheduledThreadPoolExecutor :

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. Объект classifyRunnable в приведенном выше коде выполняет метод AudioClassificationHelper.classifyAudio() , который загружает последние доступные аудиоданные из рекордера и выполняет прогноз:

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

Остановить обработку прогноза

Убедитесь, что код вашего приложения перестает выполнять классификацию аудио, когда фрагмент или действие обработки аудио вашего приложения теряет фокус. Постоянное использование модели машинного обучения существенно влияет на время автономной работы устройства Android. Используйте метод onPause() действия Android или фрагмента, связанного с классификацией звука, чтобы остановить запись звука и обработку прогнозирования.

Чтобы остановить запись и классификацию звука:

  • Используйте метод AudioClassificationHelper.stopAudioClassification() , чтобы остановить запись и выполнение модели, как показано ниже в классе AudioFragment :

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

Обработка вывода модели

В вашем приложении Android после обработки аудиоклипа модель создает список прогнозов, которые должен обрабатывать код вашего приложения, выполняя дополнительную бизнес-логику, отображая результаты пользователю или выполняя другие действия. Выходные данные любой модели TensorFlow Lite различаются в зависимости от количества прогнозов, которые она создает (один или несколько), а также описательной информации для каждого прогноза. В случае моделей в примере приложения прогнозы представляют собой список распознанных звуков или слов. Объект параметров AudioClassifier, используемый в примере кода, позволяет вам установить максимальное количество прогнозов с помощью метода setMaxResults() , как показано в разделе «Инициализация модели ML ».

Чтобы получить результаты прогнозирования из модели:

  1. Получите результаты метода classify() объекта AudioClassifier и передайте их объекту-прослушивателю (ссылка на код):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. Используйте функцию onResult() прослушивателя для обработки вывода, выполняя бизнес-логику или отображая результаты пользователю:

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

Модель, используемая в этом примере, генерирует список прогнозов с меткой для классифицированного звука или слова и оценкой прогноза от 0 до 1 в виде числа с плавающей запятой, представляющего достоверность прогноза, где 1 — это наивысший рейтинг достоверности. В целом прогнозы с оценкой ниже 50% (0,5) считаются неубедительными. Однако то, как вы обрабатываете результаты прогнозирования с низким значением, зависит от вас и потребностей вашего приложения.

Как только модель вернет набор результатов прогнозирования, ваше приложение может действовать на основе этих прогнозов, представляя результат вашему пользователю или выполняя дополнительную логику. В примере кода приложение перечисляет идентифицированные звуки или слова в пользовательском интерфейсе приложения.

Следующие шаги

Дополнительные модели TensorFlow Lite для обработки звука можно найти в TensorFlow Hub и на странице руководства по предварительно обученным моделям . Дополнительную информацию о реализации машинного обучения в вашем мобильном приложении с помощью TensorFlow Lite см. в Руководстве разработчика TensorFlow Lite .