TP Parole Reconnaissance de mots isolés

 
CONTINUER À LIRE
TP Parole
                  Reconnaissance de mots isolés

But du TP
Le but de ce TP est de réaliser un classifieur de mots parlés. Pour cela on distingue trois grandes
étapes :
– L’acquisition des signaux qui constitueront les base de données audio
– Les pré-traitement des signaux
– Le codage des mots
– La reconnaissance
On travaillera sur 10 à 15 classes de mots au choix. Il s’agira donc de construire un système
capable de reconnaître un mot parmi 10 ou 15 mots possibles. De ce point de vue le classifier se
range dans la catégorie des reconnaisseurs de parole monolocuteur et à vocabulaire limité.

1/ Prise en main de la boite à outils
Le matlab path
Ranger la boite à outils dans un répertoire puis décompresser le fichier rdf_3.1.13.zip. Pour
vérifier le bon fonctionnement de l’installation, taper la commande help rdf qui doit afficher
la liste des fonctions de la boite à outils. Les programmes devront être rangés dans un autre
répertoire pour ne pas être mélangés avec les fonctions de la boite à outils. La commande help
nom_fonction permet d’afficher l’aide sur la fonction nom_fonction.

Acquisition
La fonction audioget permet de réaliser l’échantillonnage de signaux audio en utilisant un micro-
casque. Attention a bien spécifier le format de génération du fichier (.mat ou .wav). Il ne suffit
pas de nommer un fichier avec l’extension .wav pour qu’il soit un fichier au format .wav. Pour
la suite du TP on demande d’utiliser uniquement le format .wav.

Affichages
Les affichages s’effectuent avec la fonction plot de matlab. Cette fonction ne connaît pas la
nature des signaux à afficher. Il faut donc spécifier les axes correctement pour avoir des affichages
qui aient un sens physique. La syntaxe suivante affiche un signal avec en abscisse le numéro
d’échantillon :

plot(Signal);

Echelle des temps
Pour représenter correctement l’axe des temps il faut connaître la fréquence d’échantillonnage.
Soit par exemple Fe = 22050Hz. La période d’échantillonnage est le temps séparant deux échan-
tillons successifs. Il est l’inverse de la période : Te = 1/Fe , soit 1/22050s. Si le nombre total
d’échantillons est N , le signal aura une durée totale de N Te . L’échelle des temps s’étendra donc

                                                 1
de 0 secondes à N Te = N/Fe secondes. Pour représenter cela sur le graphe, on construit un
vecteur temps de N échantillons :
N = length(Signal);
t = 0:(N -1);
Pour passer à l’échelle des temps on écrit :
Fe = 22050;
Te = 1/Fe;
t = t * T_e ;
Il reste à afficher :
plot(t, Signal);

