Comment puis-je détecter les sifflets, les pops et autres sons dans l'entrée audio en direct?

9

J'ai lu beaucoup de questions sur SO, et franchement, chacune d'elles ne décrit aucune façon particulière de s'y prendre. Certains disent "faire FFT" et certains disent "passage à zéro" etc. Mais je ne suis allé jusqu'à comprendre que l'entrée audio numérique consiste en un tableau d'amplitudes pour une fréquence particulière et bien .. Je ne sais pas vraiment au-delà.

Maintenant, je connais le théorème de Nyquist, la fréquence, l'amplitude, la série de Fourier, etc., et cela remonte à 2-3 ans quand je l'ai fait dans mon programme universitaire au cours d'un semestre. Mais à l'époque, on ne nous avait vraiment pas beaucoup appris sur l'utilisation réelle de Fourier, et je n'ai pas pris la peine de creuser davantage sur le sujet au-delà de l'apprentissage juste assez pour passer le sujet. Mais maintenant, je vais devoir utiliser tout ça.

Voici un instantané des sons que j'essaie de détecter:

graphique unique de claquements de doigts et interrupteur marche / arrêt

Clairement, les sons ont des graphiques uniques. Je veux juste comprendre comment extraire leurs caractéristiques uniques particulières pour leurs lignes épineuses uniques dans le graphique. Comme quelle amplitude, fréquence, etc. Et pendant combien de temps - bien que ce soit trivial, je suppose.

Je veux une liste d'instructions simple et pas à pas - je peux rechercher sur Google la terminologie que je ne comprendrai pas.

Comme peut-être ça? -

  1. Obtenez les données audio d'entrée

  2. Spectogramme de tracé

  3. Obtenez un graphique de spectogramme pour le son que vous souhaitez détecter dans un environnement silencieux

  4. Étudiez ce graphique - dessinez des caractéristiques uniques de ce son

  5. Créez une sorte de fonction qui peut détecter ces caractéristiques particulières dans le flux audio en direct, en utilisant les caractéristiques du son de (4)

  6. Si une correspondance est trouvée, eh bien - le travail est fait.

  7. Polissez l'algorithme pour éliminer les faux négatifs.

UNEBXZ

Je pensais faire en sorte que l'utilisateur enregistre le son qu'il veut stocker comme un geste dans un environnement calme. Et l'utilisateur ne ferait le son qu'entre le rembourrage du temps calme ; 3 secondes au début et à la fin de l'enregistrement.

Disons que pendant les 3 premières secondes, mon système établirait que l'entrée actuelle est le bruit de fond calme normal. Et puis un changement soudain dans le graphique serait le début de l'entrée sonore. Et lorsque cela s'arrête, l'enregistrement continue pendant encore 3 secondes, le rembourrage du temps silencieux de fin . Cela serait fait manuellement par l'utilisateur. Il stockerait alors automatiquement les caractéristiques de la seule partie pendant laquelle le changement soudain du graphique a duré - quelque part entre les temps de remplissage.

Et ainsi, les caractéristiques de cette partie seraient enregistrées en tant que données gestuelles de ce son, qui seraient utilisées pour détecter ce son particulier dans le flux audio en direct plus tard.

Le problème est que je pense tout cela en anglais simple. J'ai besoin de penser en mathématiques et en physique, pour pouvoir l'implémenter efficacement dans mon code. Je suis tellement sacrément ignorant quoi écrire et où l'écrire dans mon code - même avec autant de bibliothèques et de questions sur SO à ma disposition.

Et désolé si cela a été long.

