[PYTHON] Une introduction à l'analyse vocale pour les applications musicales

Ceci est un résumé du contenu de Traitement du signal audio pour les applications musicales que j'ai pris à Coursera. Je pense que ce sera une passerelle lorsque vous voudrez aller plus loin que la simple lecture d'une piste.

Objectif de l'analyse vocale

En gros, l'analyse vocale consiste à clarifier "de quelle fréquence le son que vous entendez est composé". C'est ce qu'on appelle l'analyse spectrale. Une fois que cela sera révélé, vous pourrez:

Comme mentionné ci-dessus, si la décomposition (analyse) est réussie, il sera possible de créer un son en synthétisant le contraire. En d'autres termes, l'analyse musicale est un processus de ** décomposition-> analyse-> (conversion / filtrage) -> reconstruction ** dans son ensemble (on peut dire qu'il s'agit d'un alchimiste d'acier).

Expression de la voix

La première étape de l'analyse de la parole commence par l'expression de la parole en tant que fonction.

x[n] = Acos(\omega nT + \phi) = Acos(2\pi fnT + \phi)

Je pense que c'est dans ma mémoire que le graphique de la fonction triangulaire ressemble à une onde sonore. Ceci est utilisé pour exprimer le son en tant que fonction. La vitesse angulaire de $ \ omega $, comme son nom l'indique, est l'angle auquel elle se déplace par unité de temps (1 seconde). L'unité d'angle est le radian (pour ceux qui disent radian, veuillez vous reporter à ici), dans le cas du radian $ 2 \ pi $ fait un tour, c'est-à-dire un cycle, donc en divisant $ \ omega $, dont l'unité est le radian, par $ 2 \ pi $ donne $ f $ par seconde, soit Hz.

Le point à noter est $ n , qui est l'indice du son final ( x [n] $). Si ce $ n $ avance de 1, il avance de $ T $ secondes. $ T $ est l'inverse de la fréquence d'échantillonnage, qui est l'intervalle d'échantillonnage. La fréquence d'échantillonnage représente la fréquence avec laquelle le son est acquis, et plus elle est élevée, plus le son (son de fréquence plus élevée) peut être traité. La fréquence d'échantillonnage doit avoir une marge d'au moins deux fois la fréquence que vous souhaitez acquérir pour la composition (théorème d'échantillonnage), et même si la plage audible humaine des CD généraux est d'environ 20 000 Hz. 44 100 Hz, soit environ le double, est adopté.

L'introduction a été allongée, mais la figure ci-dessous est un graphique de cette fonction avec les paramètres réels. Lorsque vous l'entendez comme un son, cela produit un son semblable à celui d'un test auditif.

sineWave.PNG

CC by MTG(Basicmathematics-Sinewaveplot)

Cependant, il est difficile à gérer tel quel, nous allons donc utiliser la formule d'Euler pour le convertir en fonction exponentielle.

\bar{x}[n] = Ae^{j(\omega nT + \phi)} = Acos(\omega nT + \phi) + Asin(\omega nT + \phi)

La formule d'Euler montre la relation entre l'exposant complexe et la fonction triangulaire $ e ^ {j \ phi} = cos \ phi + jsin \ phi $ (voir la figure ci-dessous), et en appliquant cela, la fonction triangulaire Il est possible de convertir la représentation en une représentation d'un exposant complexe.

euler.PNG CC by MTG(Basicmathematics-Euler'sformula)

L'avantage d'utiliser la représentation exponentielle complexe est que l'amplitude $ A $ peut être facilement exprimée comme la valeur absolue du nombre complexe, et la phase initiale $ \ phi $ peut être facilement exprimée comme l'angle de déviation.

complex_representation.PNG CC by MTG(Basicmathematics-Complexnumbers)

L'histoire jusqu'à présent peut être résumée comme suit.

Maintenant que le son peut être exprimé, je vais vous expliquer comment décomposer et reconstruire ce son.

Décomposition / reconstruction de la voix

Transformée de Fourier discrète (DFT)

Dès la conclusion, c'est la transformée de Fourier qui décompose la voix et la transformée de Fourier inverse qui la reconstruit. Cependant, comme le temps géré par l'ordinateur est discret comme expliqué ci-dessus, il est appelé transformation de Fourier discrète / transformation inverse.

Tout d'abord, voyons comment la transformation de Fourier discrète (DFT) qui effectue la décomposition est définie.

X[k] = \sum^{N-1}_{n=0} x[n] e^{-j2\pi kn/N}

L'essence de la transformation de Fourier est de découvrir la répartition $ X [k] $ de la quantité de son que chaque fréquence $ k $ est contenue dans les échantillons $ N $ obtenus $ x [n] $. Cependant, il faut noter ici que $ k $ n'est pas une simple fréquence. La limite supérieure de la fréquence qui peut être examinée est déterminée par la fréquence d'échantillonnage $ f_s $, mais si seulement $ N $ est échantillonné à partir de celle-ci, elle sera examinée tous les $ f_s / N $ (= discret). Ce $ f_s / N $ est l'unité de k, donc la relation entre $ k $ et la fréquence est $ f_k = f_s k / N $ comme décrit ci-dessus. Le fait est que la finesse de la fréquence à examiner dépend du nombre d'échantillons.

Si vous ne gardez pas ces deux points à l'esprit, vous serez confus par la conversion d'unité. La partie $ e ^ {-j2 \ pi kn / N} $ dans DFT a pour effet d'annuler tout autre chose que la fréquence souhaitée $ k $ à partir de $ x [n] $ (The Discrete Fourier Transform 2 of 2, [Généralisations d'identité d'Euler](http://en.wikipedia.org/ Voir wiki / Euler's_identity)), vous ne pouvez obtenir que $ k $ en multipliant $ x [n] $ par ceci. En calculant ceci pour $ n $ à chaque fois et en prenant la somme, nous calculons la somme des composants $ k $ contenus dans $ n $ à chaque fois, c'est-à-dire combien de fréquence $ k $ est incluse dans tout le son. Tu peux le faire.

