Créer une application de base pour la classification de contenu audio

1. Avant de commencer

TensorFlow est un framework de machine learning polyvalent. Vous pouvez l'utiliser pour entraîner des modèles très volumineux sur plusieurs clusters dans le cloud, ou pour exécuter localement des modèles sur un système intégré comme votre téléphone.

Cet atelier de programmation utilise TensorFlow Lite pour exécuter un modèle de classification audio sur un appareil Android.

Points abordés

  • Trouver un modèle de machine learning pré-entraîné prêt à être utilisé
  • Comment classer les contenus audio en temps réel.
  • Utiliser la bibliothèque Support TensorFlow Lite pour prétraiter la saisie du modèle et post-traiter la sortie du modèle
  • Utiliser la bibliothèque de tâches audio pour effectuer toutes les tâches audio.

Ce que vous allez faire

Application de reconnaissance audio simple qui exécute un modèle de reconnaissance audio de TensorFlow Lite pour identifier des contenus audio en temps réel depuis le micro

33a0fdb0a027fa8.png

Prérequis

  • Une version récente d'Android Studio (version 4.1.2 ou ultérieure)
  • Appareil physique physique avec version d'Android sur l'API 23 (Android 6.0)
  • Exemple de code
  • Connaissances de base en développement Android en langage Kotlin

2. Obtenir l'exemple de code

Télécharger le code

Cliquez sur le lien ci-dessous pour télécharger l'ensemble du code de cet atelier de programmation :

Décompressez le fichier ZIP téléchargé. Cela permet de décompresser un dossier racine (odml-pathways) contenant toutes les ressources dont vous avez besoin. Pour cet atelier de programmation, vous n'aurez besoin que des sources dans le sous-répertoire audio_classification/codelab1/android.

Remarque:Si vous préférez, vous pouvez cloner le dépôt:

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

Le sous-répertoire android du dépôt audio_classification/codelab1/android contient deux répertoires:

  • android_studio_folder.pngstarter : code de démarrage sur lequel s'appuie cet atelier de programmation.
  • android_studio_folder.pngfinal : code final de l'exemple d'application terminée

Importer l'application de départ

Commençons par importer l'application de départ dans Android Studio.

  1. Ouvrez Android Studio, puis sélectionnez Import Project (Gradle, Eclipse ADT, etc.) (Importer un projet (Gradle, Eclipse ADT, etc.)).
  2. Ouvrez le dossier starter (audio_classification/codelab1/android/starter) à partir du code source que vous avez téléchargé précédemment.

7c0f27882a2696ac.png

Pour vous assurer que toutes les dépendances sont disponibles pour votre application, vous devez synchroniser votre projet avec les fichiers Gradle une fois le processus d'importation terminé.

  1. Sélectionnez Sync Project with Gradle Files (Synchroniser le projet avec les fichiers Gradle) (B451AB2D04D835f9.png) dans la barre d'outils d'Android Studio.

Exécuter l'application de départ

Maintenant que vous avez importé le projet dans Android Studio, vous êtes prêt à exécuter l'application.

Connectez votre appareil Android via USB à votre ordinateur, puis cliquez sur Exécuter ( execute.png) dans la barre d'outils d'Android Studio.

5518972c21706233.png

3. Rechercher un modèle pré-entraîné

Pour classer vos contenus audio, vous aurez besoin d'un modèle. Utilisez un modèle pré-entraîné pour ne pas avoir à l'entraîner.

Pour trouver des modèles pré-entraînés, vous allez utiliser TensorFlow Hub ( www.tfhub.dev).

91e39900ff58818c.png

Les modèles sont classés par domaine. Celui dont vous avez besoin est fourni par les domaines du problème audio.

9d44d38c297bf3dc.png

Pour votre application, vous allez classer les événements à l'aide du modèle YAMNet.

YAMNet est un classificateur d'événements audio qui prend en entrée les ondes audio et génère des prédictions indépendantes pour chacun des 521 événements audio.

Le modèle yamnet/classification est déjà converti en TensorFlow Lite et dispose de métadonnées spécifiques permettant à la bibliothèque de tâches TFLite d'utiliser du contenu audio afin de faciliter son utilisation sur les appareils mobiles.

65d6f610eb27762.png

Sélectionnez l'onglet approprié: TFLite (yamnet/classification/tflite), puis cliquez sur Download (Télécharger). Vous pouvez également voir les métadonnées du modèle au bas de l'écran.

cfb3cfeb310e1f51.png

Ce fichier de modèle (lite-model_yamnet_classification_tflite_1.tflite) sera utilisé à l'étape suivante.

4. Importer le nouveau modèle dans l'application de base

La première étape consiste à déplacer le modèle téléchargé de l'étape précédente vers le dossier des éléments dans votre application.

Dans Android Studio, dans l'explorateur de projets, faites un clic droit sur le dossier assets.

7cca2c22ed8cf4c8.png

Une fenêtre pop-up s'affiche avec les options disponibles. L'un de ces éléments consiste à ouvrir le dossier dans votre système de fichiers. Sur un Mac, il s'agit de Reveal in Finder (Ouvrir dans le Finder) sous Open in Explorer (Ouvrir dans l'explorateur) ou Ubuntu in Files (Afficher dans Fichiers) sur Ubuntu. Trouvez celui qui convient à votre système d'exploitation et sélectionnez-le.

95e0eca881d35f6b.png

Ensuite, copiez le modèle téléchargé.

