Reconocimiento de sonidos y palabras para Android

Este tutorial le muestra cómo usar TensorFlow Lite con modelos de aprendizaje automático prediseñados para reconocer sonidos y palabras habladas en una aplicación de Android. Los modelos de clasificación de audio como los que se muestran en este tutorial se pueden utilizar para detectar actividad, identificar acciones o reconocer comandos de voz.

Demostración animada de reconocimiento de audio Este tutorial le muestra cómo descargar el código de ejemplo, cargar el proyecto en Android Studio y explica las partes clave del código de ejemplo para que pueda comenzar a agregar esta funcionalidad a su propia aplicación. El código de la aplicación de ejemplo utiliza la biblioteca de tareas de TensorFlow para audio , que maneja la mayor parte de la grabación y el preprocesamiento de datos de audio. Para obtener más información sobre cómo se preprocesa el audio para su uso con modelos de aprendizaje automático, consulte Preparación y aumento de datos de audio .

Clasificación de audio con aprendizaje automático

El modelo de aprendizaje automático de este tutorial reconoce sonidos o palabras de muestras de audio grabadas con un micrófono en un dispositivo Android. La aplicación de ejemplo en este tutorial le permite cambiar entre YAMNet/classifier , un modelo que reconoce sonidos y un modelo que reconoce palabras habladas específicas, que se entrenó con la herramienta TensorFlow Lite Model Maker . Los modelos ejecutan predicciones en clips de audio que contienen 15600 muestras individuales por clip y tienen aproximadamente 1 segundo de duración.

Ejemplo de configuración y ejecución

Para la primera parte de este tutorial, descargue la muestra de GitHub y ejecútela con Android Studio. Las siguientes secciones de este tutorial exploran las secciones relevantes del ejemplo, para que pueda aplicarlas a sus propias aplicaciones de Android.

Requisitos del sistema

  • Android Studio versión 2021.1.1 (Bumblebee) o superior.
  • Android SDK versión 31 o superior
  • Dispositivo Android con una versión mínima del sistema operativo SDK 24 (Android 7.0 - Nougat) con el modo de desarrollador habilitado.

Obtenga el código de ejemplo

Cree una copia local del código de ejemplo. Utilizará este código para crear un proyecto en Android Studio y ejecutar la aplicación de muestra.

Para clonar y configurar el código de ejemplo:

  1. Clonar el repositorio git
    git clone https://github.com/tensorflow/examples.git
    
  2. Opcionalmente, configure su instancia de git para usar el pago disperso, de modo que solo tenga los archivos para la aplicación de ejemplo:

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

Importar y ejecutar el proyecto.

Cree un proyecto a partir del código de ejemplo descargado, compílelo y luego ejecútelo.

Para importar y construir el proyecto de código de ejemplo:

  1. Inicie Android Studio .
  2. En Android Studio, elija Archivo > Nuevo > Importar proyecto .
  3. Navegue hasta el directorio del código de ejemplo que contiene el archivo build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) y seleccione ese directorio.

Si selecciona el directorio correcto, Android Studio crea un nuevo proyecto y lo construye. Este proceso puede tardar unos minutos, dependiendo de la velocidad de tu computadora y si has usado Android Studio para otros proyectos. Cuando se completa la compilación, Android Studio muestra un mensaje BUILD SUCCESSFUL en el panel de estado de Salida de la compilación .

Para ejecutar el proyecto:

  1. Desde Android Studio, ejecute el proyecto seleccionando Ejecutar > Ejecutar 'aplicación' .
  2. Seleccione un dispositivo Android conectado con micrófono para probar la aplicación.

Las siguientes secciones le muestran las modificaciones que necesita realizar en su proyecto existente para agregar esta funcionalidad a su propia aplicación, utilizando esta aplicación de ejemplo como punto de referencia.

Agregar dependencias del proyecto

En su propia aplicación, debe agregar dependencias de proyecto específicas para ejecutar modelos de aprendizaje automático de TensorFlow Lite y acceder a funciones de utilidad que convierten formatos de datos estándar, como audio, en un formato de datos tensorial que puede ser procesado por el modelo que está utilizando.

La aplicación de ejemplo utiliza las siguientes bibliotecas de TensorFlow Lite:

Las siguientes instrucciones muestran cómo agregar las dependencias del proyecto necesarias a su propio proyecto de aplicación de Android.

