Cieľom cvičenia je príprava dát a natrénovanie základných akustických modelov na rozpoznávanie slov "áno" a "nie". Na tento účel použijeme nástroj HTK (Hidden Markov Model Toolkit). Každé slovo budeme reprezentovať základnými akustickými jednotkami - fonémami. Slovo "áno" postupnosťou foném a, n, o
a slovo "nie" postupnosťou n, i_^e
, teda dvojhlásku ie
budeme reprezentovať jednou fonémou. Na modelovanie každej fonémy použijeme 5-stavový akustický model s jednou funkciou normálneho (Gaussového) rozloženia pravdepodobnosti. Tieto funkcie použijeme iba na tri prostredné stavy a budeme ich nazývať emitujúcimi. Prvý a posledný stav bude prázdny a budeme ich nazývať neemitujúcimi. Tieto stavy nám umožňuje spájanie viacerých modelov foném za sebou a vytvárať tak zložitejšie modely, v našom prípade modely celých slov "áno" a "nie".
Na trénovanie akustického modelu je nutné pripraviť nahrávky v správnom formáte. Trénovacie nahrávky slov "áno" a "nie" sú dostupné na stiahnutie. Pomocou programu soxi
alebo audacity
skontrolujeme ich formát. Na trénovanie modelov použijeme nekomprimované wav súbory s 8-bitmi na vzorku, s jedným kanálom a so vzorkovacou frekvenciou 8kHz.
soxi ano01.wav
Input File : 'ano01.wav'
Channels : 1
Sample Rate : 8000
Precision : 13-bit
Duration : 00:00:02.74 = 21928 samples ~ 205.575 CDDA sectors
File Size : 22.0k
Bit Rate : 64.2k
Sample Encoding: 8-bit A-law
Vytvoríme prepis nahrávok v podobe postupnosti foném a uložíme do súboru phones0.mlf
. MLF (Master Label Format) je formát súboru používaného nástrojom HTK a má nasledovnú štruktúru:
#!MLF!#
"*/ano01.lab"
sil
a
n
o
sil
.
"*/nie01.lab"
sil
n
i_^e
sil
.
Prvý riadok označuje hlavičku, tá sa nemení. V úvodzovkách je názov nahrávky, pre ktorú je prepis vytvorený. Prípona je štandardne .lab
. Nasleduje fonetický prepis zakončený samostatnou bodkou na konci. Každý prepis začneme označením sil
(zo slova silence) na zahrnutie ticha na začiatku a na konci nahrávky. Keďže máme desať nahrávok z každého slova, ich prepis je rovnaký.
Vytvoríme si zoznam nahrávok - súbor train.scp
aby trénovací proces bol automatizovaný a aby sme nemuseli vkladať jednotlivé nahrávky ručne. Nástroj potom použije postupne jednotlivé nahrávky na trénovanie v poradí, v akom sa vyskytujú v tomto súbore. Formát je následovný:
ano01.wav
ano02.wav
ano03.wav
nie01.wav
nie02.wav
Na trénovanie akustického modelu je nutné transformovať akustický signál na akustické príznaky, ktoré ho reprezentujú a zachytávajú jeho potrebné charakteristiky na realizáciu rozpoznávania. Vytvoríme si teda nový súbor train.cfg
s nasledujúcimi nastaveniami:
SOURCEFORMAT = WAV #zdrojový súbor je wav
TARGETKIND = MFCC_0_D_A_Z #vytvárame MFCC koeficienty s delta a delta-delta
TARGETRATE = 100000.0 #každých 10ms
WINDOWSIZE = 250000.0 #z okien dlhých 25ms,
USEHAMMING = T #ktoré sú hamingové
PREEMCOEF = 0.97 #a použijeme preemfázu na zvýraznenie vysokých frekvencií
NUMCHANS = 26 #počet kanálov melovského filtra zvolíme 26
CEPLIFTER = 22 #koeficient liftra nastavíme na 22
NUMCEPS = 12 #počet výsledných základných koeficientov je 12
Týmto si vytvoríme akustické príznaky pozostávajúcich z 12-tich základných koeficientov, 0-tého koeficientu s rovnakým počtom delta a delta-delta koeficientov (Spolu teda máme v každom vektore 39 čísiel - koeficientov.) v nasledujúcom zoskupení:
Ďalším súborom, ktorý je nutné vytvoriť je zoznam všetkých foném, ktorý sme použili a ktoré bude výsledný akustický model obsahovať. Použijeme aj špeciálnu fonému sil
aby sme zahrnuli ticho v nahrávkach nielen pri trénovaní ale aj pri procese rozpoznávania. Vytvoríme nový súbor monophones0
s následujúcim obsahom:
a
n
o
i_^e
sil
Dôležitým krokom pri trénovaní akustického modelu je vytvorenie prototypu. Túto štruktúru bude mať v konečnom výsledku každá fonéma. Na začiatku sme spomínali, že každú fonému budeme modelovať 5-stavovým HMM a že použijeme pravdepodobnostné funkcie iba v prostredných troch stavoch. Vytvoríme si nový súbor s názvom proto
.Makro ~o
hovorí ho zložení vstupného akustického vektora, ktorý sme nastavili v konfiguračnom súbore. Definíciu modelu vpíšeme medzi označenia <BeginHMM>
a <EndHMM>
. Doplníme počet všetkých stavov pomocou označenia <NumStates>
. Následne definujeme jednotlivé stavy pomocou označenia <State>
. Vpíšeme iba emitujúce stavy (teda číslo 2,3 a 4). Každá funkcia rozdelenia pravdepodobnosti je daná strednou hodnotou (<Mean>
) a rozptylom (<Variance>
). Každý parameter nastavíme na predvolené hodnoty s rovnakou dĺžkou ako je vstupný akustický príznak (teda 39). Posledným údajom sú pravdepodobnosti prechodu medzi jednotlivými stavmi reprezentovanej pomocou matice za označením <TrasP>
. Výsledný súbor bude mať teda následovný tvar:
~o <VecSize> 39 <MFCC_0_D_A_Z>
~h "proto"
<BeginHMM>
<NumStates> 5
<State> 2
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 3
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 4
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<TransP> 5
0.0 1.0 0.0 0.0 0.0
0.0 0.6 0.4 0.0 0.0
0.0 0.0 0.6 0.4 0.0
0.0 0.0 0.0 0.7 0.3
0.0 0.0 0.0 0.0 0.0
<EndHMM>
Cieľom je vytvorenie osobitného modelu pre každú fonému z prototypu tak aby každá z nich bola nastavená na globálny rozptyl a strednú hodnotu trénovacích nahrávok. Tomuto postupu nastavenia sa hovorí Flat Start, keďže začíname s rovnakými modelmi pre každú fonému. Prvým krokom je vytvorenie adresára hmm0
a výpočet danej strednej hodnoty a rozptylu pomocou príkazu a nástroja HCompV
:
HCompV -m -C train.cfg -S train.scp -M hmm0 proto
Tento príkaz vytvorí v adresári hmm0
súbor proto
s nastavenými strednými hodnotami a rozptylmi. premenujeme súbor proto
na súbor hmmdefs
. Skopírujeme model s označením ~proto
toľkokrát, koľko foném sa chystáme vytvoriť (v našom prípade 5). Premenujeme každú kópiu (za označením ~h
) na názov fonémy podľa vytvoreného monophones0
. Týmto sme získali modely foném nastavené na základné hodnoty.
Následným krokom vykonáme estimáciu parametrov jednotlivých foném použitím nahrávok a ich prepisov v súbore phones0.mlf
. Vytvoríme si ďalšiu zložku s názvom hmm1
a vykonáme príkaz:
HERest -C train.cfg -I phones0.mlf -S train.scp -H hmm0/hmmdefs -M hmm1 monophones0
Na dosiahnutie výkonnejšieho akustického modelu budeme opakovať posledný príkaz ešte dvakrát pričom si vytvoríme ďalšie dve zložky hmm2
a hmm3
, do ktorých uložíme výsledne súbory. Spustíme nasledovné dva príkazy:
HERest -C train.cfg -I phones0.mlf -S train.scp -H hmm1/hmmdefs -M hmm2 monophones0
HERest -C train.cfg -I phones0.mlf -S train.scp -H hmm2/hmmdefs -M hmm3 monophones0
Ďalšími možnými vylepšeniami akustického modelu, ktorými sa ale v rámci týchto cvičení nebudeme zaoberať je postupné pridávanie viacerých funkcii rozloženia pravdepodobnosti a vytváranie tak zložitejších funkcii a tým zlepšovať samotné modelovanie. Ďalšou možnosťou je zavedenie väčšieho počtu jednotiek v závislosti na kontexte v ktorom sa daná fonéma vyslovuje. Napríklad v slove "áno" sa fonéma n
vyslovila v kontexte fonémy a
a o
, pričom v slove nie
v pravom kontexte s fonémou i_^e
. Teda vytvoríme pre ne osobitnú reprezentáciu - trifónu a-n+o
a difónu n+i_^e
. Teda okrem známych fonémových modelov sa vo výslednom súbore hmmdefs
budú nachádzať aj tieto nové trifóny a difóny.