Echelle des fréquences
Le calcul du module du spectre d’un signal s’effectue en utilisant la fonction FFT de matlab pour
obtenir le spectre et de la fonction ABS afin de calculer le module :
SignalF = abs(fft(Signal));
plot(SignalF);
Pour représenter l’axe des fréquences, on défini un vecteur de fréquences, en sachant que la FFT
effectue le calcul de la fréquence 0 à la fréquence Fe :
f = 0:N-1;    % nombre d’écrantillons en fréquence (le même qu’en temps
f = f*F_e/(N-1); % passage en échelle fréquences
plot(f,SignalF); % affichage

2/ Pré-traitements
On dispose de la fonction SPEECHGET pour charger un fichier .wav (un mot par fichier). Le
signal de parole doit subir avant codage les pré-traitements suivants : Retrait des zones de
silence, découpage en trames, préaccentuation et fenetrage de Hamming des trames (fonctions
SPEECHGET, SIGPREACC et HAMMING. Suite à ces traitements, on récupère un ensemble de signaux,
rangés dans un tableau, et le nombre de signaux correspond au nombre de trames composant le
mot.

2.1/ Seuil de détection du signal de parole
La fonction SPEECHGET s’utilise de la façon suivante :
[trames sigcut signal] = speechget(’mot.wav’, 256, 128, 0.01);
Dans cette exemple, le signal au format .wav rangé dans le fichier mot.wav est segmenté en
trames de 256 échantillons, entrelacées de 128 échantillons (en général le nombre d’échantillons
de la trame divisé par deux) et un seuil de 0.01 est appliqué pour séparer les zones de silence de
part et d’autre. La fonction retourne trois signaux :
– trames est une matrice qui comprend toutes les trames les unes sous les autres (rangées en
  ligne). Sa dimension est donc de nb_trame, 256, où nb_trame désigne le nombre de trames
  extraites. Ce nombre ne peut évidemment pas être connu à l’avance.
– sigcut est le signal dans lequel les zones détectées comme du silence par la fonction ont été
  remplacées par des 0 ;

                                                2
– signal est le signal d’origine sans pré-traitements
Voici un exemple de traitement qui permet d’observer le signal d’origine et le signal après seg-
mentation des zones de silence :

  close all;
  clear all;
  [Trames, CutSignal, Signal] = speechget(’deux.wav’, 256, 128, 0.05);-
  sound(Signal, 22050);
  sound(CutSignal, 22050);
  subplot(211);
  plot(Signal);
  subplot(212);
  plot(CutSignal);

Tester la fonction SPEECHGET sur un signal de parole pour plusieurs valeurs du seuil de détection.
On conservera cette valeur de seuil pour la constitution des bases d’apprentissage.

2.2/ Pré-traitement des signaux
Les fonctions SIGPREACC et HAMMING réalisent respectivement la préaccentuation et le fenêtrage
de l’ensemble des trames données en argument. Typiquement, en reprenant l’exemple précédent :
  TramesPracc = sigpreacc(Trames, 0.97);
  TramesPraccH = sighamming(TramesTracc);
Appliquer aux trames extraites à la question précédente les pré-traitements de préaccentuation
et de Hamming. En choisissant une trame comportant suffisamment d’énergie, comparer sur le
plan temporel et sur le plan spectral l’impact de ces traitements (Visualiser le module du spectre
du signal sur une trame avant et après les prétraitements). Observer la structure formantique
des signaux voisés. Pour afficher à la dixième trame, on écrira :
  plot(TramesPraccH(10,:));

3/ Codage
3.1/ Codage des trames
La boite à outils dispose d’un certain nombre de fonctions de codage :
– CODLPC qui effectue un codage LPC (Linear Predictive Coding) des trames de parole ;
– CODLPCC qui effectue un codage LPCC des trames de parole (une extension du code précédent
  qui permet d’estimer les coefficients cepstraux à partir des coefficients LPC ;
– CODMFCC qui effectue un codage MFCC (Mel Frequency Cepstrum Coding) des trames de
  parole.
Ces fonctions nécessitent de spécifier en argument le nombre de coefficients à générer. La fonction
CODMFCC nécessite également de spécifier la fréquence d’échantillonnage. Par ailleurs, à partir du
codage, les signaux doivent être rangés en colonnes et non plus en ligne. Les lignes suivantes
donnent des exemples de codage des trames de paroles générées plus haut (noter l’apostrophe
permettant de transposer les matrices pour passer les signaux en colonnes :
    codelpc = CODLPC(TramesPraccH’, 12);
    codelpcc = CODLPCC(TramesPraccH’, 12);
    codemfcc = CODMFCC(TramesPraccH’, 12, 16000);
Compléter les programmes précédents en ajoutant l’étape de codage comme décrit.

                                                3
3.2/ Evolution des codes dans le temps
Afin de se rendre compte de la corrélation des coefficients de code avec l’évolution du conduit
vocal, représenter l’évolution dans le temps des coefficients de codage pour chacun des codes
LPC, LPCC, MFCC. Pour cela on sélectionne une trame de coefficients, comme plus haut pour
les pré-traitements. L’exemple suivant montre l’évolution dans le temps du premier coefficients
de code :
    plot(codelpc(1,:));
Pour afficher l’évolution de l’ensemble des codes, attention à penser à afficher la transposée de
la matrice de code :
    plot(codelpc’);
– Observer l’évolution dans le temps d’un signal de parole quelconque pour plusieurs valeurs de
  la taille des trames : 32, 64, 128, 256, 512, et 1024. Qu’observe-t-on ?
– Enregistrer un signal de parole pour lequel le conduit vocal reste à peu près stationnaire
  (AAAAAAA.... par exemple).
– Enregistrer un deuxième signal pour lequel le conduit vocal évolue (BONJOUR par exemple).
– Observer l’évolution des coefficients dans les deux cas de figure. Que peut-on en conclure ?
– Coder le signal BONJOUR avec 32 coefficients de codes et observer l’évolution des 32 codes.
  Sont-ils tous représentatifs de l’évolution du signal ? Expliquer pourquoi.

3/ Classification
3.1/ Construction des bases
Enregistrer deux bases de 10 mots (20 fichiers). La première sera la base des modèles de référence
pour l’algorithme de classification DTW et la deuxième la base de test. On utilisera par exemple
’ref1.wav’, ’ref2.wav’, ..., ’ref10.wav’ et ’tst1.wav’, ’tst2.wav’, ... ’tst10.wav’.

3.2/ Codage des bases
Ecrire deux fonctions CODEREF( tramesize, offset, ncoeff, code, ...) et CODETST( tramesize,
offset, ncoeff, code, ...) permettant de coder l’ensemble des mots des bases de référence
et de test en utilisant les paramètres de codage donnés en argument (taille des trames, entrela-
cement, nombre de coefficients de codage, méthode de codage, ...). L’argument code pourra être
une chaîne de caractère spécifiant la méthode de codage à utiliser (LPC, LPCC, MFCC, ...). Les
fonctions retourneront les jeux de code de tous les mots rangés dans un tableau de cellules.

Utiliser les tableaux de cellules en Matlab. Les tableaux de cellules permettent de ranger
des éléments de type différent dans le même tableau. La syntaxe est la suivante :

  var{1} = 1:100; % on range un tableau de 100 éléments dans la première cellule
  var{2} = ’bonjour’; % on range une chaîne de caractères dans la deuxième cellule
  var{3} = 1.9; % on range un réel dans la troisième cellule...
  ...

Pour accéder aux éléments du tableau de cellules :

  disp (var{3}) ; % affichage de la chaîne de caractères
  valeur = var{1}(8); % affectation de la huitième valeur du tableau de 100 éléments
  ...

                                               4
Construire des chaînes de caractères. Pour automatiser le traitement on aura intérêt à
utiliser la concaténation de chaînes de caractères en procédant ainsi :

  for i=1:10
    filename = [’ref’ num2str(i) ’.wav’ ];
    ... = speechget(num2str, ...);
    ...
  end;

3.3/ Reconnaissance par l’algorithme DTW
La fonction dtw de la boite à outils permet de calculer la distance DTW (Dynamic Time Warping)
entre deux matrices de code (LPC, MFCC, ...) de taille différente (les mots comportent tous un
nombre de trames différent).
L’algorithme prendra la forme suivante :

  for i=1:10
    for j=1:10
       codetest = ...     % Code du i-ème mot à tester
       coderef = ...      % Code du j-ème mot de référence
       d(i,j) = dtw(codetest’, coderef’);   % Calcul de la distance DTW
    end;
  end;

A l’issue, la variable d contient l’ensemble des distances entre les mots de test et les mots de la
base de référence.
– Ecrire le programme permettant de classer l’ensemble des mots de la base de test en utilisant
  un algorithme de type 1-PPV avec la distance DTW. On commencera en codant les trames
  sur 8 coefficients. Observer la matrice des distances d obtenue ;
– Tester le programme en testant les mots de référence avec eux-mêmes. Observer la matrice des
  distance d obtenue.
– Visualiser les classes proposées par l’algorithme en recherchant les minima des lignes de la
  matrice d :
     [dmin, classe] = min(d);
     disp(d);
– La fonction score de la boite à outils permet de déterminer le nombre d’exemples bien classés
  relativement au nombre total d’exemples :
     taux = score(classe, 1:10);
     disp(taux);
  Comparer les scores lorsque l’on diminue ou augmente la dimension du codage (8,12,16, par
  exemple).
– Etudier de la même façon l’influence de la taille des trames.
– Tester les différents codages (LPC, LPCC, MFCC)
– Tester un locuteur pour la base de test différent de celui pour la base de référence.

                                                5
Vous pouvez aussi lire