Sunteți pe pagina 1din 35

Parametrizări ale

semnalului vocal, pentru


recunoaşterea vorbirii
continue

   
Introducere
- > Recunoaşterea vorbirii: la intersecţia tehnic – uman
- > Demers necesar: analiza acustică a semnalului vocal
- > Etapele analizei acustice:
- achiziţia şi eşantionarea semnalului vocal
- preaccentuarea
- separarea în cadre
- ferestruirea
- parametrizarea
- > Parametri utili:
- energia şi pseudoenergia semnalului vocal
- numărul trecerilor prin zero
- coeficienţii de predicţie liniară (LPC)
- coeficienţii cepstrali
- coeficienţii cepstrali filtraţi mel (MFCC)
- > Implementare:
- simularea în mediul Matlab
- programarea procesorului Motorola Star Core 140 DSP
   
Recunoaşterea vorbirii: la
intersecţia tehnic - uman
- > Domeniu interdisciplinar:
- Tehnici de programare
- Arhitecturi de microprocesoare
- Prelucrare numerică a semnalelor
- Modelare statistică
- Fonetică
- Limbaje formale şi automate
- Inteligenţa artificială – reţele neurale

- > Deziderate:
- comanda vocală a automatelor
- dialogul om – calculator
 
- implementarea sistemelor  de comandă în timp real
Demers necesar: analiza
acustică a semnalului vocal
- > Primul nivel funcţional în structura sistemelor de
recunoaştere a vorbirii

- > Pregătirea semnalului vocal în vederea prelucrărilor


aferente recunoaşterii propriu-zise

- > Abordări posibile:


- modelare articulatorie a vorbirii
- modelare “ genetică” : analiza prin predicţie liniară
- modelare perceptuală: analiza pe scări neliniare
de frecvenţă: Bark, Mel
- modelări combinate: predicţia liniară perceptuală
   
Etapele analizei acustice
- > Achiziţia şi eşantionarea semnalului vocal:
- frecvenţe de eşantionare: 8 kHz şi 11 kHz
- număr de biţi pentru cuantizarea eşantioanelor: 16
- > Preaccentuarea:
- filtrarea printr-un filtru FIR de ordinul întîi
- multiplicarea în frecvenţă cu funcţia de transfer:
H ( z ) = 1 − α ⋅ z −1
- scop: aplatizarea spectrală a semnalului
- > Separarea în cadre:
- N eşantioane consecutive ca un singur cadru
- cadre consecutive spaţiate la M eşantioane
- > Ferestruirea
2πm
- fereastra Hamming: w(m) = 0.54 − 0.46 ⋅ cos
- fereastra aplicată fiecărui cadru N −1
- > Parametrizarea
   
Achiziţia şi eşantionarea
semnalului vocal
- > variaţie lentă în timp a semnalului vocal

- > analiză “ pe termen scurt” : 5 – 40 ms

- > caracteristici staţionare

- > eşantionare cu frecvenţe de 8 şi 11 kHz

- > cuantizare cu 16 biţi cu semn per eşantion

- >   memorie ocupată în contextul


 
de mai sus: 22kB/s
Separarea în cadre a
semnalului vocal
- > formare cadre din cîte N eşantioane: N = 300

- > cadre spaţiate la M eşantioane: M = 100

= > estimate spectrale mai corelate ale cadrelor adiacente

   
Ferestruirea semnalului vocal
- > semnalul vocal preaccentuat şi divizat în cadre

- > multiplicarea cu un semnal fereastră, de lungime N

- > scop: minimizarea efectelor negative ale “ smulgerii”


celor N eşantioane de semnal, prin divizare în cadre
2πm
- > alegere fereastră: Hamming: w(m) = 0.54 − 0.46 ⋅ cos
N −1
- > proprietăţi fereastră Hamming:
- minimizare a riplurilor în frecvenţă ale semnalului
format din N eşantioane consecutive

   
Delimitarea segmentelor de
semnal vocal
- > algoritm de decelare pe criterii energetice a limitelor
segmentelor de semnal vocal