bad_keypoints
la source
1
Par curiosité, ce spectrogramme est-il réalisé sur un téléphone ou une tablette? si oui, pouvez-vous indiquer le nom de l'application. Ça a l'air vraiment cool. En ce qui concerne votre question, je pense que votre application est similaire au sujet / à la tâche de faire la reconnaissance de mots isolés. Vous pouvez probablement obtenir beaucoup d'idées et d'inspiration en recherchant cela sur Google. La partie difficile n'est pas de reconnaître les gestes dans un petit nombre de gestes relativement limité, la partie difficile est de filtrer les choses qui ne sont pas des gestes.
niaren
Voici l'application: play.google.com/store/apps/… Et merci pour vos points de vue. Mais je veux que vous me disiez comment détecter non pas les mots, mais les sons (au moins pour l'instant), comme le sifflement, la pop, les applaudissements, etc. Je travaille en Python.
bad_keypoints
1
Malheureusement, ce genre de chose est encore un domaine de recherche. Je ne connais personne qui résout ce problème spécifique.
Bjorn Roche

Réponses:

2

Bien que je sois d'accord avec l'un des commentaires selon lesquels l'utilisation de techniques de reconnaissance vocale pourrait être un bon début, ces sons sont différents et je ne connais personne ayant fait des recherches pour les catégoriser (le document cité par Nathan ne semble distinguer que la parole et le bruit), donc à moins que quelqu'un ne présente quelque chose pour contredire cela, vous allez devoir inventer votre propre technique, et cela va demander beaucoup d'apprentissage et beaucoup de travail. Le mieux que je puisse faire est de vous lancer.