Après avoir effectué cette opération, revenez dans Android Studio. Votre fichier devrait apparaître dans le dossier assets.

703b1842fb09e893.png

5. Charger le nouveau modèle dans l'application de base

Vous allez maintenant suivre certaines des tâches "TODO" (À FAIRE) et activer la classification des contenus audio avec le modèle que vous venez d'ajouter au projet à l'étape précédente.

Pour faciliter la recherche des tâches (À FAIRE) dans Android Studio, accédez au menu: Affichage > Outil Windows > À FAIRE. Une fenêtre contenant la liste s'ouvre. Vous pouvez cliquer dessus pour accéder directement au code.

La première tâche se trouve dans le fichier build.gradle (version du module).

Le rôle TODO 1 consiste à ajouter les dépendances Android:

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

Toutes les autres modifications du code s'appliqueront au MainActivity

TODO 2.1 crée la variable avec le nom du modèle à charger lors des étapes suivantes.

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

TODO 2.2, vous devez définir un seuil minimal pour accepter une prédiction du modèle. Cette variable sera utilisée ultérieurement.

var probabilityThreshold: Float = 0.3f

Vous pouvez charger le modèle à partir du dossier des éléments dans TODO 2.3. La classe AudioClassifier définie dans la bibliothèque de tâches audio est prête à charger le modèle et vous donne toutes les méthodes nécessaires pour exécuter l'inférence. Elle vous aide également à créer un enregistrement audio.

val classifier = AudioClassifier.createFromFile(this, modelPath)

6. Capturer le son

L'API Audio Tasks utilise des méthodes d'assistance pour vous aider à créer un enregistrement audio avec la configuration attendue par votre modèle (taux d'échantillonnage, débit, nombre de canaux, etc.). Vous n'avez pas besoin de la rechercher manuellement, ni de créer des objets de configuration.

TODO 3.1:créer la variable de Tensor qui stockera l'enregistrement pour l'inférence et créer la spécification de format pour l'enregistreur.

val tensor = classifier.createInputTensorAudio()

TODO 3.2:affichez les spécifications de l'enregistreur audio qui ont été définies par les métadonnées du modèle à l'étape précédente.

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

92e81894674a5b0.png

TODO 3.3: créez l'enregistreur audio et lancez l'enregistrement.

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

Actuellement, l'appli écoute sur le micro de votre téléphone, mais n'effectue aucune inférence. Vous allez résoudre ce problème à l'étape suivante.

7. Ajouter l'inférence à votre modèle

Au cours de cette étape, vous allez ajouter le code d'inférence à votre application et l'afficher à l'écran. Le code comporte déjà un thread pour le minuteur qui s'exécute toutes les demi-secondes et c'est là que l'inférence sera exécutée.

Les paramètres de la méthode scheduleAtFixedRate indiquent le délai d'attente et le délai d'exécution des tâches successives dans le code ci-dessous toutes les 500 millisecondes.

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

TODO 4.1 : ajoutez le code pour utiliser le modèle. Commencez par charger l'enregistrement dans un Tensor audio, puis transmettez-le au classificateur:

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

TODO 4.2 pour obtenir de meilleurs résultats d'inférence, vous filtrerez toute classification dont la probabilité est très faible. Vous utiliserez ici la variable créée à l'étape précédente (probabilityThreshold):

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

TODO 4.3:pour faciliter la lecture des résultats, nous allons créer une chaîne avec les résultats filtrés:

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

TODO 4.4 Mettre à jour l'interface utilisateur Dans cette application très simple, le résultat ne s'affiche que dans un TextView. Étant donné que la classification ne figure pas sur le thread principal, vous devez utiliser un gestionnaire pour effectuer cette mise à jour.

runOnUiThread {
   textView.text = outputStr
}

Vous avez ajouté l'ensemble du code nécessaire pour:

  • Charger le modèle à partir du dossier des éléments
  • Créer un enregistrement audio avec la bonne configuration
  • Inférence en cours d'exécution
  • Affichez les meilleurs résultats à l'écran

Il ne vous reste plus qu'à tester l'application.

8. Exécuter l'application finale

Vous avez intégré le modèle de classification audio dans l'application. Testons-le.

Connectez votre appareil Android, puis cliquez sur l'icône Exécuter ( execute.png) dans la barre d'outils d'Android Studio.

Lors de la première exécution, vous devez accorder à l'application les autorisations d'enregistrement audio.

Une fois cette autorisation accordée, l'appli utilise le micro du téléphone. Pour ce faire, commencez à parler à proximité du téléphone, car l'une des classes détectées par YAMNet est la voix. Vous pouvez également applaudir votre doigt avec des doigts.

Vous pouvez également essayer de détecter les aboiements d'un chien et de nombreux autres événements possibles (521). Pour en obtenir la liste complète, consultez leur code source. Vous pouvez également lire les métadonnées directement avec le fichier des étiquettes.

33a0fdb0a027fa8.png

9. Félicitations !

Dans cet atelier de programmation, vous avez appris à trouver un modèle pré-entraîné pour la classification de contenus audio et à le déployer dans votre application mobile à l'aide de TensorFlow Lite. Pour en savoir plus sur TFLite, consultez d'autres exemples TFLite.

Points abordés

  • Déployer un modèle TensorFlow Lite sur une application Android
  • Rechercher et utiliser des modèles à partir de TensorFlow Hub

Étapes suivantes

  • Personnalisez le modèle avec vos propres données.

En savoir plus

Vous avez une question ?

Signaler des problèmes