- > scop: determinarea perioadelor de “ linişte” din semnal

- > situaţii dificile:


- fricative ‘ s’ , ‘ ş’ , ‘ h’ , ‘ f’ la limitele segmentului
(cuvînt / grup de foneme)
- plozive ‘ p’ , ‘ t’ , ‘ c’ la limitele segmentului
- nazale ‘ n’ finale
- fricative sonore (‘ v’ ) ce devin nesonore la final

- > Parametri folosiţi:


- Energia
- Numărul de treceri prin zero

 
- > Segmente egale ca lungime  
Energia şi pseudoenergia
semnalului vocal
- > x(nsemnal
) vocal eşantionat, separat în cadre şi ferestruit

N −1
- > Energia: E= ∑ [
m =0
w( m ) ⋅ x ( n − m ) ] 2

N −1
- > Pseudoenergia: E= ∑ w(m) ⋅ x(n − m)
m =0

- > Utilizări:
- decizia sonor / nesonor
- determinarea limitelor cuvintelor / grupurilor fonemice
   
Numărul de treceri prin zero
N −1
- > definit prin: NTZ = ∑ [1 − sgn( x(n + 1)) ⋅ sgn( x(n))] / 2
n =0

- > trecere prin zero dacă: sgn( x(n + 1)) ≠ sgn( x(n))

- > Precauţii:
- precizia eşantionarii
- influenţa zgomotolui
- frecvenţa de eşantionare cît mai mare (11 kHz)
- filtrare (trece – sus) adecvată
- > Utilizări:
- decizia sonor / nesonor
- aprecierea proprietăţilor spectrale: domeniul frecvenţei
   
Determinarea vectorilor de
parametri
- > Analiza prin predicţie liniară => coeficienţii LPC

- > Analiza homomorfică => coeficienţii cepstrali (CC)

- > Analiza în frecvenţă => coeficienţii transformatei Fourier rapide

- > Analiza perceptuală => coeficienţii cepstrali filtraţi Mel (MFCC)

- > Metode combinate => coeficienţii perceptuali de predicţie


liniară (PLP)

- > Vectori de parametri:


- P = 12 coeficienţi LPC / CC / MFCC / PLP
- energia semnalului pe segmentul considerat
   
Analiza prin predicţie liniară
- > Premise:
- redundanţa semnalului vocal
- analiza efectuată în timp scurt
- modelarea organului fonator uman
- > Modelarea tractului vocal: filtru latice IIR numai poli:
A
H LPC ( z ) = P
1− ∑
k =1
ak ⋅ z −k

- > Răspunsul la impuls al tractului: combinaţie liniar predictibilă


P

din P eşantioane precedente: v ( n) = A ⋅ δ ( n) + ∑a


k =1
k ⋅ v(n − k )
P
- > Răspunsul estimat cu predictorul liniar: v~ (n) = ∑α k ⋅ v(n − k )
k =1
   
Algoritmul Levinson – Durbin –
coeficienţii LPC
- > aflarea coeficienţilor =>α kmetode:
- metoda covarianţei  descompunerea Cholesky
- metoda autocorelaţiei  algoritmul Levinson – Durbin:
- > interval temporal extins la infinit, prin completare cu zerouri
- > se utilizează coeficienţii de autocorelaţie ai semnalului, R( i − k )
P
- > se ajunge la sistemul de ecuaţii: ∑α
k =1
k ⋅ R( i − k ) = R(i ), i = 1, P

- > soluţie obţinută recursiv: algoritmul Levinson – Durbin []


- > eficienţa metodei autocorelaţiei:
- calcul coeficienţi autocorelaţie: ( P + 1) ⋅ (2 N − p − 2)
- Levinson – Durbin: P 2 + 2P

   
Analiza cepstrală
- > Separarea efectelor excitaţiei tractului vocal şi ale tractului
propriu-zis

