Rozpoznávanie reči

Použitím natrénovaného fonémového akustického modelu sme schopní zložiť a modelovať slová "áno" a "nie". Našom cieľom je teda vytvoriť rozpoznávač reči, ktorého vstupom sú súbory s nahratými vzorkami slov a správne ich rozpoznať. Na tento účel použijeme nástroj HTK. Prvým krokom je príprava dát potrebných na rozpoznávanie. Ak začneme od začiatku, potrebujeme akustický model s modelmi jednotlivých foném. Tento už máme natrénovaný. Ďalej musíme pridať informáciu ako z týchto foném zložiť slová, ktoré chceme rozpoznávať vo forme slovníka. Nakoniec potrebujeme pravidlá ako jednotlivé slová môžu za sebou nasledovať vo forme slovnej siete (gramatiky).

Testovacie nahrávky sú prístupné na stiahnutie. Pomocou programu soxi alebo audacity skontrolujeme ich formát. Je dôležité aby formát nahrávok bol ten istý ako pri nahrávkach, ktoré boli použité na trénovanie. Na test teda 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

Gramatika slúži na informáciu rozpoznávača reči aké slová môžu za sebou nasledovať, prípadne v každom čase aké slová môžu byť rozpoznané. Na naše účely si vytvoríme jednoduchý graf.

Rozpoznávacia gramatika

Teda vieme rozpoznávať slová "áno" a "nie". Túto gramatiku je možné vyjadriť textovým zápisom. Vytvoríme nový súbor gram, ktorý bude mať obsah:

(áno|nie)

Následne gramatiku pretransformujeme do HTK formátu aby ju bolo možné použiť pri rozpoznávaní reči. Spustíme príkaz:

HParse gram wdnet

Aby sme nemuseli ručne zadávať jednotlivé nahrávku na rozpoznávanie, vytvoríme si ich zoznam. Vytvoríme si súbor test.scp obsahujúci zoznam všetkých nahrávok vo formáte:

test/ano01.wav
test/ano02.wav
...

Slovník obsahuje informácie z akých akustických modelov sa jednotlivé slová skladajú. Vytvoríme si nový súbor dict, do ktorého vložíme nasledujúce údaje:

sil sil
áno a n o
nie n i_^e

Obsahuje slová "áno", "nie" a špeciálne slovo na označenie ticha \emph{sil}. Nezabudnime, že medzi prvým slovom a jeho zoznamom foném (prepisom) musíme vložiť tabulátor.

Tak ako pri trénovacom procese sme potrebovali súbor na nastavenie extrakcie príznakových vektorov zo vstupného signálu, tak aj pri samotnom rozpoznávaní. Nastavenie musí byť totožné a preto skopírujeme súbor train.cfg do test.cfg ale vytvoríme nový s obsahom:

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

Doplníme riadok aby výsledok rozpoznávania bol v čitateľnej forme

NONUMESCAPES = T

Použitím všetkých pripravených súborov spustíme rozpoznávanie príkazom:

HVite -C test.cfg -S test.scp -H hmm3/hmmdefs -w wdnet -i test.mlf dict monophones0

Prepínač -i nám uloží výsledky rozpoznávania do súboru test.mlf. Výsledný súbor je vo fomáte MLF:

#!MLF!#
"test/ano01.rec"
0 68200000 áno -46087.753906
.
"test/ano02.rec"
0 75900000 áno -62137.472656
.
...

Prvé dve hodnoty ukazujú na trvanie slova v stovkách nanosekúnd, za nimi nasleduje rozpoznané slovo a nakoniec logaritmická pravdepodobnosť daného slova. Z výsledkov rozpoznávania vidíme, že niektoré nahrávky boli rozpoznané zle, čo je zapríčinené buď ruchom v pozadí alebo tým, že natrénovaný akustický model neobsahuje dostatočné štatistické údaje na obsiahnutie hlasu hovoriaceho.

Zo súboru test.mlf vidíme, že jednotlivé slová majú trvanie celej nahrávky, akoby začínali na začiatku a končili na jej konci pričom po vypočutí akejkoľvek nahrávky počujeme, že obsahuje veľa ticha. Nesprávne časové hranice slov sú zapríčinené tým, že sme gramatikou povedali, že tam vyskytuje iba práve jedno slovo presne ohraničené. Presnejší čas začiatku a trvania slov môžeme získať zmenou gramatiky zavedením ticha sil pred a po každom slove.

Rozpoznávacia gramatika s pridaným tichom
Rozpoznávacia gramatika s pridaným tichom

Vytvoríme nový súbor gramsil s obsahom:

(sil(ano|nie)sil)

pretransformujeme ho príkazom:

HParse gramsil wdnetsil

a znova spustíme rozpoznávanie s novou gramatikou (slovnou sieťou wdnetsil) príkazom:

HVite -C test.cfg -S test.scp -H hmm3/hmmdefs -w wdnetsil -i testsil.mlf dict monophones0

pričom výsledok si uložíme do súboru testsil.mlf, ktorý bude obsahovať výstup:

