Crea una app básica de clasificación de audio

1. Antes de comenzar

TensorFlow es un framework multipropósito de aprendizaje automático. Se puede usar para entrenar modelos grandes en clústeres en la nube o para ejecutar modelos de forma local en un sistema incorporado como tu teléfono.

En este codelab, se usa TensorFlow Lite para ejecutar un modelo de clasificación de audio en un dispositivo Android.

Qué aprenderás

Qué crearás

Una app sencilla de reconocimiento de audio que ejecuta un modelo de reconocimiento de audio de TensorFlow Lite para identificar audios del micrófono en tiempo real

33af0fdb0a027fa8.png

Requisitos

  • Una versión reciente de Android Studio (v4.1.2 o posterior)
  • Dispositivo Android físico con versión de Android en API 23 (Android 6.0)
  • El código de muestra
  • Conocimientos básicos sobre el desarrollo para Android en Kotlin

2. Obtén el código de muestra

Descarga el código

Haz clic en el siguiente vínculo a fin de descargar todo el código de este codelab:

Descargar código fuente

Descomprime el archivo zip descargado. Esto descomprimirá una carpeta raíz (odml-pathways) con todos los recursos que necesitarás. Para este codelab, solo necesitarás las fuentes del subdirectorio audio_classification/codelab1/android.

Nota: Si lo prefieres, puedes clonar el repositorio:

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

El subdirectorio android en el repositorio audio_classification/codelab1/android contiene dos directorios:

  • android_studio_folder.pngstarter: Código inicial en el que se basa este codelab.
  • android_studio_folder.pngfinal: Código completo para la app de muestra finalizada.

Cómo importar la app de inicio

Para comenzar, importa la app de inicio a Android Studio.

  1. Abre Android Studio y selecciona Import Project (Gradle, Eclipse ADT, etc.).
  2. Abre la carpeta starter (audio_classification/codelab1/android/starter) del código fuente que descargaste antes.

7c0f27882a2698ac.png

Para asegurarte de que todas las dependencias estén disponibles en la app, debes sincronizar tu proyecto con los archivos de Gradle cuando finalice el proceso de importación.

  1. En la barra de herramientas de Android Studio, selecciona Sync Project with Gradle Files ( b451ab2d04d835f9.png).

Cómo ejecutar la app de inicio

Ahora que importaste el proyecto a Android Studio, puedes ejecutar la app por primera vez.

Conecta tu dispositivo Android mediante USB a tu computadora y haz clic en Run ( execute.png) en la barra de herramientas de Android Studio.

5518972c21705945.png

3. Busca un modelo previamente entrenado

Para realizar la clasificación de audio, necesitarás un modelo. Comienza con un modelo previamente entrenado para que no tengas que entrenar uno por tu cuenta.

Para buscar modelos previamente entrenados, usa TensorFlow Hub ( www.tfhub.dev).

91e39900ff58818c.png

Los modelos se clasifican por dominios. La que necesitas ahora es de Audio Problem Domains.

9d44d38c297bf3dc.png

En tu app, realizarás la clasificación de eventos con el modelo YAMNet.

YAMNet es un clasificador de eventos de audio que toma la forma de onda de audio como entrada y realiza predicciones independientes para cada uno de los 521 eventos de audio.

El modelo yamnet/classification ya se convirtió a TensorFlow Lite y tiene metadatos específicos que permiten que la biblioteca de tareas de TFLite para audio facilite su uso en dispositivos móviles.

65dc0f610eb27762.png

Selecciona la pestaña derecha: TFLite (yamnet/classification/tflite) y haz clic en Descargar. También puedes ver los metadatos del modelo en la parte inferior.

cfb3cfeb310e1f51.png

Este archivo del modelo (lite-model_yamnet_classification_tflite_1.tflite) se utilizará en el siguiente paso.

4. Importa el modelo nuevo a la app de base

El primer paso es mover el modelo descargado del paso anterior a la carpeta de elementos en tu app.

En Android Studio, en el explorador de proyectos, haz clic con el botón derecho en la carpeta assets.

7cca2c22ed8cf4c8.png

Verás una ventana emergente con una lista de opciones. Una de ellas será abrir la carpeta en tu sistema de archivos. En una computadora Mac, será Discover in Finder. En Windows, será Open in Explorer. En Ubuntu, será Show in Files. Encuentra el más adecuado para tu sistema operativo y selecciónalo.

95e0eca881d35f6b.png

Luego, copia el modelo descargado en él.

Una vez que lo hayas hecho, regresa a Android Studio y verás tu archivo en la carpeta assets.

703b1842fb09e893.png

5. Carga el modelo nuevo en la app de base

Ahora, seguirás algunos de los pasos pendientes y habilitarás la clasificación de audio con el modelo que acabas de agregar al proyecto en el paso anterior.