La figure ci-dessous montre ce qui a été réellement calculé et tracé.

DFT.PNG CC by MTG(TheDiscreteFourierTransform1of2)

La première étape montre le son réel, les deuxième et troisième étapes montrent le résultat DFT, la deuxième étape est l'amplitude et la troisième étape est le graphique de phase initiale. Dans la deuxième rangée, l'axe vertical est l'intensité de l'amplitude convertie en digibel, et l'axe horizontal est Hz, qui montre la hauteur du son et sa force (c'est ce qu'on appelle le spectre de magnitude). ). Dans la troisième rangée, l'axe vertical est la phase initiale (vitesse angulaire) et l'axe horizontal est Hz, ce qui indique quel son de hauteur commence à sonner à quel moment (c'est ce qu'on appelle le spectre de phase).

Ici, je résumerai quelques questions connexes.

magnitude_symmetry.PNG CC by MTG(TheDiscreteFourierTransform2of2DFTofrealsinusoid)

Puisque nous n'avons pas besoin du côté négatif, nous ne traitons généralement que 0 ou plusieurs parties (moitié positive).

\sum_{n=-N/2}^{N/2-1}|x[n]|^2 = \frac{1}{N}\sum_{k=-N/2}^{N/2-1}|X[k]|^2
db = 20 * log_{10}(abs(X)=magnitude)

phase_unwrap.PNG CC by MTG(FourierTransformproperty2of2Phaseunwrapping)

zero_padding.PNG CC by MTG(FourierTransformproperty2of2Zero-padding)

Effectuer une DFT et clarifier la magnitude et la phase est le processus équivalent à la «décomposition sonore».

Reconstruction (IDFT: Inverse Discrete Fourier Transform)

La transformée de Fourier discrète inverse (IDFT) est utilisée pour reconstruire le son original en utilisant la magnitude et la phase obtenues à la suite de la DFT.

x[n] = \frac{1}{N}\sum^{N-1}_{k=0}X[k]e^{j2\pi kn/N}

Il s'agit de l'opération inverse de DFT et resynthétise la voix.

Accélérant

Lors du calcul, utilisez la transformation de Fourier à grande vitesse / transformation inverse (FFT / IFFT) qui accélère la DFT / IDFT. Pour utiliser FFT, procédez comme suit:

fft.PNG

FFT / IFFT est implémenté dans scipy et peut être facilement implémenté en l'utilisant.

L'explication ci-dessus est plus rapide à lire dans le code, veuillez donc vous y référer également.

MTG/sms-tools/software/models/dftModel.py

Je pense que vous pouvez maintenant décomposer et reconstruire la voix. Cependant, dans l'état actuel des choses, nous reconstruisons simplement le son original, je voudrais donc aller un peu plus loin sur la façon d'analyser les résultats de la décomposition à partir d'ici, puis enfin regarder les parties liées à la conversion et au filtrage.

