Guide de classification audio pour Python

La tâche de classificateur audio MediaPipe vous permet d'effectuer une classification sur des données audio. Vous pouvez utiliser cette tâche pour identifier les événements sonores à partir d'un ensemble de catégories entraînées. Ces instructions vous expliquent comment utiliser le classificateur audio avec Python.

Pour en savoir plus sur les fonctionnalités, les modèles et les options de configuration de cette tâche, consultez la présentation.

Exemple de code

L'exemple de code pour le classificateur audio fournit une implémentation complète de cette tâche en Python à titre de référence. Ce code vous aide à tester cette tâche et à créer votre propre classificateur audio. Avec Google Colab, vous pouvez afficher, exécuter et modifier l'exemple de code du classificateur audio en utilisant simplement votre navigateur Web. Vous pouvez afficher le code source de cet exemple sur GitHub.

Si vous implémentez le classificateur audio pour Raspberry Pi, consultez l'exemple d'application pour Raspberry Pi.

Préparation

Cette section décrit les étapes clés pour configurer votre environnement de développement et vos projets de code spécifiquement pour l'utilisation du classificateur audio. Pour obtenir des informations générales sur la configuration de votre environnement de développement pour l'utilisation des tâches MediaPipe, y compris sur les exigences concernant les versions de la plate-forme, consultez le guide de configuration de Python.

Colis

La tâche de classificateur audio dans le package pip mediapipe Vous pouvez installer la dépendance avec la commande suivante:

$ python -m pip install mediapipe

Importations

Importez les classes suivantes pour accéder aux fonctions des tâches du classificateur audio:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import audio

Modèle

La tâche de classificateur audio MediaPipe nécessite un modèle entraîné compatible avec cette tâche. Pour en savoir plus sur les modèles entraînés disponibles pour le classificateur audio, consultez la section Modèles de la présentation des tâches.

Sélectionnez et téléchargez un modèle, puis stockez-le dans un répertoire local. Vous pouvez utiliser le modèle Yamnet recommandé.

model_path = '/absolute/path/to/lite-model_yamnet_classification_tflite_1.tflite'

Spécifiez le chemin d'accès du modèle dans le paramètre "Nom du modèle", comme indiqué ci-dessous:

base_options = BaseOptions(model_asset_path=model_path)

Créer la tâche

Utilisez la fonction create_from_options pour créer la tâche. La fonction create_from_options accepte des options de configuration telles que le mode d'exécution, les paramètres régionaux des noms à afficher, le nombre maximal de résultats, le seuil de confiance, la liste d'autorisation de catégories et la liste de refus. Pour en savoir plus sur les options de configuration, consultez la section Présentation de la configuration.

La tâche de classificateur d'audio accepte les extraits audio et les flux audio en entrée. Vous devez spécifier le mode d'exécution correspondant à votre type de données d'entrée lors de la création de la tâche. Choisissez l'onglet correspondant à votre type de données d'entrée pour voir comment créer la tâche et exécuter l'inférence.

Clips audio

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=AudioRunningMode.AUDIO_CLIPS)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

Flux audio

AudioClassifier = mp.tasks.audio.AudioClassifier
AudioClassifierOptions = mp.tasks.audio.AudioClassifierOptions
AudioClassifierResult = mp.tasks.audio.AudioClassifierResult
AudioRunningMode = mp.tasks.audio.RunningMode
BaseOptions = mp.tasks.BaseOptions

def print_result(result: AudioClassifierResult, timestamp_ms: int):
    print(AudioClassifierResult result: {}’.format(result))

options = AudioClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=AudioRunningMode.AUDIO_STREAM,
    max_results=5,
    result_callback=print_result)

with AudioClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
  

Pour obtenir un exemple complet de création d'un classificateur audio à utiliser avec du contenu audio, consultez l'exemple de code.

Options de configuration

Cette tâche dispose des options de configuration suivantes pour les applications Python:

Nom de l'option Description Plage de valeurs Valeur par défaut
running_mode Définit le mode d'exécution de la tâche. Le classificateur audio comporte deux modes:

AUDIO_CLIPS: mode d'exécution de la tâche audio sur des clips audio indépendants.