Tout d'abord, ne vous attendez pas à ce que quiconque puisse produire une formule magique. Il n'y a pas d'équation pour passer du son à ce qu'est le son. Les humains et les ordinateurs doivent apprendre en incorporant des données pour faire des suppositions éclairées sur ce que sont les sons. La raison pour laquelle les gens disent dans leurs réponses "utiliser la FFT" ou "utiliser le passage à zéro" est parce que ce sont quelques-uns des blocs de construction DSP de base utilisés dans la reconnaissance vocale et les algorithmes associés. Mais la FFT et le taux de croisement nul ne sont généralement que les premières étapes de la création d'un ensemble de paramètres décrivant le son. Ces paramètres sont ensuite analysés statistiquement (et non par une fonction magique) pour déterminer à quelle catégorie ils appartiennent le plus probablement. Notez que j'ai dit "très probablement": même la meilleure détection de la parole (et le cerveau humain!

Ainsi, certains paramètres que vous pouvez rechercher incluent:

  • taux de passage à zéro
  • centroïde de fréquence
  • enveloppe (il s'agit en fait d'un ensemble de paramètres, y compris, par exemple, le temps d'attaque)
  • enveloppe spectrale
  • équilibre harmonique pair / impair
  • voiciness
  • hauteur fondamentale

Une fois que vous disposez d'un ensemble de paramètres qui, selon vous, vous permettront de distinguer vos sons, vous devrez utiliser une méthode statistique pour les classer. Le modèle de Markov caché est souvent utilisé dans le discours. Vous pouvez également vous pencher sur la régression logistique, K-means, et je suis sûr qu'il existe d'autres choix, mais je pense que HMM a fait ses preuves.

Bjorn Roche
la source
Votre réponse est bonne, mais je demande essentiellement de faire correspondre les sons de l'utilisateur aux sons qu'il émet plus tard pour utiliser mon logiciel. Comme, des trucs de similitude. Supposons qu'un utilisateur crée différents types de sons A, B et C. Et les caractéristiques de ces sons sont stockées respectivement en C_A, C_B et C_C.
bad_keypoints
La technique est toujours la même: 1. déterminer quels paramètres vous allez mesurer, 2. les mesurer, 3. utiliser des statistiques pour savoir ce qui rend chaque son différent, 4. utiliser ces données pour classer.
Bjorn Roche
c'est essentiellement ce que je pensais. mais je suppose que je vais devoir voir avec quels paramètres de la bonne longue liste que vous avez fournie, je devrais marquer les sons distinguish avec.
bad_keypoints
1
Pour être honnête, je suis très pessimiste à l'idée de pouvoir distinguer des choses comme un claquement de doigt et un interrupteur d'éclairage dans une variété d'environnements sans beaucoup d'échantillons de données et peut-être plus de paramètres que ceux que j'ai donnés, mais j'espère que je me trompe. Veuillez rendre compte de vos résultats même si cela prend un certain temps.
Bjorn Roche
En outre, certaines personnes de la liste de diffusion music-dsp ( music.columbia.edu/cmc/music-dsp ) pourraient avoir d'autres suggestions.
Bjorn Roche
0

J'ai utilisé cet article sur le pointage d'extrémité basé sur l'entropie lorsque j'essayais d'ignorer ces types de sons dans les appels téléphoniques, utilisés pour la reconnaissance vocale par ordinateur, si les sons que vous essayez de capturer sont de la parole, l'entropie pourrait très bien fonctionner, pour la musique, cela peut pas utile.

Nathan Day
la source
0

Je pense que les recommandations de Bjorn sont très bonnes, mais je veux fournir quelques informations supplémentaires. D'après votre description, cela ressemble beaucoup à un problème d'identification du timbre. Il existe des recherches dans ce domaine dans des contextes de musique informatique (identifier différents instruments est une chose utile à faire et faire la différence entre un claquement et un claquement est dû au timbre du son). William Brenta fait quelques recherches dans ce domaine (recherchez timbreID sur sa page) et créé des logiciels à utiliser dans Pure Data. Dans chacune des situations que vous recherchez pour des événements spécifiques, effectuer une segmentation automatique par détection de début serait une bonne idée. Puisque vous prenez déjà un STFT, déterminer un début ne nécessiterait pas trop de travail supplémentaire (regardez dans la détection du début du flux spectral). Un aperçu du système pourrait être en tant que tel:

Entraînement

  • Déterminer les caractéristiques appropriées (p. Ex. Taux de passage par zéro, centroïde spectral, MFCC)
  • Détecter un début
  • Calculez ces fonctionnalités sur l'entrée audio (vos enregistrements gestuels)
  • Gardez une base de données de calculs d'entités. Vous devrez déterminer s'il s'agit d'une situation de formation supervisée ou non supervisée. Par exemple, les utilisateurs spécifient-ils au préalable qu'un snap est "son 1" et un clap est "son 2", ou votre système essaie-t-il de les regrouper après la formation.

Classification

  • Détectez un début en temps réel et calculez les fonctionnalités de l'audio entrant
  • Utilisez une métrique de distance (distance euclidienne ou autre distance Lp) pour effectuer une classification de voisin le plus proche ou de K-voisin le plus proche afin de déterminer le son "le plus proche" de votre base de données

Ce document sur l'identification du timbre percussif pourrait être d'une certaine utilité. Il décrit les définitions des caractéristiques potentielles à calculer sur le son entrant et la méthode de classification de l'auteur. Cela fonctionnera assez bien pour les sons de percussion, mais pourrait ne pas fonctionner aussi bien pour quelque chose comme la parole (plusieurs syllabes), dans ce cas, une méthode HMM serait plus appropriée. De même, la précision de votre détection de début varie en fonction des types de sons que vous recherchez.

Si vous êtes particulièrement préoccupé par les boutons-pression par rapport aux interrupteurs d'éclairage, passez un peu de temps à déterminer quelles fonctionnalités pourraient distinguer avec précision les deux sons.

greatscott
la source
Je détecterais le début en détectant des changements soudains dans les données audio entrantes. Cela devrait fonctionner. Je détecte le début et la fin des gestes à stocker.
bad_keypoints
Oui, cela devrait surtout fonctionner. La seule raison pour laquelle j'ai suggéré Spectral Flux, c'est que vous allez quand même prendre un STFT. Si vous vous attendez à un environnement assez calme, un seuil d'amplitude de base devrait fonctionner assez bien.
greatscott