J'ai lu des morceaux en ligne, mais je ne peux pas tout rassembler. J'ai une connaissance de base des signaux / trucs DSP, ce qui devrait être suffisant pour cela. Je souhaite éventuellement coder cet algorithme en Java, mais je ne le comprends pas encore complètement, c'est pourquoi je suis ici (cela compte comme des mathématiques, non?).
Voici comment je pense que cela fonctionne avec les lacunes de mes connaissances.
Commencez avec votre échantillon de discours audio, par exemple un fichier .wav, que vous pouvez lire dans un tableau. Appelez ce tableau , où varie de (donc échantillons). Les valeurs correspondent à l'intensité audio je suppose - amplitudes.n 0 , 1 , … , N - 1 N
Divisez le signal audio en "trames" distinctes de 10 ms environ où vous supposez que le signal vocal est "stationnaire". Il s'agit d'une forme de quantification. Donc, si votre taux d'échantillonnage est de 44,1 KHz, 10 ms est égal à 441 échantillons, ou valeurs de .
Faites une transformée de Fourier (FFT pour le calcul). Maintenant, est-ce fait sur le signal entier ou sur chaque trame distincte de ? Je pense qu'il y a une différence parce qu'en général la transformée de Fourier regarde tous les éléments d'un signal, donc rejoint avec joint à où sont les plus petites images. Quoi qu'il en soit, disons que nous faisons de la FFT et que nous nous retrouvons avec pour le reste.F ( x [ n ] ) ≠ F ( x 1 [ n ] ) F ( x 2 [ n ] ) … F ( x N [ n ] ) x i [ n ] X [ k ]
Cartographie à l'échelle de Mel et journalisation. Je sais comment convertir des nombres de fréquence réguliers à l'échelle Mel. Pour chaque de ("l'axe des x" si vous me le permettez), vous pouvez faire la formule ici: http://en.wikipedia.org/wiki/Mel_scale . Mais qu'en est-il des "valeurs y" ou des amplitudes de ? Restent-ils simplement les mêmes valeurs mais décalés aux endroits appropriés sur le nouvel axe Mel (x-)? J'ai vu dans un article qu'il y avait quelque chose à propos de l'enregistrement des valeurs réelles de parce que si où l'un de ces signaux est présumé être du bruit, vous ne voulez pas , l'opération logarithmique sur cette équation transforme le bruit multiplicatif en bruit additif, qui, espérons-le, peut être filtré (?).
La dernière étape consiste maintenant à prendre un DCT de votre modifié par le haut (mais il a fini par être modifié). Ensuite, vous prenez les amplitudes de ce résultat final et ce sont vos MFCC. J'ai lu quelque chose sur le rejet des valeurs hautes fréquences.
J'essaie donc vraiment de comprendre comment calculer ces gars étape par étape, et clairement certaines choses m'échappent d'en haut.
De plus, j'ai entendu parler de l'utilisation de "banques de filtres" (un tableau de filtres passe-bande essentiellement) et je ne sais pas si cela se réfère à la création des images à partir du signal d'origine, ou peut-être que vous créez les images après la FFT?
Enfin, il y a quelque chose que j'ai vu au sujet des MFCC ayant 13 coefficients?
la source
Réponses:
Pas à pas...
1. & 2 . C'est correct. Notez que les trames se chevauchent généralement, par exemple, la trame 0 correspond aux échantillons 0 à 440; la trame 1 correspond aux échantillons 220 à 660; l'image 2 est des échantillons 440 à 880 et ainsi de suite ... Notez également qu'une fonction de fenêtre est appliquée aux échantillons dans l'image.
3 . La transformée de Fourier est effectuée pour chaque trame. La motivation derrière cela est simple: un signal vocal varie dans le temps, mais est stationnaire sur de courts segments. Vous voulez analyser chaque segment court individuellement - car sur ces segments, le signal est suffisamment simple pour être décrit efficacement par quelques coefficients. Pensez à quelqu'un qui dit "bonjour". Vous ne voulez pas voir tous les phonèmes réduits en un seul spectre (la FFT réduit les informations temporelles) en analysant tout le son à la fois. Vous voulez voir "hhhhheeeeeeeeeeelloooooooooo" pour reconnaître le mot étape par étape, il doit donc être décomposé en segments courts.
Une fois ces fréquences définies, nous calculons une somme pondérée des amplitudes (ou énergies) FFT autour de chacune de ces fréquences.
Regardez l'image suivante, représentant une banque de filtres avec 12 bacs:
Le 8ème casier a une fréquence centrale d'environ 2 kHz. L'énergie dans le 8e casier est obtenue en additionnant les énergies FFT pondérées dans les 1600 à 2800 Hz environ - avec un pic de poids à environ 2 kHz.
Note d'implémentation: Ce tas de sommes pondérées peut être fait en une seule opération - une multiplication matricielle d'une "matrice de banc de filtres" par le vecteur des énergies FFT.
Donc, à ce stade, nous avons "résumé" le spectre FFT en un ensemble de 40 (12 dans l'illustration) valeurs d'énergie, chacune correspondant à une plage de fréquences différente. Nous prenons le log de ces valeurs.
la source
39 mel
étape 4?