- > aplicarea unei transformări homeomorfice semnalului vocal

- > coeficienţii cepstrali: c(n) = IFFT (ln( FFT )) < N >

- > coeficienţii cepstrali din coeficienţii LPC:


c(1) = −α1
 n −1
  i
c(n) = −α n − ∑ 1 −  ⋅ α i ⋅ c(n − i ), i > 0
i =1 
n

- > coeficienţii cepstrali => caracterizarea unităţilor lexicale sau
fonemice, invariant la variabilităţile de pronuntare

   
Cepstrul de frecvenţe mel –
coeficienţii MFCC
- > modelare ce ţine seama de perceperea vorbirii
- > cepstrul de frecvenţe mel = cepstrul (real) al unui semnal
pe termen scurt, ferestruit, derivat din FFT a semnalului vocal
- > diferenţa faţă de cepstrul propriu-zis: neliniaritatea scării de
frecvenţe utilizate
 f  ~
- > Scara (logaritmică) este dată de: Mel ( f ) = 1125 ⋅ ln  1 + = f
 700 
~
f
−1~
- > inversa scării mel: Mel ( f ) = 700 ⋅ (e 1125 − 1)

- > se obţine o reprezentare ne-omeomorfică: coeficienţii MFCC

- > avantaje (comparativ cu LPC): robusteţe la zgomot mai bună

   
Coeficienţii MFCC din
coeficienţii LPC
- > Clasic: există erori de trunchiere la obţinerea MFCC
- > Abordare diferită: calcul recursiv MFCC din LPC:

−1 ~ −1 z −1 − α
- se aplică transformarea: z z = −1
, α = 0.42
1 − αz
- se calculează filtrul LPC transformat:
~
A A
P
= ∞
1− ∑ α (k ) ⋅ z − k 1− ∑ α~ (k ) ⋅ ~z − k
k =1 k =1 ~ ∞
A
- coeficienţii MFCC din: ln ∞
= ∑ c~ (n) ⋅ ~
z −n
1− ∑ α~ (k ) ⋅ ~z − k n =0

k =1

   
Coeficienţii MFCC din
coeficienţii LPC
- > se evită astfel erorile de trunchiere
- > algoritm recursiv:
α (−i ) + α ⋅ α~ (i −1) (0), n = 0

α (n) i = − P ,0 = (1 − α 2 )α~ (i −1) (0) + α ⋅ α~ (i −1) (1), n = 1
~ (i )
n = 2, P
 ~ (i −1)
α ( n − 1) + α ⋅ α( )
~ (i −1) (n) − α~ (i ) (n − 1) ,
~
A = A / α~ (0) (0), α~ (n) = α~ (0) (n) / α~ (0) (0), n = 1, P
ln A~
, n=0
~ 
c ( n) =  ~ n −1
k ~ ~ n = 1, P
− α ( n ) −

∑k =1
n
⋅ c (k ) ⋅ α (n − k ),

   
Coeficienţii MFCC prin
convoluţie cu banc de filtre mel
- > calcul bazat pe transformata Fourier rapidă (FFT)
- > considerăm X (k ) = FFT ( x(n)) < N >

- > definim bancul de P filtre triunghiulare; filtrul p ∈ {1,.., P}


are funcţia de transfer:
 0, k < f [ p − 1]
 2(k − f [ p − 1])
 , f [ p − 1] ≤ k ≤ f [ p ]
 ( f [ p + 1] − f [ p − 1])( f [ p ] − f [ p − 1])
H p (k ) = 
 2( f [ p + 1] − k )
, f [ p ] ≤ k ≤ f [ p + 1]
 ( f [ p + 1] − f [ p − 1])( f [ p + 1] − f [ p ])

 0, k > f [ p + 1]

   