AUDIO_STREAM: mode d'exécution de la tâche audio sur un flux audio, par exemple depuis le micro. Dans ce mode, resultListener doit être appelé pour configurer un écouteur afin de recevoir les résultats de la classification de manière asynchrone.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
display_names_locale Définit la langue des libellés à utiliser pour les noms à afficher fournis dans les métadonnées du modèle de la tâche, le cas échéant. La valeur par défaut est en pour l'anglais. Vous pouvez ajouter des thèmes localisés aux métadonnées d'un modèle personnalisé à l'aide de l'API TensorFlow Lite Metadata Writer. Code des paramètres régionaux en
max_results Définit le nombre maximal (facultatif) de résultats de classification les mieux notés à renvoyer. Si la valeur est inférieure à 0, tous les résultats disponibles sont renvoyés. Tout nombre positif -1
score_threshold Définit le seuil de score de prédiction qui remplace celui fourni dans les métadonnées du modèle (le cas échéant). Les résultats inférieurs à cette valeur sont refusés. [0,0, 1,0] Non définie
category_allowlist Définit la liste facultative des noms de catégories autorisés. S'ils ne sont pas vides, les résultats de classification dont le nom de catégorie ne figure pas dans cet ensemble seront filtrés. Les noms de catégorie en double ou inconnus sont ignorés. Cette option s'exclut mutuellement avec category_denylist. L'utilisation des deux résultats génère une erreur. N'importe quelle chaîne Non définie
category_denylist Définit la liste facultative des noms de catégorie qui ne sont pas autorisés. S'ils ne sont pas vides, les résultats de classification dont le nom de catégorie figure dans cet ensemble seront filtrés. Les noms de catégorie en double ou inconnus sont ignorés. Cette option s'exclut mutuellement avec category_allowlist. L'utilisation des deux entraîne une erreur. N'importe quelle chaîne Non définie
result_callback Définit l'écouteur de résultats pour qu'il reçoive les résultats de la classification de manière asynchrone lorsque le classificateur audio est en mode de flux audio. Ne peut être utilisé que lorsque le mode En cours d'exécution est défini sur AUDIO_STREAM N/A Non définie

Préparation des données

Le classificateur audio fonctionne avec des clips audio et des flux audio. Cette tâche gère le prétraitement de l'entrée des données, y compris le rééchantillonnage, la mise en mémoire tampon et le cadrage.

Préparez votre entrée sous la forme d'un fichier audio ou d'un tableau Numpy, puis convertissez-la en objet AudioData MediaPipe. Vous pouvez utiliser une bibliothèque externe telle que SciPy pour charger vos contenus audio d'entrée sous forme de tableaux Numpy.

Les exemples suivants expliquent et montrent comment préparer les données à traiter pour chacun des types de données disponibles:

Clips audio

import numpy as np
from scipy.io import wavfile

AudioData = mp.tasks.components.containers.AudioData

sample_rate, buffer = wavfile.read('/path/to/audio.wav')
audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

Flux audio

import numpy as np

AudioData = mp.tasks.components.containers.AudioData

# Read microphone data as np arrays, then call

audio_data = AudioData.create_from_array(
    buffer.astype(float) / np.iinfo(np.int16).max, sample_rate)
    

Exécuter la tâche

Vous appelez la fonction de classification correspondant à votre mode d'exécution pour déclencher des inférences. L'API Audio Classifier renvoie les catégories possibles pour les événements audio dans le tampon audio d'entrée.

Clips audio

# Perform audio classification on the provided audio clip.
audio_classifier_result_list = classifier.classify(audio_data)
    

Flux audio

# Send live audio data to perform audio classification.
# Results are sent to the `result_callback` provided in the `AudioClassifierOptions`
classifier.classify_async(audio_data, timestamp_ms)
    

Veuillez noter les points suivants :

  • Lors de l'exécution en mode de flux audio, vous devez également fournir à la tâche de classificateur audio l'horodatage des données audio d'entrée.
  • Lors de l'exécution dans le modèle de clips audio, la tâche de classificateur audio bloque le thread actuel jusqu'à ce qu'il ait fini de traiter l'audio d'entrée.

Pour obtenir un exemple plus complet d'exécution du classificateur audio avec des extraits audio, consultez l'exemple de code.

Gérer et afficher les résultats

Lors de l'exécution de l'inférence, la tâche de classificateur audio renvoie un objet AudioClassifierResult qui contient la liste des catégories possibles pour les événements audio dans l'audio d'entrée.

Voici un exemple des données de sortie de cette tâche:

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

L'exemple de code du classificateur audio montre comment afficher les résultats de classification renvoyés par cette tâche. Pour en savoir plus, consultez cet exemple de code.