Para agregar dependencias de módulos:

  1. En el módulo que usa TensorFlow Lite, actualice el archivo build.gradle del módulo para incluir las siguientes dependencias. En el código de ejemplo, este archivo se encuentra aquí: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. En Android Studio, sincronice las dependencias del proyecto seleccionando: Archivo > Sincronizar proyecto con archivos Gradle .

Inicializar el modelo ML

En su aplicación de Android, debe inicializar el modelo de aprendizaje automático de TensorFlow Lite con parámetros antes de ejecutar predicciones con el modelo. Estos parámetros de inicialización dependen del modelo y pueden incluir configuraciones como umbrales de precisión mínimos predeterminados para predicciones y etiquetas para palabras o sonidos que el modelo puede reconocer.

Un modelo de TensorFlow Lite incluye un archivo *.tflite que contiene el modelo. El archivo de modelo contiene la lógica de predicción y normalmente incluye metadatos sobre cómo interpretar los resultados de la predicción, como los nombres de las clases de predicción. Los archivos de modelo deben almacenarse en el directorio src/main/assets de su proyecto de desarrollo, como en el ejemplo de código:

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

Por conveniencia y legibilidad del código, el ejemplo declara un objeto complementario que define la configuración del modelo.

Para inicializar el modelo en su aplicación:

  1. Cree un objeto complementario para definir la configuración del modelo:

    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. Cree la configuración para el modelo creando un objeto AudioClassifier.AudioClassifierOptions :

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. Utilice este objeto de configuración para construir un objeto AudioClassifier de TensorFlow Lite que contenga el modelo:

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

Habilitar la aceleración de hardware

Al inicializar un modelo de TensorFlow Lite en su aplicación, debe considerar el uso de funciones de aceleración de hardware para acelerar los cálculos de predicción del modelo. Los delegados de TensorFlow Lite son módulos de software que aceleran la ejecución de modelos de aprendizaje automático utilizando hardware de procesamiento especializado en un dispositivo móvil, como una unidad de procesamiento de gráficos (GPU) o unidades de procesamiento de tensor (TPU). El ejemplo de código utiliza NNAPI Delegate para manejar la aceleración de hardware de la ejecución del modelo:

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

Se recomienda utilizar delegados para ejecutar modelos de TensorFlow Lite, pero no es obligatorio. Para obtener más información sobre el uso de delegados con TensorFlow Lite, consulte Delegados de TensorFlow Lite .

Preparar datos para el modelo.

En su aplicación de Android, su código proporciona datos al modelo para su interpretación transformando datos existentes, como clips de audio, en un formato de datos Tensor que puede ser procesado por su modelo. Los datos de un tensor que pasa a un modelo deben tener dimensiones o formas específicas que coincidan con el formato de los datos utilizados para entrenar el modelo.

El modelo YAMNet/clasificador y los modelos de comandos de voz personalizados utilizados en este ejemplo de código aceptan objetos de datos Tensor que representan clips de audio de un solo canal o mono grabados a 16 kHz en clips de 0,975 segundos (15600 muestras). Al ejecutar predicciones sobre nuevos datos de audio, su aplicación debe transformar esos datos de audio en objetos de datos Tensor de ese tamaño y forma. La API de audio de la biblioteca de tareas de TensorFlow Lite maneja la transformación de datos por usted.

En el código de ejemplo de la clase AudioClassificationHelper , la aplicación graba audio en vivo desde los micrófonos del dispositivo usando un objeto AudioRecord de Android. El código utiliza AudioClassifier para construir y configurar ese objeto para grabar audio a una frecuencia de muestreo apropiada para el modelo. El código también usa AudioClassifier para construir un objeto TensorAudio para almacenar los datos de audio transformados. Luego, el objeto TensorAudio se pasa al modelo para su análisis.

Para proporcionar datos de audio al modelo ML:

  • Utilice el objeto AudioClassifier para crear un objeto TensorAudio y un objeto AudioRecord :

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

Ejecutar predicciones

En su aplicación de Android, una vez que haya conectado un objeto AudioRecord y un objeto TensorAudio a un objeto AudioClassifier, puede ejecutar el modelo con esos datos para producir una predicción o inferencia . El código de ejemplo de este tutorial ejecuta predicciones en clips de una secuencia de entrada de audio grabada en vivo a una velocidad específica.

La ejecución del modelo consume recursos importantes, por lo que es importante ejecutar las predicciones del modelo de aprendizaje automático en un subproceso en segundo plano independiente. La aplicación de ejemplo utiliza un objeto [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) para aislar el procesamiento del modelo de otras funciones de la aplicación.

