Akustické modelovanie izolovaných slov

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".

Skrytý Markovov model fonémy
Skrytý Markovov model fonémy

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í:

Vektor akustického príznaku
Vektor akustického príznaku

Ď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.