Analyse des résultats de la décomposition vocale

Analyse des changements de séries chronologiques (STFT: Short-Time Fourier Transform)

Une chanson typique a une durée de plusieurs minutes, et lorsqu'elle est appliquée à la FFT, les sons qui sonnent à différents moments de la chanson sont mélangés, et l'ampleur et la phase deviennent encombrées et les caractéristiques deviennent difficiles à saisir. Je vais finir. Par conséquent, le morceau est divisé en longueurs fixes et une transformée de Fourier discrète est exécutée pour chaque unité de division. En les organisant, vous pouvez saisir le changement de magnitude / phase dans les séries chronologiques. Cette méthode est appelée transformation de Fourier à court terme (STFT).

X_l[k] = \sum^{N/2-1}_{n=-N/2}w[n]x[n+lH]e^{-j2\pi kn/N}

Il s'agit d'une image de décalage de la plage d'analyse de taille N par H (voir la figure ci-dessous).

stft_image.PNG CC by MTG(TheShort-TimeFourierTransform(1of2))

$ w $ est appelé une fonction de fenêtre. La raison de l'application d'une telle chose est qu'on suppose que la partie découpée de taille N est un "signal périodique". Cependant, en réalité ce n'est pas le cas, donc la première partie est appliquée avec une fonction qui converge vers 0 à la fin pour faire apparaître comme s'il s'agissait d'un signal périodique. La fonction pour cela s'appelle la fonction de fenêtre.

Vous vous demandez peut-être s'il est correct d'appliquer quelque chose comme ça, mais au contraire, si vous n'appliquez pas la fonction de fenêtre, l'hypothèse de "signal périodique" sera rompue, donc lorsque vous reconstruisez la voix, du bruit sera généré. Il semblera qu'il est inclus.

Plus précisément, la fonction de fenêtre est la suivante (ce qui suit est une simple fenêtre rectangulaire).

window_function.PNG CC by MTG(TheShort-TimeFourierTransform(1of2)Analysiswindow)

Il prend une valeur de 1 au pic et prend la forme d'un seul pic qui se désintègre autour de lui. En prenant la magnitude, il devient comme indiqué dans la figure ci-dessus. Le pic est appelé lobe principal et le pic à côté du pic est appelé lobe latéral. Puisqu'il est préférable que la fonction de fenêtre passe uniquement la fréquence cible, plus le lobe principal est étroit, plus la résolution de fréquence est élevée et plus le lobe latéral autre que le lobe principal est bas, plus l'effet sur les sons (petits sons) autres que le principal est important. Va être réduit. Il y a un compromis entre l'étroitesse du lobe principal et du lobe latéral bas, et il est nécessaire de les utiliser correctement en fonction de la situation. En général, sélectionnez celui avec un lobe latéral bas dans le cas où des sons forts et faibles sont inclus, et sélectionnez celui avec un lobe principal étroit dans le cas où il tient dans un certain volume, en donnant la priorité à la résolution. (Le premier est souvent blackman / blackman-harris et le second martèle / pend).


Référence
Window function Windowing Understanding FFT Windows Choosing a Windowing Function

Sinusoidal model

Le modèle sinusoïdal consiste à penser un son complexe comme un ensemble de sons simples (sinusoïde) d'une fréquence spécifique. Dans le modèle ci-dessous, le son au temps n est représenté par R sons de fréquences spécifiques.

y[n] = \sum^R_{r=1} A_r[n]cos(2\pi f_r [n]n)

S'il peut s'appliquer à ce modèle, il semble possible de reconstruire des sons complexes à partir de sons simples. Alors, comment savoir de quelle fréquence est composé un son? L'indice est toujours le spectre.

L'analyse spectrale révèle que les sons de différentes fréquences sont détectés sous forme de pics de magnitude, comme indiqué ci-dessous.

image Week 5: Sinusoidal model, Theory lecture 1: Sinusoidal model 1

Par conséquent, il semble que les fréquences qui composent le son peuvent être bien identifiées en suivant les étapes ci-dessous.

  1. Créez un spectre de magnitude afin que les pics puissent être bien détectés
  2. Identifiez l'emplacement du pic

Commencez par aller de "1. Créez un spectre de magnitude pour que les pics puissent être bien détectés". Le point de ceci est la taille de la fenêtre, et il est nécessaire de définir de sorte que plusieurs composants de fréquence tiennent à l'intérieur de la fenêtre.

image Week 5: Sinusoidal model, Theory lecture 1: Sinusoidal model 1