Los modelos de clasificación de audio que reconocen sonidos con un comienzo y un final claros, como palabras, pueden producir predicciones más precisas en una secuencia de audio entrante analizando clips de audio superpuestos. Este enfoque ayuda al modelo a evitar perder predicciones de palabras que se cortan al final de un clip. En la aplicación de ejemplo, cada vez que ejecuta una predicción, el código toma el último clip de 0,975 segundos del búfer de grabación de audio y lo analiza. Puede hacer que el modelo analice clips de audio superpuestos estableciendo el valor del interval del grupo de ejecución del subproceso de análisis del modelo en una duración que sea más corta que la duración de los clips que se analizan. Por ejemplo, si su modelo analiza clips de 1 segundo y establece el intervalo en 500 milisegundos, el modelo analizará la última mitad del clip anterior y 500 milisegundos de nuevos datos de audio cada vez, creando una superposición de análisis de clip del 50 %.

Para comenzar a ejecutar predicciones sobre los datos de audio:

  1. Utilice el método AudioClassificationHelper.startAudioClassification() para iniciar la grabación de audio para el modelo:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. Establezca la frecuencia con la que el modelo genera una inferencia a partir de los clips de audio estableciendo un interval de velocidad fijo en el objeto ScheduledThreadPoolExecutor :

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. El objeto classifyRunnable en el código anterior ejecuta el método AudioClassificationHelper.classifyAudio() , que carga los últimos datos de audio disponibles de la grabadora y realiza una predicción:

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

Detener el procesamiento de predicción

Asegúrese de que el código de su aplicación deje de clasificar el audio cuando el Fragmento o Actividad de procesamiento de audio de su aplicación pierda el foco. La ejecución continua de un modelo de aprendizaje automático tiene un impacto significativo en la duración de la batería de un dispositivo Android. Utilice el método onPause() de la actividad o fragmento de Android asociado con la clasificación de audio para detener la grabación de audio y el procesamiento de predicción.

Para detener la grabación y clasificación de audio:

  • Utilice el método AudioClassificationHelper.stopAudioClassification() para detener la grabación y la ejecución del modelo, como se muestra a continuación en la clase AudioFragment :

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

Manejar la salida del modelo

En su aplicación de Android, después de procesar un clip de audio, el modelo produce una lista de predicciones que el código de su aplicación debe manejar ejecutando lógica empresarial adicional, mostrando resultados al usuario o realizando otras acciones. El resultado de cualquier modelo de TensorFlow Lite varía en términos de la cantidad de predicciones que produce (una o muchas) y la información descriptiva de cada predicción. En el caso de los modelos de la aplicación de ejemplo, las predicciones son una lista de sonidos o palabras reconocidas. El objeto de opciones AudioClassifier utilizado en el ejemplo de código le permite establecer el número máximo de predicciones con el método setMaxResults() , como se muestra en la sección Inicializar el modelo ML .

Para obtener los resultados de predicción del modelo:

  1. Obtenga los resultados del método classify() del objeto AudioClassifier y páselos al objeto de escucha (referencia de código):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. Utilice la función onResult() del oyente para manejar la salida ejecutando la lógica empresarial o mostrando los resultados al usuario:

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

El modelo utilizado en este ejemplo genera una lista de predicciones con una etiqueta para el sonido o palabra clasificados y una puntuación de predicción entre 0 y 1 como flotante que representa la confianza de la predicción, siendo 1 la puntuación de confianza más alta. En general, las predicciones con una puntuación inferior al 50% (0,5) se consideran no concluyentes. Sin embargo, la forma en que maneja los resultados de predicción de bajo valor depende de usted y de las necesidades de su aplicación.

Una vez que el modelo ha devuelto un conjunto de resultados de predicción, su aplicación puede actuar sobre esas predicciones presentando el resultado a su usuario o ejecutando lógica adicional. En el caso del código de ejemplo, la aplicación enumera los sonidos o palabras identificados en la interfaz de usuario de la aplicación.

Próximos pasos

Puede encontrar modelos adicionales de TensorFlow Lite para procesamiento de audio en TensorFlow Hub y en la página de la guía de modelos previamente entrenados . Para obtener más información sobre cómo implementar el aprendizaje automático en su aplicación móvil con TensorFlow Lite, consulte la Guía para desarrolladores de TensorFlow Lite .