Reconnaître les données regroupées en formes

9

Je travaille sur un projet en Python pour détecter et classer des chants d'oiseaux, et je me suis retrouvé dans une position où j'ai besoin de convertir un fichier d'onde en données de fréquence en fonction du temps. Cela n'a pas été trop un problème, mais pour pouvoir classer les différentes syllabes en groupes, j'ai besoin d'écrire quelque chose qui détectera quand les groupes de données auront une certaine forme. Pour vous donner une idée de l'apparence des données, voici une image de l'apparence des données lorsqu'elles sont tracées:

entrez la description de l'image ici

J'ai besoin d'un moyen d'obtenir chaque syllabe individuelle (chaque forme avec une séparation de chaque côté) et de les enregistrer dans une variable ou dans leurs propres fichiers afin de pouvoir exécuter une corrélation Pearson entre elles à l'aide de SciPy.

De plus, je préfère Python, mais je suis ouvert au codage dans d'autres langues si vous avez une autre façon de le faire.

Merci!

smckee
la source
Je ne suis pas complètement familiarisé avec ce que je suis sur le point de suggérer, mais il semble que la transformation continue en ondelettes avec une ondelette qui contient les propriétés de vos syllabes mérite d'être examinée.
heltonbiker
Avez-vous besoin de trouver une forme ou essayez-vous de classer les oiseaux? Si c'est le cas avec le son de Hidden Markov Model?
Mikhail

Réponses:

2

Deux questions:

1 / Près de 8s, on peut observer un pitch stable pendant 100ms environ, puis une soudaine augmentation en baisse jusqu'à 8.5s. Est-ce que toute cette séquence (8 à 8,5) forme une seule entité, ou considérez-vous que les deux étapes (stable puis décroissante) sont deux entités?

2 / Voulez-vous travailler avec ou sans supervision. Connaissez-vous à l'avance les "modèles" à rechercher?

  • Si vous voulez travailler sans supervision (disons que vous avez rassemblé des enregistrements et visez à en extraire une "représentation structurée"), votre problème s'apparente, dans un premier temps, à la détection d'activité vocale. Utilisez simplement l'intensité du signal, peut-être en conjonction avec une métrique de "hauteur" (par exemple, le rapport du maximum de l'autocorrélation dans la plage du pont, 1 kHz - 5 kHz ici) pour détecter les segments où il y a une tonalité forte active. Filtre médian la séquence résultante pour la lisser, puis la seuil pour obtenir les différents segments. Une fois que vous avez décomposé votre signal en segments, vous pouvez faire des choses intéressantes avec eux. Par exemple, vous pouvez extraire pour chacun d'eux une trajectoire de hauteur (une séquence avec le pic de fréquence le plus fort pour chaque trame FFT, ou quelque chose de plus robuste extrait avec un véritable estimateur de hauteur), utilisez DTW pour calculer une matrice de distances par paire entre chaque bloc, et utilisez un algorithme de clustering (k-means, clustering agglomératif) pour identifier des groupes de modèles de pas similaires (les segments 8: 8,5 et 10: 10,5). Il est probable qu'une approche non supervisée sur-segmentera - par exemple, 7.6: 8.5 et 9.6: 10.5 seront reconnus comme la répétition des deux mêmes blocs, alors que pour vous, ils pourraient fondamentalement être un seul modèle, mais vous pourriez utiliser quelque chose commeSequitur pour avoir un niveau de structure supérieur.

  • Si vous avez un dictionnaire prédéfini de "modèles" avec lesquels vous souhaitez étiqueter votre signal, vous feriez mieux de suivre le type d'approches utilisées pour la reconnaissance vocale, avec la seule différence majeure que la reconnaissance vocale ne tient pas compte de la hauteur, alors que dans votre le pas du dossier est la seule information à considérer! Un système de reconnaissance vocale traite à la fois les tâches de segmentation et de reconnaissance en une seule opération de décodage FST.

pichenettes
la source