Un de mes projets de week-end m'a amené dans les eaux profondes du traitement du signal. Comme pour tous mes projets de code qui nécessitent des calculs intensifs, je suis plus qu'heureux de bricoler mon chemin vers une solution malgré un manque de connaissances théoriques, mais dans ce cas, je n'en ai pas et j'aimerais avoir des conseils sur mon problème , à savoir: j'essaie de savoir exactement quand le public en direct rit pendant une émission de télévision.
J'ai passé pas mal de temps à lire sur les approches d'apprentissage automatique pour détecter le rire, mais j'ai réalisé que c'était plus à voir avec la détection du rire individuel. Deux cents personnes qui rient à la fois auront des propriétés acoustiques très différentes, et mon intuition est qu'elles devraient être distinguées par des techniques beaucoup plus grossières qu'un réseau neuronal. Je me trompe peut-être complètement! J'aimerais avoir des réflexions sur la question.
Voici ce que j'ai essayé jusqu'à présent: j'ai découpé un extrait de cinq minutes d'un épisode récent de Saturday Night Live en deux clips. J'ai ensuite étiqueté ces «rires» ou «sans rire». À l'aide de l'extracteur de fonctionnalités MFCC de Librosa, j'ai ensuite exécuté un clustering K-Means sur les données, et j'ai obtenu de bons résultats - les deux clusters ont été très bien mappés à mes étiquettes. Mais quand j'ai essayé de parcourir le fichier plus long, les prédictions n'ont pas tenu le coup.
Ce que je vais essayer maintenant: je vais être plus précis sur la création de ces clips de rire. Plutôt que de faire une séparation et un tri aveugles, je vais les extraire manuellement, afin qu'aucun dialogue ne pollue le signal. Ensuite, je vais les diviser en clips d'un quart de seconde, calculer les MFCC de ceux-ci et les utiliser pour former un SVM.
Mes questions à ce stade:
Est-ce que tout cela a du sens?
Les statistiques peuvent-elles aider ici? J'ai défilé dans le mode d'affichage du spectrogramme d'Audacity et je peux voir assez clairement où les rires se produisent. Dans un spectrogramme de puissance logarithmique, la parole a un aspect "sillonné" très distinctif. En revanche, le rire couvre un large spectre de fréquences assez uniformément, presque comme une distribution normale. Il est même possible de distinguer visuellement les applaudissements du rire par l'ensemble de fréquences plus limité représenté par les applaudissements. Cela me fait penser aux écarts-types. Je vois qu'il y a quelque chose qui s'appelle le test de Kolmogorov – Smirnov, cela pourrait-il être utile ici? (Vous pouvez voir le rire dans l'image ci-dessus comme un mur d'orange frappant à 45% du chemin.)
Le spectrogramme linéaire semble montrer que le rire est plus énergique dans les basses fréquences et s'estompe vers les hautes fréquences - cela signifie-t-il qu'il peut être qualifié de bruit rose? Si tel est le cas, cela pourrait-il être une solution au problème?
Je m'excuse si j'ai abusé du jargon, j'ai été un peu sur Wikipédia pour celui-ci et je ne serais pas surpris si j'en avais un peu brouillé.
Réponses:
Sur la base de votre observation, ce spectre du signal est suffisamment reconnaissable, vous pouvez l'utiliser comme une caractéristique pour classer le rire de la parole.
Il y a plusieurs façons de voir le problème.
Approche n ° 1
Dans un cas, vous pouvez simplement regarder le vecteur du MFCC. et l'appliquer à n'importe quel classificateur. Étant donné que vous disposez de nombreux coefficients dans le domaine des fréquences, vous pouvez examiner la structure des classificateurs en cascade avec des algorithmes de renforcement tels que Adaboost sur la base de cela, vous pouvez comparer la classe de la parole à la classe du rire.
Approche n ° 2
Vous vous rendez compte que votre discours est essentiellement un signal variant dans le temps. Ainsi, l'un des moyens efficaces de le faire est d'examiner la variation temporelle du signal lui-même. Pour cela, vous pouvez diviser les signaux en lots d'échantillons et regarder le spectre pendant ce temps. Maintenant, vous pouvez vous rendre compte que le rire pourrait avoir un schéma plus répétitif pendant une durée stipulée où la parole possède intrinsèquement plus d'informations et donc la variation du spectre serait plutôt plus grande. Vous pouvez l'appliquer au type de modèle HMM pour voir si vous restez constamment dans le même état pour un spectre de fréquence ou si vous continuez à changer. Ici, même si parfois le spectre de la parole ressemble à celui du rire, il changera plus de temps.
Approche n ° 3
Forcer à appliquer un codage de type LPC / CELP sur le signal et observer le résidu. Le codage CELP constitue un modèle très précis de production de la parole.
De la référence ici: THÉORIE DU CODAGE CELP
Pour le dire simplement, après tout le discours qui est prédit de l'analyseur est supprimé - ce qui reste est le résidu qui est transmis pour recréer la forme d'onde exacte.
Comment cela résout-il votre problème? Fondamentalement, si vous appliquez le codage CELP, la parole dans le signal est principalement supprimée, ce qui reste est un résidu. En cas de rire, une majorité du signal pourrait être conservée car le CELP ne parviendra pas à prédire un tel signal avec la modélisation des voies vocales, où la parole individuelle aura très peu de résidus. Vous pouvez également analyser ce résidu dans le domaine fréquentiel, pour voir s'il s'agit de rire ou de discours.
la source
La plupart des dispositifs de reconnaissance vocale utilisent non seulement les coefficients MFCC mais également les dérivées première et deuxième des niveaux MFCC. Je suppose que les débuts seraient très utiles dans ce cas et vous aideraient à distinguer un rire des autres sons.
la source