#!MLF!#
"test/ano01.rec"
0 8200000 sil -5585.542969
8200000 27100000 áno -12935.525391
27100000 68200000 sil -26604.955078
.
"test/nie04.rec"
0 9300000 sil -6564.920410
9300000 35200000 nie -17510.812500
35200000 40900000 sil -3679.431152
.
"test/nie05.rec"
0 7100000 sil -4546.270996
7100000 26900000 áno -14459.573242
26900000 30700000 sil -2511.566650
.
...

Správnosť časových hraníc si môžeme overiť pomocou programu audacity alebo ľubovoľného prehrávača, pričom časový údaj je v stovkách nanosekúnd, teda údaj v sekundách získame delením číslom 10000000.

Príklad zobrazenia nahrávky ano01.wav so slovom začínajúcim v čase 0.44s
Príklad zobrazenia nahrávky ano01.wav so slovom začínajúcim v čase 0.44s

Videli sme, že dochádza k chybám v samotnom rozpoznávaní. Príčina je v nedostatočnom objeme trénovacích dát a teda štatistická reprezentácia modelu nepokrýva všetky možné variácie rečníkov, ich vyjadrovania alebo šumu v pozadí, ktorý môže nastať. Skopírujme si akustický model dostupný na stiahnutie. Tento model je natrénovaný na 78 hodinách nahrávok a teda lepšie štatisticky modeluje reč. Vyskúšajme rozpoznávanie testovacích nahrávok príkazom:

HVite -C test.cfg -S test.scp -H am/hmmdefs -w wdnetsil -i testsilam.mlf dict monophones0

pričom výsledok si uložíme do súboru testsilam.mlf, ktorý bude teda obsahovať:

#!MLF!#
"test/ano01.rec"
0 8200000 sil -5713.349121
8200000 13000000 áno -4102.238770
13000000 68200000 sil -36761.628906
.
"test/nie04.rec"
0 9400000 sil -6678.280273
9400000 12900000 nie -2612.340332
12900000 40900000 sil -18990.083984
.
"test/nie05.rec"
0 7200000 sil -4744.076660
7200000 12700000 nie -4741.253906
12700000 30700000 sil -12172.366211
.

Vidíme, že rozpoznávanie sa zlepšilo.

Cieľom cvičenia je vytvoriť živé rozpoznávanie reči priamo z mikrofónového vstupu. Na tento účel použijeme rozpoznávací engine Julius. Ako prvý krok si pripravíme všetky potrebné súbory.

Použijeme akustický model, ktorý sme si vytvorili hmm3 (dostupný na stiahnutie). K nemu si vytvoríme súbor, ktorý obsahuje zoznam foném, ktoré sa v tomto modeli nachádzajú. Vytvoríme si súbor monophones0 s obsahom:

a
n
o
i_^e
sil

Slovník nám dáva do súvisu slová s ich fonetickým prepisom, s modelmi, ktoré sa nachádzajú v akustickom modeli. Môžeme použiť slovník z cvičenia rozpoznávania reči, súbor dict s obsahom:

sil sil
áno a n o
nie n i_^e

Všetky informácie o slovách, fonémach a modeloch vložíme do súboru live.cfg. Nastavíme taktiež vstup z mikrofónu a detekciu reči.

-input mic          #nastavenie vstupu z mikrofónu
-h hmm3/hmmdefs #akustický model 
-hlist monophones0  #zoznam fonémových modelov
-w dict         #slovník
-wsil sil sil sil       #definícia ticha na začiatku, konci a po každom slove
-cutsilence         #zapnutie detekcie reči (rozpoznávanie sa vykonáva iba ak je zachytená reč)
-nolog      

Je jasné, že tento súbor neobsahuje nastavenia pre akustické príznaky ako to bolo v predchádzajúcom cvičení. Je to tým, že niektoré z nastavení sa samé odvodia z definícii akustického modelu a ďalšie sú už nastavené na predvolené hodnoty, ktoré sú tie isté, ktoré sme použili pri trénovaní akustického modelu.

Rozpoznávanie spustíme príkazom:

padsp julius -C live.cfg

pričom sa zobrazí hlásenie:

STAT: include config: live.cfg
going for final fusion
all models set, configuring output

------
<<< please speak >>>

a po vyslovení slova "áno" alebo "nie" sa zobrazí výsledok rozpoznávania:

pass1_best: áno     
pass1_best_wordseq: áno
pass1_best_phonemeseq: sil a n o sil
pass1_best_score: -2900.903564
sentence1: áno
wseq1: áno
phseq1: sil a n o sil
cmscore1: 0.966
score1: -2900.903564

Samotný systém Julius sa skladá z dvoch prechodov rozpoznávania a teda sú výsledky prezentované dvakrát aj s fonetickým prepisom, prípadne s priradeným tichom a score reprezentujúcim logaritmickú pravdepodobnosť slova. Navyše sa zobrazuje cmscore, ktoré vyjadruje "istotu" o koľko je dané slovo pravdepodobnejšie ako ostatné možné.