Comme indiqué dans ci-dessus, la fréquence détectable est en unités $ f_s / N . Par conséquent, cela devrait être inférieur à la différence entre les deux fréquences que vous essayez de détecter (car sinon vous ne pouvez pas décomposer les deux fréquences). Tout d'abord\frac{f_s}{|f_{k+1} - f_k|}Est dérivé. Et le nombre de bacs qui s'insèrent dans le lobe principal de la fonction de fenêtre est fixe, et c'estB_sSera. Donc,B_s \frac{f_s}{|f_{k+1} - f_k|}$La taille appropriée peut être dérivée avec.

Un exemple d'un mélange des 440/490 ci-dessus est le suivant.

image Week 5: Sinusoidal model, Theory lecture 1: Sinusoidal model 1

Eh bien, je ne sais pas vraiment quelle est la fréquence de ce son (440 et 490!), Donc je vais ajouter quelque chose comme 100-2000Hz et choisir un M qui fonctionne bien sur toute la fréquence entre les deux. (Comme ça. L'axe horizontal est la fréquence et l'axe vertical est k (M = k * 100 +) Puisque k = 21 est stable à n'importe quelle fréquence, 2101 est utilisé comme M).

Harmonic model Sinusoidal plus residual model(Stochastic model)

Conversion / filtrage

filtration

**A3: Fourier Properties Part-4: Suppressing frequency components using Citation du modèle DFT **

Implementation

conversion

Week8 - Sound transformations

Classification des voix

Week9 - Sound and music description

Vers le monde de la recherche en analyse vocale

Week10 - Concluding topics

Recommended Posts

Une introduction à l'analyse vocale pour les applications musicales
Introduction à la modélisation statistique pour l'analyse des données
Une introduction à Mercurial pour les non-ingénieurs
Premiers pas avec Python pour les non-ingénieurs
Une introduction à OpenCV pour l'apprentissage automatique
Une introduction à Python pour l'apprentissage automatique
Une introduction à Python pour les programmeurs en langage C
Une introduction à l'apprentissage automatique pour les développeurs de robots
Une introduction à la programmation orientée objet pour les débutants par les débutants
Note de lecture: Introduction à l'analyse de données avec Python
Introduction à Private TensorFlow
Une introduction à l'apprentissage automatique
Une introduction à la programmation Python
Introduction à discord.py (3) Utilisation de la voix
Introduction à l'optimisation bayésienne
Introduction à Python pour, pendant
Introduction à la modélisation statistique pour l'analyse des données Sélection du modèle GLM
Notes de lecture (en Python et Stan) pour une introduction à la modélisation statistique pour l'analyse de données (Midorimoto)
Introduction à l'analyse d'image opencv python
[Tutoriel Python] Une introduction facile à Python
Introduction à la modélisation statistique pour l'analyse des données Test de rapport de ressemblance GLM et asymétrie de test
Réseau neuronal récursif: une introduction à RNN
Introduction à discord.py (1er jour) -Préparation pour discord.py-
Les débutants lisent "Introduction à TensorFlow 2.0 pour les experts"
Une introduction aux applications Web Python auto-conçues pour un ingénieur Web de troisième année paresseux
Une introduction à l'orientation des objets - Donnez à un objet un enfant.
Introduction à la modélisation statistique pour l'analyse des données Élargissement de la gamme d'applications de GLM
Une introduction à l'analyse de données à l'aide de Python - Pour augmenter le nombre de vues vidéo -
Qu'est-ce qu'un algorithme? Introduction à l'algorithme de recherche] ~ Python ~
Une introduction à Cython sans aller plus loin
Comment utiliser les outils d'analyse de données pour les débutants
[Introduction à minimiser] Analyse des données avec le modèle SEIR ♬
[Introduction à l'application Udemy Python3 +] 43. instruction for else
Introduction à Python "Re" 1 Construction d'un environnement d'exécution
Introduction à la programmation (Python) TA Tendency pour les débutants
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Comprendre le développement de Python pour Pepper. -Introduction à Python Box-
Introduction à Cython sans approfondir -2-
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction au traitement parallèle distribué Python par Ray
[Introduction à python] Introduction rapide à Python pour les programmeurs C ++ occupés
Introduction à Word2Vec que même les chats peuvent comprendre
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
[Livre technique] Introduction à l'analyse de données avec Python -1 Chapitre Introduction-
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Introduction à Flask Partie 1: essayez d'abord de l'exécuter localement et créez un fichier exécutable pour la distribution