Coeficienţii MFCC prin
convoluţie cu banc de filtre mel
- > calcul al spectrului “ mediu” în jurul frecvenţei centrale
- > ariile de “ sub” funcţiile de transfer sunt egale
- > frecvenţa minimă a bancului de filtre: f l = 133
Hz
- > frecvenţa maximă a bancului de filtre: fHz
h = 6855
=> frecvenţele centrale dispuse uniform în spaţiul mel:
−1  Mel ( f h ) − Mel ( f l ) 
f [ p ] = ( N / f s ) ⋅ Mel  Mel ( f l ) + p 
 P +1 
- > logaritmul energiei “ de” la ieşirea fiecărui filtru:
 N −1 

2
EM [ p ] = ln  X (k ) H p (k )
 k = 0 
- > cepstrul de frecvenţe mel: transformata cosinus discretă:
P −1
~ (n) = DCT ( EN (m)) =   1 
 c ∑
p =0
EN ( p)  ⋅ cos πn p +  / P , n = 0, P − 1
  2 
Implementare
- > Parametrizări perceptuale ale semnalului vocal: MFCC
- > Preaccentuare; s-a ales α = 0.95
- > Separare în cadre; s-a ales N = 300, M = 100
- > Ferestruire: s-a ales fereastra Hamming
- > Calculul coeficienţilor de autocorelaţie
- > Calculul LPC; algoritmul Levinson - Durbin
- > Calculul MFCC din LPC
- > Integrare FFT; bancul de filtre mel, cu P = 12 filtre
- > Calculul MFCC din bancul de filtre mel
- > Citirea fişierelor “ .wav” , convertirea lor la fişiere “ .dat”
- > Scrierea valorilor din vectorii de parametri in fişiere “ .dat”
- > Reprezentare pe acelaşi grafic a coeficienţilor MFCC obţinuţi
- > Testarea comparativă a implementărilor
- > Platforme / medii de programare:
- Matlab™ 6.0
  - Code Warrior™ 2.5.2 for Motorola®
  Star Core™ 140 DSP
Simularea în Matlab™
- > Implementare rutine (fişiere “ .m” ) pentru:
- divizare în cadre
- obţinerea scării de frecvenţe mel
- calculul transformatei cosinus discrete
- construirea bancului de filtre mel
- calculul coeficienţilor MFCC
- citire / scriere fişiere “ .wav”
- citire / scriere fişiere “ .dat”
- script testare fişiere coeficienţi

- reprezentări grafice ale coeficienţilor

- > Fişiere de intrare utilizate:


- fişier “ .wav” digitizat cu 11kHz/16 biţi, înregistrat fără
zgomot, de durată 4 secunde
- fişier “ .wav” digitizat cu 11kHz/16 biţi, înregistrat în
  condiţii de zgomot, de durată   6 secunde
Utilizarea Star Core™ 140 DSP
- > programare în limbajul C şi
în limbajul de asamblare

- > dezvoltarea unui proiect în


C, cu utilizarea unor funcţii
scrise în assembler

- > testarea codului, pe


simulatorul sc100sim

- > fluxul informaţiei pe


platforma Star Core 140, de
la cod sursă la fişier
executabil:
   
Utilizarea Star Core™ 140 DSP
- > Implementare funcţii în C pentru:
- citirea eşantioanelor din fişierele “ .dat”
- preaccentuarea semnalului eşantionat şi cuantizat
- divizarea în cadre a semnalului preaccentuat
- ferestruirea Hamming a semnalului
- calculul funcţiei de autocorelaţie
- calculul energiei, al numărului de treceri prin zero
- calculul pseudoenergiei
- implementarea algoritmului Levinson – Durbin
- calculul coeficienţilor LPC
- calculul coeficienţilor MFCC din coeficientii LPC
- calculul coeficienţilor MFCC cu FFT şi banc de filtre
- adaptare a rutinei pentru calculul FFT
- scrierea rezultatelor (LPC / MFCC) în fişiere “ .dat”
   