Para facilitar la búsqueda de TODO, en Android Studio, ve al menú: View > Tool Windows > TODO. Se abrirá una ventana con la lista en la que podrás hacer clic para ir directamente al código.

En el archivo build.gradle (la versión del módulo), encontrarás la primera tarea.

TODO 1 sirve para agregar las dependencias de Android:

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

Todos los cambios de código se realizarán en MainActivity.

TODO 2.1 crea la variable con el nombre del modelo para cargar en los próximos pasos.

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

TODO 2.2 definirá un umbral mínimo para aceptar una predicción del modelo. Esta variable se usará más adelante.

var probabilityThreshold: Float = 0.3f

TODO 2.3 es el lugar en el que cargarás el modelo desde la carpeta de elementos. La clase AudioClassifier definida en la Biblioteca de tareas de audio está preparada para cargar el modelo y te proporciona todos los métodos necesarios para ejecutar inferencias y también para ayudar a crear una grabadora de audio.

val classifier = AudioClassifier.createFromFile(this, modelPath)

6. Capturar audio

La API de Audio Tasks tiene algunos métodos auxiliares para ayudarte a crear una grabadora de audio con la configuración adecuada que espera tu modelo (p. ej., tasa de muestreo, tasa de bits, cantidad de canales). Con este paso, no necesita encontrarlo a mano ni crear objetos de configuración.

TODO 3.1: Crea la variable del tensor que almacenará la grabación para la inferencia y compilará la especificación del formato para la grabadora.

val tensor = classifier.createInputTensorAudio()

TODO 3.2: Se muestran las especificaciones de la grabadora de audio que se definieron en los metadatos del modelo en el paso anterior.

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

92e81894674a5b0.png

TODO 3.3: Crea el grabador de audio y comienza a grabar.

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

Por ahora, tu app está escuchando el micrófono del teléfono, pero aún no realiza inferencias. Abordarás esto en el siguiente paso.

7. Agrega la inferencia a tu modelo

En este paso, agregarás el código de inferencia a tu app y lo mostrarás en pantalla. El código ya tiene un subproceso de temporizador que se ejecuta cada medio segundo, y allí es donde se ejecutará la inferencia.

Los parámetros del método scheduleAtFixedRate son la cantidad de tiempo que se iniciará la ejecución y el tiempo que transcurre entre la ejecución de tareas sucesivas, en el código que se muestra a continuación cada 500 milisegundos.

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

TODO 4.1 Agrega el código para usar el modelo. Primero, carga la grabación en un tensor de audio y pásala al clasificador:

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

TODO 4.2 para tener mejores resultados de inferencia, filtrará cualquier clasificación que tenga una probabilidad muy baja. Aquí, usarás la variable creada en un paso anterior (probabilityThreshold):

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

TODO 4.3: Para facilitar la lectura del resultado, crearemos una string con los resultados filtrados:

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

TODO 4.4 Actualiza la IU. En esta app muy sencilla, el resultado se muestra solo en una TextView. Como la clasificación no está en el subproceso principal, necesitarás usar un controlador para realizar esta actualización.

runOnUiThread {
   textView.text = outputStr
}

Agregó todo el código necesario para lo siguiente:

  • Carga el modelo desde la carpeta de elementos
  • Crea una grabadora de audio con la configuración correcta
  • Inferencia en ejecución
  • Mostrar los mejores resultados en la pantalla

Ahora, solo necesitas probar la app.

8. Ejecuta la app final

Ya integró el modelo de clasificación de audio en la app, así que probémoslo.

Conecta tu dispositivo Android y haz clic en Ejecutar ( execute.png) en la barra de herramientas de Android Studio.

En la primera ejecución, deberá otorgar los permisos de grabación de audio de la app.

Después de otorgar el permiso, la app de inicio usará el micrófono del teléfono. Para probarlo, comienza a hablar cerca del teléfono, ya que una de las clases que YAMNet detecta es la voz. Otra clase fácil de probar es aplaudir con los dedos o aplaudir.

También puedes intentar detectar ladrido de un perro y muchos otros eventos posibles (521). Para obtener una lista completa, puedes consultar el código fuente o también puedes leer los metadatos directamente con el archivo de etiquetas.

33af0fdb0a027fa8.png

9. ¡Felicitaciones!

En este codelab, aprendiste a buscar un modelo previamente entrenado para la clasificación de audio y a implementarlo en tu app para dispositivos móviles con TensorFlow Lite. Para obtener más información sobre TFLite, consulta otras muestras de TFLite.

Temas abordados

  • Cómo implementar un modelo de TensorFlow Lite en una app para Android
  • Cómo encontrar y usar modelos de TensorFlow Hub.

Próximos pasos

  • Personaliza el modelo con tus propios datos.

Más información

¿Tienes alguna pregunta?

Informar problemas