Reconnaissance Vocale
Reconnaissance Vocale
Reconnaissance Vocale
Introduction.
Dans le but d'améliorer la communication homme-machine, on s'est assez vite intéressé, dans
la deuxième moitié du vingtième siècle, au problème de la reconnaissance vocale. En 1959 est mis
au point un système monolocuteur de reconnaissance des chiffres. Mais la difficulté du problème
dans sa généralité a été sous-estimée: si un programme ARPA avait été lancé dans les années
soixante-dix aux États-Unis, il faut attendre 1997 pour qu'IBM propose le premier logiciel de dictée
vocale, et nombreux sont encore les écueils inhérents à la reconnaissance vocale: un processus
complexe de la production de la parole à la détermination de l'orthographe, le bruit de fond, des
différences parfois importantes suivant les accents et les dialectes au sein d'une même langue,
l'incapacité de traiter le bilinguisme, situation commune dans certains pays, ainsi que des besoins
très importants en calcul, rendant difficile la reconnaissance en temps réel.
Nous considérons ici un cas particulier du problème, en nous intéressant uniquement aux
transitions entre voyelles non nasalisées et consonnes sonantes, et en nous arrêtant au niveau de la
reconnaissance du phonème. Nous proposons un algorithme de séparation des phonèmes, basé sur
la différence entre les niveaux d'énergie entre consonnes et voyelles, ainsi qu'un algorithme de
reconnaissance par analyse des formants, qui sont autant d'occasions de s'intéresser à la nature de la
voix humaine et de relier l'aspect physique à la phonologie, étude des éléments linguistiquement
discriminants de la voix.
Le son est une onde qui se propage dans un milieu matériel sous la forme de faibles variations
de pression. Il est perceptible à l'oreille humaine lorsque sa fréquence se situe globalement entre 20
Hz et 20 kHz au maximum. Toutefois, on estime que l'information phonétique se trouve en-dessous
de 10 kHz. Dans le cas d'une communication téléphonique, les fréquences au-dessus de 3,5 kHz
sont coupées, mais la conversation reste intelligible, certains phonèmes très aigus, comme [S ],
étant toutefois mal rendus.
Une caractéristique assez importante de l'audition humaine, connue sous le nom de « loi
d'Ohm » dans le domaine de l'acoustique, est que notre oreille n'est pas sensible à la phase du
signal, ce qui justifie que nous ne nous intéressions qu'au module dans les applications qui suivent.
2. La voix humaine
La voix humaine résulte de l'interaction entre l'air expiré et les divers organes phonatoires sur
son parcours. Dans le cas de phonèmes voisés, le son est initialement produit par la vibration des
cordes vocales. Il est ensuite traité de manière différente suivant les cavités par lesquelles il passe,
le pharynx et la bouche principalement. Ces cavités agissent comme des résonateurs qui renforcent
pour certains phonèmes les fréquences correspondant à leur fréquence de résonance. Ces fréquences
renforcées sont appelées formants, et ce sont eux que les phonologistes essaient de repérer dans un
spectrogramme pour reconnaître les phonèmes prononcés. Il est intéressant de noter que la cavité
nasale, elle, atténue les formants des phonèmes dits nasalisés, et c'est pourquoi on parle de
phénomène d'anti-résonance.
Ces organes phonatoires n'étant pas figés, leur forme varie en fonction du mode d'articulation
propre à un phonème particulier, et leurs fréquences de résonances aussi, d'où l'apparition de
formants différents pour chaque phonème. En pratique, on considère les trois ou quatre premiers
formants, les deux premiers étant les plus liés au mode d'articulation. Dans cette étude, on a décidé
d'en retenir quatre, notés F1, F2, F3 et F4.
3. Phonétique et phonologie
La phonétique est l'étude des phonèmes, ces derniers étant souvent définis comme « la plus
petite unité phonique distinctive ». Par exemple, l'opposition des mots « pain » et « bain » montre
que [p] et [b] sont des phonèmes. On peut les classer en plusieurs classes et sous-classes, le
premier niveau étant celui des voyelles et des consonnes.
Les voyelles sont des sons qui ont une durée assez longue, caractérisés par un libre
écoulement et une grande constance de leurs propriétés fréquentielles dans le temps: en l'absence
d'éléments prosodiques trop marqués, les formants sont horizontaux sur un spectrogramme. On
classe souvent les voyelles au moyen du trapèze vocalique, reproduit ci-dessous, qui représente leur
position dans le plan défini par les deux premiers formants et traduit la position de la langue lors de
l'articulation (voyelles postérieures ou antérieures, ouvertes ou fermées):
Les consonnes sont des phonèmes qui, lors de leur articulation, rencontrent un obstacle
(lèvres pour les voyelles labiales, dents pour les dentales, fermeture du palais pour [k], etc.). Elles
sont généralement beaucoup plus courtes que les consonnes et beaucoup plus variables dans le
temps. Elles peuvent être bruyantes ou sonantes. Ce n'est que dans ce dernier cas qu'elle présentent
des formants.
La figure ci-dessous représente le spectrogramme de la syllabe [asa] et illustre quelques-uns
des concepts formulés précédemment. On perçoit très clairement l'horizontalité des formants de la
voyelle [a] (même si sur cette image non traitée, ils ont difficiles à distinguer d'autres bandes
fréquentielles « parasites »). La consonne [s] est un bruit très aigu situé au-dessus de 5 kHz,
clairement exempt de formants.
II.Transformée de Fourier
La transformée de Fourier permet de réaliser une analyse temps-fréquence avec une résolution
suffisante pour le signal vocal, quasi-stationnaire sur des intervalles de l'ordre de 10 à 100 ms.
1. Transformée de Fourier
On se place dans l'ensemble des fonctions de carré intégrable L ² , qui est un préhilbertien,
et.on considère la famille orthogonale des sinusoïdes { eω = t eiωt /ω∈ 6 (bien sûr,
physiquement, on se limite aux pulsations positives). La transformée de Fourier F (ou TF(f)) d'une
fonction f permet de réaliser une projection sur l'espace vectoriel engendré par les sinusoïdes, en
calculant tout d'abord la composante de la projection sur chaque sinusoïde, donnée par le produit
scalaire, et en n'oubliant pas la conjugaison complexe par rapport à la seconde place:
∞
F ω= 〈 f ∣ eω 〉 = ∫ f t e
− iωt
dt
−∞
Dans notre étude, cette transformée ne nous servira jamais à reconstruire le signal, mais de
manière plus qualitative à examiner les contributions de chaque plage de fréquence dans le signal
vocal en étudiant le spectrogramme, qui est en fait une représentation tridimensionnelle indiquant la
magnitude (module de F(ω) ) dans le plan temps-fréquence. (D'après la loi d'Ohm, l'oreille n'est pas
sensible à la phase du signal auditif.)
Toutefois, il faut adapter cette représentation continue au cas discret, qui est celui du calcul
numérique.
F k = ∑ f ne N
n =0
k N
La fréquence d'observation est proportionnelle au facteur , pour k ∈[0, ] : si fe est la
N 2
k
fréquence d'échantillonnage, alors f = f e . Il faut noter que cette transformée est redondante,
N
car l'information obtenue est concentrée dans la moitié de l'intervalle 〚0, N −1 〛 . En effet:
N −1 2 iπk n N −1 2 iπk n
∀ k ∈ , F N − k = ∑ f n e N
e −2 i π n
= ∑ f n e N
= F k
n =0 n =0
et donc le module est le même, la phase étant simplement de signe opposé. Si l'on veut analyser le
signal sur une plage de 10 kHz, il faut donc prendre une fréquence d'échantillonnage de 20 kHz.
Dans la pratique, on implémente la transformée de Fourier rapide (FFT, pour Fast Fourier
Transform) qui a une complexité en O(Nlog2(N)) au lieu de O(N2) par calcul direct et qui tire parti
de cette redondance pour optimiser le calcul.
∀ x ∈ , f ∗ g x = ∫ f t g x − t dt
−∞
Par changement de variable en u= x − t , l'opérateur de convolution est commutatif. Il est
de plus associatif:
∞
f ∗ g ∗ h x = ∫ f ∗ g x − y h y dy
−∞
∞ ∞
= ∫∫ f x − y − t g t h y dt dy
−∞ −∞
∞ ∞
= ∫ g t ∫ f x − t − y h y dy dt
−∞ −∞
∞
= ∫ g t f ∗ h x − t dt
−∞
= g ∗ f ∗ h x
et donc par commutativité on a f ∗ g ∗ h= f ∗ h∗ g .
f ∗ eω x = ∫ f t e ∫
iω x − t iωx − iωt
=e f te = F ω eω x
−∞ −∞
Finalement, la transformée de Fourier de h= f ∗ g est donc, en utilisant successivement la
première propriété, l'associativité puis la seconde propriété:
H = eω ∗ f ∗ g 0= eω ∗ f ∗ g 0= F ω× eω ∗ g 0= F ω× G ω , soit:
TF f ∗ g = F × G (1)
4. Problème du fenêtrage
En pratique, non seulement le signal s est discret, mais de plus le temps d'observation 2τ est
fini. On observe donc la convolée du signal par la fonction porte:
Π : t 1 si t ∈[− τ , τ ]
0 sinon
D'après (1), la transformée de Fourier de s ∗ Π est le produit des transformées, celle de la
fonction porte étant:
∞ τ
III.Analyse formantique
Les algorithmes proposés, dont le code source figure en annexe, ont été implémentés en
MATLAB, un logiciel de calcul numérique, sur un ordinateur personnel cadencé à 2,4 GHz sous
Microsoft Windows. La fréquence d'échantillonnage est de 22050 Hz, ce qui permet d'observer le
signal sur une plage de plus de 10 kHz (nécessaire pour reconnaître le phonème [s], dont l'énergie
est concentrée entre 6 et 8 kHz, mais finalement sa reconnaissance n'a pas été implémentée).
Le signal de voix étant continu, il n'est pas évident de reconnaître dans le signal enregistré les
différents éléments linguistiques que sont les mots, les syllabes et les phonèmes. C'est ce problème
que l'on appelle le décodage acoustico-phonétique. Nous avons ici mis en oeuvre un procédé
permettant de localiser les transitions entre voyelles et consonnes. Les syllabes correspondant à ce
cas sont qualifiés d'ouvertes. Elles sont très majoritaires dans certaines langues, telles les langues
polynésiennes ou le japonais dans une moindre mesure, mais ce n'est pas le cas dans les langues
latines où deux consonnes peuvent souvent se suivre, ou pire, dans les langues slaves, tel le
tchèque. Ce n'est donc qu'une solution partielle au problème, d'autant plus que les mots à analyser
doivent avoir été au préalable débarrassés des silences initial et final et que le nombre φ de
phonèmes à détecter doit être fourni au programme de reconnaissance.
3. Analyse formantique
Nous avons choisi de reconnaître par analyse formantique les voyelles non nasalisées [i], [e],
[7], [a], [u], [o], [O], [A], [y], [0], [@] et [E] ainsi que les sonantes impulsionnelles [m], [n], [&], et
continues [l] et [r], laissant de côté les semi-consonnes [w] et [j], qui sont également des sonantes
continues, mais qui prêtent trop à confusion pour le type de reconnaissance effectué.
Avant de reconnaître les formants, il faut d'abord effectuer un traitement visant à les révéler
de manière plus marquée.
En effet, on constate que la magnitude décroît dans le spectrogramme à raison de 6 dB par
octave. Pour pallier à cette atténuation, qui rend difficile la détection des derniers formants, on
accentue le signal de voix v(n) en calculant la grandeur v ' n= v n− α v n− 1 avec
v ' 0= v 0 . Plus α est grand, plus la magnitude est réhaussée en haute fréquence. Dans notre
expérience, nous avons choisi α =2 .
En outre, les formants sont masqués par d'autres effets. Le plus souvent, le signal de voix v(t)
est modélisé par le produit de convolution entre le signal de source e(t) dû à la vibration des cordes
vocales, et le signal h(t) dû aux différents résonateurs. Le traitement homomorphique permet, à
l'issue du calcul d'une grandeur appelée « cepstre », d'éliminer l'influence de la source. Pour
effectuer la déconvolution, on découpe le signal en morceaux sur lesquels on applique la
transformée de Fourier fenêtrée. On a alors V ω= E ω H ω , et on prend le logarithme du
module (la phase n'a aucune importance) pour passer à une représentation additive:
ln ∣V ω∣= ln ∣E ω∣ ln ∣H ω∣ . On effectue alors une transormée inverse, ce qui donne le
cepstre: c t ' = FT −1 ln ∣V ω∣= FT −1 ln ∣E ω∣ FT −1 ln ∣H ω∣ . Le cepstre s'exprime
dans une grandeur appartenant à une sorte d'échelle temporelle déformée par le logarithme que l'on
appelle « quéfrence ». La contribution de la source correspond aux hautes quéfrences, et celle du
conduit aux basses quéfrences. Il faut donc déterminer la quéfrence de coupure à partir de laquelle
on n'a plus que la contribution de la source. En pratique, il suffit de trouver la quéfrence à partir de
laquelle le cepstre ne comprend plus de pics et reste relativement bas. Cette opération s'appelle le
liftrage. Par la suite, on peut éventuellement recalculer h(t): h t≈ FT −1 exp C ω' , mais
pour obtenir le spectrogramme « corrigé », on se contente de H ω≈ exp C ω' .
Ce traitement est mis en oeuvre par les modules accentue et deconvol.
Une fois le spectre corrigé obtenu, on cherche alors chaque formant dans une bande de
fréquence précisée le plus finement possible afin d'avoir suffisamment de chances de trouver le
formant, qui correspond à la magnitude moyenne la plus élevée. Cette opération est réalisée par le
module formants. Des estimations de valeurs formantiques (en Hertz) pour une voix d'homme sont
données ci-dessous. Pour chaque formant on a indiqué les valeurs extrémales. Il convient de se
rappeler que ces valeurs peuvent varier grandement en fonction de l'individu et au sein même du
discours.
voyelle F1 F2 F3 F4
[i] 250 2250 2980 3280
[e] 420 2050 2630 3340
[7] 590 1770 2580 3480
[a] 760 1450 2590 3280
[u] 290 750 2300 3080
[o] 360 770 2530 3200
[O] 520 1070 2510 3310
[A] 710 1230 2700 3700
[y] 250 1750 2160 3060
[0] 350 1350 2250 3170
[@] 500 1330 2370 3310
[E] 570 1560 2560 3450
consonne F1 F2 F3 F4
[m] 300 1300 2300 2770
[n] 350 1050 2300 3470
[&] 360 1000 2400 3300
[l] 360 1700 2500 3300
[r] 550 1300 2300 2700
1. Séparation
L'algorithme de séparation des phonèmes fonctionne de manière très satisfaisante du moment
que:
Conclusion
Cette approche de la reconnaissance vocale nous a permis de cerner certaines caractéristiques
phonétiques et de mettre en oeuvre des solutions pour les exploiter. Si le logiciel, à l'arrivée, ne
permet pas d'identifier avec précision chaque phonème, il met en évidence la proximité d'un bon
nombre d'entre eux. Pour obtenir de meilleurs résultats, plusieurs voies sont envisageables: une
meilleure détermination des paramètres du problème (coefficient d'accentuation, quéfrence de
coupure du cepstre...) ainsi qu'une analyse plus précise des trajectoires et des transitions
formantiques et une meilleure prise en compte de la prosodie dans le discours.
Annexe 1: Alphabet Phonétique International (API).
Pour chacun des phonèmes utilisés, nous donnons un exemple afin d'aider à la prononciation:
microphone:
AI = analoginput('winsound');
chan = addchannel (AI,1);
duree = t;
set(AI,'SampleRate',fs)
vraiefs = get(AI,'SampleRate'); % vraie fréquence d'échantillonnage
set(AI,'SamplesPerTrigger',duree*vraiefs)
set(AI,'TriggerType','Manual')
blocksize = get(AI,'SamplesPerTrigger');
Fs = vraiefs;
% Réaliser l'acquisition
start(AI)
Trigger(AI)
data = getdata(AI);
apprentissage_consonnes:
clc;
fs=22050;
load bandes_sonantes;
bandes = bandes_sonantes;
load ConsApp;
[n,k]=size(ConsApp);
n=floor(n/3);
formants_sonantes=zeros(n,4,3);
for i=1:n
for c=1:3
en_cours=1;
while en_cours
input(['Prononcez la syllabe ' ConsApp(3*(i-1)+c,:)]);
disp('enregistrement...');
syl=microphone(1,fs);
disp('OK');
fprintf('\n');
% Extraction de la consonne sonante
S=separe(syl,3);
if (S(2)-S(1))*1000/fs >= 34 % La sonante doit au moins durer 33 ms
en_cours=0;
else
disp('cet enregistrement s"est mal effectué');
end;
end;
consonne=syl(S(1):S(2));
%Analyse formantique de la consonne sonante
formants_sonantes(i,:,c)=formants(coupe100(consonne),bandes);
end;
end;
apprentissage_voyelles:
clc;
fs=22050;
n_essai=3;
load bandes_voyelles;
bandes=bandes_voyelles;
load voyelles;
[n,k]=size(voyelles);
formants_voyelles=zeros(n,4,n_essai);
for i=1:n_essai
for v=1:n
input(['Prononcez la voyelle ' voyelles(v,:)]);
disp('enregistrement...');
voy=coupe100(microphone(1,fs));
disp('OK');
fprintf('\n');
formants_voyelles(v,:,i)=formants(voy,bandes);
end;
end;
coupe100
function pur=coupe100(X);
fs=22050;
N=length(X);
Y=fft(X);
Y(round(101*N/fs):round(N-101*N/fs))=0;
pur=X-real(ifft(Y)); %ifft renvoie des nombres au format « complexe »
reconnaissance
function suite_phonemes=reconnaissance(X,fi);
suite_phonemes=zeros(1,fi);
enregistrement=coupe100(X); %suppression du bruit
n=length(enregistrement);
separe
function [positions,mode]=separe(X,fi);
%separe(X,fi):
%arguments:
%-X: séquence à analyser (les silences de début et de fin doivent
%avoir été enlevés)
%-fi: nombre de phonèmes que contient la séquence
%renvoie un vecteur contenant les positions des transitions entre phonèmes
%ainsi que la variable mode, qui vaut 'c' si la séquence commence par une
%consonne, 'v' sinon
positions=zeros((fi-1),3);
N=length(X);
fs=22050; % fréquence d'échantillonnage
if D(positions(1,2)) < 0
mode='v';
else
mode='c';
end;
positions_exactes=[];
for i=1:(fi-1)
gauche=positions(i,1);
milieu=positions(i,2);
droite=positions(i,3);
hauteur=abs(P(droite)-P(gauche));
if D(milieu) < 0
P_tiers=P(droite)+hauteur/3;
else
P_tiers=P(droite)-hauteur/3;
end;
[val,pos]=min(abs(P(gauche:droite)-P_tiers));
positions_exactes(i)=pos+gauche-1;
end;
positions=positions_exactes;
reconnaissance_voyelles
function RangVoyelle=reconnaissance_voyelles(voyelle);
load formants_voyelles;
Nvoy=length(formants_voyelles); % Nombre de voyelles à considérer (plus grande dimension
de formants_voyelles)
load bandes_voyelles;
bandes=bandes_voyelles;
Candidats=zeros(3,2);
for i=1:3
[dmin,RangVoyelle]=min(D(i,:));
Candidats(i,1)=dmin;
Candidats(i,2)=RangVoyelle;
end;
[dminimini,posultime]=min(Candidats(:,1));
Candidats
RangVoyelle=Candidats(posultime,2);
reconnaissance_consonnes
function RangConsonne=reconnaissance_consonnes(consonne);
fs=22050;
fmax=fs/2;
load formants_sonantes;
load bandes_sonantes;
bandes=bandes_sonantes;
Nson=length(formants_sonantes);
F=formants(consonne,bandes);
Candidats+12
RangConsonne=RangConsonne+12; %décalage par rapport aux voyelles
accentue
function X=accentue(x);
alpha=2;
n=length(x);
X(1)=x(1);
X(2:n)=x(2:n)-alpha*x(1:n-1);
deconvol
function [Y,taillefft]=deconvol(signal,fs,fenetre,n0)
%SPECT(signal,fs,fenetre)
% Calcule le spectrogramme en utilisant une fenêtre de Hamming.
% -signal: signal d'entrée (vecteur colonne)
% -fs: fréquence d'échantillonnage du signal
% -fenetre: taille de la fenêtre en ms
nbfram=size(signal);
nbfram=nbfram(1);
sgrang=2:round(fftsize/2)-1;
Y=zeros(round(fftsize/2)-2,1);
for i=1:(frameparfenetre-recoupframe):(nbfram-frameparfenetre);
sfen=signal(i:min(i+frameparfenetre-1,end)); % partie du signal dans la fenêtre
sfen=(accentue(sfen'))';
sfen=sfen.*hamming; % on applique une fenêtre de Hamming
sfen=ifft(log(abs(fft(sfen,fftsize))),fftsize);
sfen(1)=[];
sfen(n0+1:end-n0)=0;
xf=abs(exp(fft(sfen,fftsize)));
Y=[Y xf(sgrang)]; % On ajoute la fft court terme au spectrogramme
end
Formants
function F=formants(phoneme,bandes);
i=1;
while i <= 4
b1=B(i,1);
b2=B(i,2);
[val,numpos]=max(magnitude(b1:b2));
numpos=numpos+b1-1;
F(i)=round(numpos*fmax/Nf);
if (i==2) && ((F(2)-F(1)) <= 410) %distance minimale entre F1 et F2
if F(2) <= 763 %ce sont ceux qui posent le plus problème
F(1)=F(2);
end;
B(2,1)=b1+1;
i=1;
end;
i=i+1;
end;
Voyelles et ConsApp: vecteurs colonnes contenant les chaînes de caractères à afficher lors
des procédures d'apprentissage.