Motivaţii SC 140
- > Alcătuire Star Core™ 140:
- o unitate aritmetico-logică de date (DALU), cu patru ALU
şi un set de 16 registre de date, pe 40 de biţi
- o unitate de generare a adreselor (AGU), cu două AAU şi
un set de 16 registre de adrese , pe 32 de biţi
- o unitate de control al programului (PSEQ), alcatuită din
registrele SR, EMR şi PC, toate pe 32 de biti
- generator de tact cu PLL; conţine două registre pe 32 bit
- > Atu-uri Star Core™ 140:
- Arhitectura cu set variabil de execuţie (VLES), cu până la
- 4 x instrucţiuni DALU şi
- 2 x instrucţiuni AGU
- Set de registre extins, ortogonal:
- 16 x DALU / 40 de biţi
- (16 + 4 + 4) x AGU / 32 de biţi
- Pipeline scurt: 5 stagii
   
- Suport pentru date intregi şi fracţionare
Realizarea codului în C
- > Standard de C utilizat: ANSI C – mai restrictiv decât C K&R
- > Biblioteca specifică: “ prototype.h”  conţine funcţii intrinseci
- > Funcţii intrinseci => implementarea operaţiilor fracţionare cu
tipuri de date întregi (“ short” , “ long” )  asociere directă cu
instrucţiuni în assembler pentru SC 140
- > Alte extensii ale compilatorului:
- noi tipuri de date: “ Word16” , “ Word32” , “ Word64”
- pragma: “ #pragma external” , “ #pragma align <>{4/8}”
- > formă realizare: proiect în C: “ CSR” , ce cuprinde:
- headere: “ constants.h”  definirea constantelor
- fişiere “ nume_functie.c” , ce implementează functiile
“ nume_functie” , amintite anterior
- fişiere in assembler: “ fft.asm”
- fisierul “ CSR_main.c” ce contine funcţia “ void main()”
   
Interfaţarea C – limbaj de
asamblare
- > posibilă, în trei moduri (astfel ca instrucţiunile să nu afecteze
contextul C:
- asamblare inline:
“ asm(<instructiune>)”

- asamblare inline mai multe instrucţiuni:


“ asm <prototip_functie>
{asm_header
asm_body
<cod assembler>
asm_end
}”

- apelare în C a unei funcţii scrise în assembler în alt fişier:


“ extern <prototip_functie_assembler>;
   
#pragma external <nume_functie_assembler>”
Studiu de caz: transformata
Fourier rapidă
- > funcţia “ fft.asm”  calcul FFT în baza 4 cu decimare în timp
- > necesară la calculul MFCC cu bancul de filtre mel

- > codul funcţiei “ fft.asm” se completează:


“ _fft TYPE FUNC
<cod assembler>
global F_fft_end
rts ; sau endsec
F_fft_end”

- > codul funcţiei “ c_mfcc_fft.c” se completează:


“ extern void fft(short *, short*);
#pragma external fft
<… >
   
fft(inputSignal, outputSignal1);”
Alocarea memoriei
- > configurarea particularizată
a alocării memoriei
procesorului
- > pentru simulator  fişierul
“ crtscbmm.cmd”  model de
memorie mare: spaţiu al
adreselor nerestricţionat =>
adrese pe 32 de biţi
- > alocarea memoriei se face
implicit la SC 140, după un
model memorie mică 
adresare imediată, pe 16 bit:
- > includerea “ fft.asm” =>
segmentul “ .data” trebuie
mărit => modificarea alocării
   
memoriei
Optimizări la nivelul limbajului C

- > Tehnici general aplicabile procesoarelor de semnal:

- “ loop merging”  “ unirea” mai multor cicluri “ for”


- “ loop unrolling”  mărirea pasului contorului “ for” -ului la
o valoare legată de gradul maxim de paralelism al DSP (4)

- > Tehnici specifice Star Core 1xx:

- “ split comutation”  “ loop merging” + variabile temporare


- “ multisample”  la 2x” for” ” loop merging” pentru buclele
interioare + “ loop unrolling” pentru bucla exterioară +
“ loop unrolling” pentru bucla interioară rezultată

   
Criterii de optimizare -
deziderate
- > Mărirea gradului de paralelism: (4xDALU + 2xAGU)/VLES

- > Compromisul viteză maximă – memorie ocupată minimă:


- regulă: 20%x(viteză) + 80%x(mărime)
- “ loop merging” => optimizarea ambelor
- “ multisample” => creştere a vitezei dar şi a mărimii

- > Creşterea vitezei unde există bucle imbricate, după contoare


“ mari” : “ c_mfcc_fft” , “ c_mfcc_lpc”

- > Limitele optimizării în C: se optimizează doar buclele


=> Nu se optimizează alocarea memoriei / definirea datelor în C

- > în aceste situaţii se foloseşte assembler: “ fft.asm”


   
Rezultate comparative
- > Matlab:
- 5-6 secunde semnal vocal (energie + MFCC)/cadru:
- durata prelucrării: 30 secunde
- consumul de memorie PC: 32 MB RAM

- > SC 140 sc100sim:


- 5-6 secunde semnal vocal (energie + MFCC)/cadru:
- durata prelucrării: aproximativ 60 minute (!!)
- consumul de memorie PC: 6-12 MB RAM

- > Testele realizate pe suport hardware


AMD K7 Athlon XP 1700+, de frecvenţă 1.47 GHz

- > Diferenţe fişiere “ .dat” rezultate: Matlab vs. SC 140:


- 5-20 % aproximativ (test: ExamDiff)
   
Concluzii
- > Simulatorul “ sc100sim” este relativ lent (în raport cu Matlab)

- > implementările alese, având multe cicluri “ for” , pot fi optimi-


-zate considerabil:
exemplu: “ c_autocorr.c” , optimizată, reduce timpul de
returnare a coeficienţilor de autocorelaţie de 8-10 ori !!

- > Precauţii: citirea din şi scrierea în fişierele “ .dat”


atenţie la tipul datelor vehiculate!!

- > Pentru fişierele ce conţin semnal vocal afectat de zgomot,


diferenţele dintre vectorii generaţi via Matlab şi cei generaţi
cu SC 140 sunt aproximativ aceleaşi ca în cazul fişierelor ce
contin semnal vocal prelevat în condiţii de protecţie faţă de
 
zgomot  
Dezvoltări ulterioare
- > Implementare algoritmi pentru detecţia limitelor unităţilor de
semnal vocal considerate în recunoaştere

- > Implementarea algoritmilor de recunoaştere a vorbirii, bazaţi


pe modele Markov ascunse (HMM)

- > Implementarea unui vocabular, embedded într-un sistem


construit în jurul Star Core 140 DSP

- > Optimizări, la nivel de assembler, ale codului scris iniţial în C

   
Bibliografie
[1] M. Drăgănescu, G. Stefan, c. Burileanu – Electronica Funcţională,
Editura Academiei Române, Bucureşti, 1991

[2] C. Burileanu – Tehnologia Vorbirii, note de curs, 2003

[3] M. Ionita – Strategii de Recunoaştere a Semnalului Vocal, Teza de


doctorat, U.P.B., 2003

[4] V. Popescu, C. Burileanu et al. – Matlab Integrated Speech


Recognition Software, Proceedings of the 30th International Scientific
Conference “ Modern Technologies in the 21st Century” , M.T.A.,
Bucharest, 2003

[5] C. Burileanu, V. Popescu – Isolated Word Recognition Engine


implemented on Java Platform, 3rd European Intelligent Systems and
Technologies, ECIT2004, due to be held on July 2004

[6] Motorola, Inc. – SC140 DSP Core Reference Manual, Rev.3, 2001
   
[7] Motorola, Inc. – SC100 C Compiler User’ s Manual, Rev.2.0, 2001

S-ar putea să vă placă și