2009/11 – 4. 3. 2009
Soubor programů pro práci se skrytými Markovovými modely (HTK) Zdeněk Smékal, Hicham Atassi, Vojtěch Stejskal, Jiří Mekyska Ústav telekomunikací, FEKT VUT, Purkyňova 118, Brno
[email protected],
[email protected],
[email protected],
[email protected] 5. března 2009
Úvod Modul HMM (the Hidden Markov Models) je soubor programů, které jsou určeny k tvorbě a práci se skrytými Markovovými modely. Tento modul (toolkit), označený jako HTK, byl původně vyvinut v roce 1989 ve Speech Vision and Robotics Group na Cambridgské univerzitě. Během let procházel postupným vývojem a v roce 2006, kdy vyšla zatím poslední stabilní verze 3.4, se jednalo o velmi rozsáhlý a účinný nástroj k rozpoznávání spojité řeči. Modul HTK se pro práci s HMM osvědčil, a tak se dnes využívá i v mnoha jiných oblastech, než je zpracování řeči [1]. V článku je uveden stručný popis struktury modulu a jsou popsány některé aplikace rozpoznávání spojité řeči s omezeným slovníkem. Klíčová slova: Skryté Markovovy modely, rozpoznávání spojité řeči.
1
Skryté Markovovy modely
Skryté Markovovy modely jsou statistickým nástrojem pro modelování náhodných procesů [2]. Jedná se o modely, které jsou založeny na pravděpodobnostním konečném automatu, který v každém časovém okamžiku t změní svůj stav podle daných pravděpodobností přechodu do stavu sj , přičemž při této změně generuje vektor pozorování ot s výstupní pravděpodobností bj (ot ).
11-1
2009/11 – 4. 3. 2009
Obr. 1.1: Markovův model se šesti stavy
1.1
Rozpoznávání izolovaných slov
Uvažujme nyní, že vektory pozorování o1 , o2 , . . . , oT jsou parametrické vektory vypočítané pro každý rámec řečového signálu. Symbol T vyjadřuje počet časových okamžiků, při kterých dochází ke generování vektorů pozorování (celkový počet vektorů pozorování). Tyto vektory obsahují typické parametry, které charakterizují analyzovaný signál. Jeden vektor ot tak může např. obsahovat melovské kepstrální koeficienty (MFCC) nebo percepční lineární predikční koeficienty (PLP) apod. Každé slovo pak bude popsáno posloupností těchto vektorů (parametrickou maticí): O = [o1 , o2 , . . . , oT ].
(1.1)
Dále uvažujme, že disponujeme slovníkem N slov (difonů, trifonů apod.) wi , kde i = 2, . . . , N . Celý problém rozpoznávání izolovaných slov pak můžeme popsat pomocí podmíněné pravděpodobnosti slova wi , známe-li vektor O, takto (algoritmus EM) [3]: arg max {P (wi |O)} . i
(1.2)
Pravděpodobnost P (wi |O) nemůžeme vypočítat přímo, nicméně ji lze vypočítat pomocí Bayesova vztahu [3]: P (wi |O) =
P (O|wi ) P (wi ) , P (O)
(1.3)
kde P (wi ) je apriorní pravděpodobnost výskytu wi , P (O) je pravděpodobnost posloupnosti vektorů pozorování a P (O|wi ) je podmíněná pravděpodobnost posloupnosti O, jestliže známe slovo wi . Apriorní pravděpodobnost P (wi ) iterativně přizpůsobujeme v dalších krocích pomocí učení, nebo se ji snažíme nějak vynechat nebo 11-2
2009/11 – 4. 3. 2009
ji obejít. V případě, že slova budou mít stejnou pravděpodobnost P (wi ) a P (O) bude konstantní, poté bude pravděpodobnost P (wi |O) závislá pouze na P (O|wi ) [4]. V tomto bodě aplikujeme model HMM. Ke každému slovu wi bude přiřazen model M , který bude generovat sekvenci O. Příklad skrytého Markovova modelu je na obr. 1.1. Model se skládá ze 4 emitujících stavů (2, 3, 4 a 5) a prvního a posledního neemitujícího stavu. Neemitující stavy negenerují při přechodu do jiného stavu vektor pozorování, slouží k navazování modelů, což se využívá např. při rozpoznávání spojité řeči. Mezi jednotlivými stavy modelu existují přechodové pravděpodobnosti aij , které určují pravděpodobnost přechodu ze stavu si do stavu sj při posunu z času t do t + 1. Ke každému emitujícímu stavu jsou pak přiřazeny funkce (jedna nebo více) rozdělení výstupní pravděpodobnosti bj (ot ). 1.1.1
Přechodové pravděpodobnosti
Přechodové pravděpodobnosti aij se uvažují v čase konstantní po celou dobu generování. Rovněž platí, že součet těchto pravděpodobností vycházejících z jednoho stavu je roven 1: X (1.4) aij = 1. j
V našem příkladě na obr. 1.1 existují tři druhy přechodových pravděpodobností: • ai,i – přechodová pravděpodobnost setrvání ve stavu si , • ai,i+1 – pravděpodobnost přechodu do následujícího stavu si+1 , • ai,i+2 – přechodová pravděpodobnost přeskočení stavu (používá se zřídka, většinou u modelů krátkého ticha) [4]. Přechodové pravděpodobnosti je vhodné příklad bude následující: 0 a12 0 0 a22 a23 0 0 a33 A= 0 0 0 0 0 0 0 0 0
zapisovat maticově, zápis matice pro náš
0 0 0 a24 0 0 a34 a35 0 a44 a45 0 0 a55 a56 0 0 0
.
(1.5)
Většina modelů, které se používají k rozpoznávání řeči, je levo-pravých, tudíž platí aji = 0 pro i < j [4]. V matici A se to projeví tím, že jsou všechny členy pod hlavní diagonálou nulové. 11-3
2009/11 – 4. 3. 2009
1.1.2
Funkce rozdělení výstupní pravděpodobnosti
Jak jsme již zmínili, funkce rozdělení výstupní pravděpodobnosti bj (ot ) popisuje rozdělení pravděpodobnosti vektoru pozorování ot produkovaného ve stavu sj v čase t. V závislosti na pozorování můžeme tuto funkci popsat dvěma způsoby:
Diskrétní rozdělení výstupní pravděpodobnosti V tomto případě nabývá pozorování konečného počtu diskrétních hodnot. Vektory pozorování jsou tedy konvertovány na diskrétní symboly Sˆi pomocí klasifikátoru založeném na minimální vzdálenosti. Každý stav pak obsahuje tabulku vysílacích pravděpodobností jednotlivých symbolů bj (Sˆi ). Tyto modely se označují jako diskrétní modely HMM.
Spojité rozdělení výstupní pravděpodobnosti V tomto případě je bj (ot ) funkcí hustoty pravděpodobností, která je popsána určitým rozdělením. Toto rozdělení pravděpodobnosti musí být dostatečně specifické, aby od sebe odlišilo různé zvuky, a zároveň dostatečně robustní, aby zahrnulo značnou variabilitu řečového signálu [2]. Při zpracování řečového signálu se nejčastěji používá buď jedno Gaussovo rozdělení pravděpodobnosti nebo směs těchto rozdělení [3]. Uvažujme nyní, že rozdělíme vektor pozorování do několika toků (vláken) S. Jednotlivé proudy mohou být například takové: • 1. tok – melovské kepstrální koeficienty, • 2. tok – 1. diference MFCC (rychlostní koeficienty), • 3. tok – 2. diference MFCC (akcelerační koeficienty), • 4. tok – logaritmus energie. Vztah pro výpočet bj (ot ) bude následující [3]: "M # γs S s Y X bj (ot ) = cjsm N (ost ; µjsm , Σjsm ) , s=1
(1.6)
m=1
kde mezi sebou násobíme směsi Gaussových rozdělení pro jednotlivé toky. Parametr Ms zde udává počet směsí pro tok s, cjsm je váha m-té směsi, γs váha toku a N (o; µ, Σ) je vícerozměrné Gaussovo rozdělení pravděpodobnosti s vektorem středních hodnot µ a kovarianční maticí Σ. Gaussovo rozdělení je definováno takto [3]: 1 1 T −1 N (o; µ, Σ) = p e− 2 (o−µ) Σ (o−µ) , (1.7) (2π)n |Σ| kde n je dimenze vektoru o a |Σ| determinant kovarianční matice. 11-4
2009/11 – 4. 3. 2009
1.1.3
Stavová posloupnost
Obr. 1.2: Stavové posloupnosti definující přiřazení vektorů pozorování jednotlivým stavům. Červeně vyznačená cesta je cesta stavové sekvence X = [1, 2, 2, 3, 4, 4, 5, 6]. Vektory pozorování mohou být rozděleny mezi stavy modelu HMM pomocí stavové posloupnosti. Tato posloupnost udává pořadí stavů, kterými model prochází, jinými slovy se jedná o cestu modelem. Jde o podobnou úlohu, jako je úloha obchodního cestujícího, která se řeší např. metodami dynamického programování. V našem příkladě pro model na obr. 1.1 by stavová posloupnost byla X = [1, 2, 2, 3, 4, 4, 5, 6]. Jestliže tedy bude počet vektorů pozorování K, pak bude délka stavové posloupnosti rovna K + 2, jelikož x(0) a x(K + 1) jsou neemitující stavy. Stavovou posloupnost můžeme vyjádřit i ve formě grafu tak, jak je uvedeno na obr. 1.2. 1.1.4
Určení pravděpodobnosti generování posloupnosti vektorů pozorování modelem M
Pravděpodobnost generování posloupnosti vektorů pozorování O modelem M při průchodu cesty X definujeme následovně [4]: P (O, X|M ) = ax(0)x(1)
T Y
bx(t) (ot )ax(t)x(t+1) .
(1.8)
t=1
Jedná se v podstatě o součin všech pravděpodobností, na které při průchodu cestou X narazíme. Pro náš příklad na obr. 1.2 by měla pravděpodobnost tvar: P (O, X|M ) = a12 b2 (o1 )a22 b2 (o2 )a23 b3 (o3 ) . . . a56 b5 (o6 ) . 11-5
2009/11 – 4. 3. 2009
Nicméně ve většině případů známe pouze posloupnost vektorů pozorování O a stavová posloupnost X je před námi skryta. To je důvod, proč se tyto modely označují jako skryté Markovovy modely. Uvažujme nyní, že máme K vektorů pozorování. Délka stavové posloupnosti tedy bude K + 2. Počet stavů modelu je N , přičemž první a poslední stav je neemitující. Model může setrvat v jednom stavu (K − N )krát. Se znalostí těchto hodnot můžeme sestavit graf tak, jak je tomu např. na obr. 1.2. Hrany grafu zde představují přechodové pravděpodobnosti aij a jednotlivé uzly funkci hustoty výstupní pravděpodobnosti bj (ot ). Existují dva způsoby, jak můžeme nyní pravděpodobnost generování posloupnosti vektorů pozorování O modelem M vypočítat: 1. Vypočítáme sumu pravděpodobností všech cest modelem (grafem) [3]: P (O|M ) =
X
ax(0)x(1)
T Y
bx(t) (ot )ax(t)x(t+1) .
(1.9)
t=1
X
Tento vzorec slouží k výpočtu Baumovy-Welchovy pravděpodobnosti [4]. Symbol X znamená sumu pro celou stavovou posloupnost. 2. Uvažujeme pouze nejvíce pravděpodobnou stavovou posloupnost (na obr. 1.2 vyznačeno červeně) [3]: ( ) T Y (1.10) Pˆ (O|M ) = max ax(0)x(1) bx(t) (ot )ax(t)x(t+1) . X
t=1
Tento vzorec popisuje Viterbiho pravděpodobnost [4]. 1.1.5
Rozpoznání izolovaného slova
Nyní si vše, o čem jsme doposud uvažovali, shrneme. Disponujeme záznamem slova, které chceme rozpoznat. Signál v časové oblasti rozdělíme na rámce, přičemž z každého rámce vypočítáme určité parametry. Každému rámci bude tedy odpovídat jeden vektor pozorování, který bude tyto parametry uchovávat. Posloupnost těchto vektorů pozorování označíme jako O. Uvažujme, že hledané slovo patří do omezené množiny slov. Hledáme tedy v této množině slovo wi , které bude nejvíce odpovídat sekvenci O, jinými slovy hledáme arg maxi {P (wi |O)}. Po jistých úvahách jsme přišli na to, že stačí vypočítat P (O|wi ). Jestliže ke každému slovu z množiny existuje natrénovaný model HMM, můžeme tuto pravděpodobnost definovat takto [3]: P (O|wi ) = P (O|Mi ) .
11-6
(1.11)
2009/11 – 4. 3. 2009
Zjistili jsme tedy, že k tomu, abychom slovo rozpoznali, stačí zjistit, který model generuje toto slovo (jeho posloupnost pozorování O) s největší pravděpodobností. Tuto pravděpodobnost lze vypočítat dvěma způsoby, přičemž při rozpoznávání se nejčastěji používá Viterbiho rozpoznávání [3]. Nicméně k tomu, abychom měli modely natrénované, je potřeba pro každý model určit jeho aij a bj (ot ). Tyto parametry lze získat trénováním pomocí trénovacích množin. 1.1.6
Trénování modelu HMM a odhad jeho parametrů
Princip trénování modelu M pro posloupnost pozorování O, kterou jsme vybrali z množiny trénovacích dat, je založen na nastavení všech parametrů modelu tak, aby tento model generoval sekvenci O s největší pravděpodobností. K tomuto účelu se používají metody maximální věrohodnosti MLE (Maximum Likehood Estimation). Při výpočtu parametrů uvedenou metodou je možné použít rychlé iterativní algoritmy. Při trénování se používá Baumův-Welchův algoritmus [2]. Tento algoritmus ˆ tak, že platí P (O|M ˆ ) ≥ P (O|M ). Algovypočítává z modelu M nový model M ritmus se ukončí, jakmile nastane mezi pravděpodobnostmi rovnost. K tomu dojde v okamžiku, kdy pravděpodobnost dosáhne svého globálního maxima. Bohužel může nastat i případ, kdy toto maximum je pouze lokální. Proto se musí na začátku algoritmu vhodně inicializovat parametry modelu tak, abychom se tomuto nežádoucímu jevu vyhnuli. Před popisem samotného Baumova-Welchova algoritmu si ještě zavedeme pravděpodobnost1 toho, že v čase t generujeme vektor pozorování ot skrytým Markovovým modelem M , který se nachází ve stavu sj [3]: Lj (t) = P (x(t) = sj |O, M ).
(1.12)
K výpočtu Lj (t) se používá tzv. dopředně zpětný (forward-backward) algoritmus, který při výpočtu využívá dvě pravděpodobnosti: • částečná dopředná (forward) pravděpodobnost αj (t), která je definována jako suma pravděpodobností všech částečných posloupností, které začínají na začátku modelu a v čase t se nachází ve stavu sj [4], [2]: αj (t) = P (o1 , o2 , . . . , ot , s(t) = sj |M ). 1
(1.13)
Přesnější výraz než pravděpodobnost by možná byla věrohodnost (anglicky likelihood). Nicméně v textu budeme používat výraz pravděpodobnost.
11-7
2009/11 – 4. 3. 2009
• částečná zpětná (backward) pravděpodobnost βj (t), která je definována jako suma pravděpodobností všech částečných posloupností, které začínají v posledním časovém okamžiku v posledním stavu a v čase t se nacházejí ve stavu sj [4], [2]: βj (t) = P (ot+1 , ot+2 , . . . , oT |s(t) = sj , M ).
(1.14)
Součinem těchto pravděpodobností obdržíme vztah [2]: αj (t)βj (t) = P (O, x(t) = sj |M ).
(1.15)
Normalizací pravděpodobnosti ve vztahu (1.15) Baumovou-Welchovou pravděpodobností P (O|M ) vypočítáme Lj (t) [3]: Lj (t) = P (x(t) = sj |O, M ) =
P (O, x(t) = sj |M ) . P (O|M )
(1.16)
Dosazením rovnice (1.15) do (1.16) získáme tvar pro výpočet Lj (t): Lj (t) =
αj (t)βj (t) . P (O|M )
(1.17)
Pomocí pravděpodobností αj (t) a βj (t) můžeme však spočítat i Baumovu-Welchovu pravděpodobnost, platí totiž [2]: P (O|M ) =
N −1 X
P (O, x(t) = sj |M ),
(1.18)
j=2
kde N je počet stavů modelu HMM. Dosazením vztahu (1.15) získáme: P (O|M ) =
N −1 X
αj (t)βj (t).
(1.19)
j=2
Další vztah pro Lj (t) tedy obdržíme dosazením rovnice (1.19) do (1.17): Lj (t) =
αj (t)βj (t) NP −1
.
(1.20)
αj (t)βj (t)
j=2
Abychom však mohli Lj (t) vypočítat, musíme nejdříve αj (t) a βj (t) určit. Jestliže budeme uvažovat levo-pravý model, jaký je např. na obr. 1.1, můžeme αj (t) vypočítat iterativním algoritmem. Na začátku se provede inicializace [4]: αj (1) = a1j bj (o1 ) pro 2 ≤ j ≤ N − 1. 11-8
(1.21)
2009/11 – 4. 3. 2009
V dalších časových okamžicích bude pro αj (t) platit vztah [4]: "N −1 # X αj (t) = αi (t − 1)aij bj (ot ) pro 2 ≤ t ≤ T.
(1.22)
i=2
Algoritmus se pak uzavírá vztahem: [4]: αN (T + 1) =
N −1 X
αi (T )aiN .
(1.23)
i=2
Jestliže si nyní opět uvědomíme definici Baumovy-Welchovy pravděpodobnosti, popsané vztahem (1.9), dojdeme k závěru, že výpočtem rovnice (1.23) obdržíme rovněž tuto pravděpodobnost. Podobným způsobem vypočítáme i pravděpodobnost βj (t), nicméně v tomto případě budeme procházet modelem odzadu (jedná se o částečnou zpětnou pravděpodobnost). Nejdříve tedy opět provedeme inicializaci (nyní však v posledním časovém okamžiku), poté se dále pohybujeme v čase zpět a nakonec se algoritmus ukončuje v čase t = 0 [3]: βi (T ) = aiN pro 2 ≤ i ≤ N − 1, N −1 X βi (t) = aij bj (ot+1 )βj (t + 1) pro 1 ≤ t ≤ T − 1,
(1.24) (1.25)
j=2
β1 (0) =
N −1 X
a1j bj (o1 )βj (1).
(1.26)
j=2
Poslední rovnice je opět vztahem Baumovy-Welchovy pravděpodobnosti. Tuto pravděpodobnost tedy můžeme získat dvěma způsoby: P (O|M ) = αN (T + 1) = β1 (0).
(1.27)
Toho se může někdy využít při kontrole správnosti výpočtu. Uvažujme nyní, že disponujeme množinou trénovacích dat D, která obsahuje R posloupností pozorování: D = Or , r = 1, 2, . . . , R. Posloupnost pozorování je definována jako Or = ort , kde t = 1, 2, . . . , Tr . Při trénování se snažíme nastavit parametry modelu tak, aby množinu D generoval s největší pravděpodobností. Nyní si již můžeme uvést Baumův-Welchův algoritmus výpočtu parametrů pro levo-pravý model s jednoduchým spojitým Gaussovským rozdělením výstupní pravděpodobnosti [2]: ˆ =a 1. Provedou se odhady počátečních hodnot matice přechodů A ˆij , kde i, j = 1, . . . , N . Zvolí se počáteční odhady hodnot parametrů výstupní pravděpodobˆ j , kde j = 2, . . . , N − 1. ˆ j, Σ nosti µ 2. Provede se přiřazení aij = a ˆij pro všechna i, j = 1, . . . , N . ˆ j pro všechna j = 2, . . . , N − 1. Provede se přiřazení µj = µˆj a Σj = Σ 11-9
2009/11 – 4. 3. 2009 3. Pro každou posloupnost Or z trénovací množiny dat se dopředně zpětným algoritmem vypočítají podle vztahů (1.23), (1.26), (1.15) a (1.17) hodnoty: αjr (t), βjr (t),
(1.28) N −1 X
P (Or |M ) =
αjr (t)βjr (t),
(1.29)
j=2 αjr (t)βjr (t) , P (Or |M )
Lrj (t) =
(1.30)
kde t = 1, 2, . . . , Tr . 4. Vztahy pro určení odhadu se vyskytují ve formě vážených průměrů parametrů z trénovacích dat. Váhami jsou zde aposteriorní pravděpodobnosti, že každý vektor z trénovacích dat je pozorován v každém stavu modelu M . • Přechodové pravděpodobnosti odhadneme podle vztahů: R TP r −1 P
a ˆij =
Lrj (t)aij bj (ort+1 )
r=1 t=1 R P Tr P
βjr (t+1) βjr (t)
,
(1.31)
Lrj (t)
r=1 t=1
a ˆ1j =
1 R
R X
Lrj (1),
(1.32)
r=1 R P
Lrj (T )
a ˆiN =
r=1 R Tr PP
,
(1.33)
Lrj (T )
r=1 t=1
kde i, j = 2, . . . , N − 1. • Dále vypočítáme parametry potřebné k určení hustot výstupních pravděpodobností pro všechna j = 2, . . . , N − 1 dle vztahů: R P Tr P
ˆj = µ
Lrj (t)ort
r=1 t=1 R P Tr P
,
(1.34)
Lrj (t)
r=1 t=1 Tr R P P
ˆj = Σ
ˆ j )(ort − µ ˆ j )T Lrj (t)(ort − µ
r=1 t=1 R P Tr P
.
(1.35)
Lrj (t)
r=1 t=1
5. Testujeme, zdali se hodnoty nově vypočítaných parametrů významně liší od předchozích. Pokud ano, přecházíme znovu na krok 2. 11-10
2009/11 – 4. 3. 2009
Výhodou tohoto algoritmu je také to, že můžeme předem určit maximální počet cyklů přetrénování, což je užitečné především při zautomatizovaných výpočtech. 1.1.7
Rozpoznávání pomocí Viterbiho algoritmu
V předchozí kapitole jsme ukázali, jak vypočítat z množiny trénovacích dat parametry modelu tak, aby jednotlivé posloupnosti pozorování generoval s největší pravděpodobností. To znamená, že nyní již disponujeme natrénovanými modely a můžeme přejít k rozpoznávání. Jak jsme uvedli v kap. 1.1.5, při rozpoznávání by stačilo zjistit, který model generuje danou posloupnost pozorování O neznámého slova wi s největší pravděpodobností. V mnoha aplikacích je však užitečné přiřadit dané posloupnosti vektorů pozorování posloupnost stavovou, jinými slovy zjistit, kterými stavy model při generování posloupnosti O procházel [2]. Rovněž jsme uvedli, že tato stavová posloupnost je před námi ukryta, nicméně můžeme vypočítat alespoň nejpravděpodobnější stavovou sekvenci, a to pomocí Viterbiho algoritmu. Viterbiho algoritmus využívá k výpočtu dvě pravděpodobnostní funkce: φj (t) a ψj (t). Funkce φj (t) je částečná Viterbiho pravděpodobnost nejvíce pravděpodobné posloupnosti stavů při generování posloupnosti vektorů pozorování o1 , . . . , ot , jestliže se model M po vygenerování této posloupnosti nachází ve stavu sj [2]: φj (t) = max P (o1 , . . . , ot , s(t) = sj |M ),
(1.36)
X(t−1)
kde X(t−1) je množina všech stavových posloupností modelu v čase (t−1). φj (t) můžeme vypočítat podobně jako částečnou dopřednou pravděpodobnost αj (t), pouze místo sumace využíváme maximalizaci. Na začátku tedy provedeme inicializaci, poté se pohybujeme modelem směrem k poslednímu stavu a nakonec algoritmus ukončujeme v čase t = T + 1 [4]: φj (1) = a1j bj (o1 ) pro 2 ≤ j ≤ N − 1, φj (t) = φN (T + 1) =
(1.37)
max
{φi (t − 1)aij } bj (ot ) pro 2 ≤ j ≤ N − 1,
(1.38)
max
{φi (T )aiN } .
(1.39)
i=2,...,N −1 i=2,...,N −1
Jestliže si nyní opět uvědomíme definici Viterbiho pravděpodobnosti popsanou vztahem (1.10), zjistíme, že φN (T + 1) je rovněž předpisem této pravděpodobnosti: Pˆ (O|M ) = φN (T + 1).
(1.40)
Další pravděpodobnostní funkce, kterou Viterbiho algoritmus využívá, je funkce ψj (t). Této pravděpodobnosti se využívá k určení posloupnosti stavů. Funkce si 11-11
2009/11 – 4. 3. 2009
v každém kroku t zapamatuje stav, který v předchozím iteračním kroku maximalizoval rovnici (1.38). Tuto pravděpodobnost tedy můžeme popsat vztahy [2]: ψj (t) = arg ψN (T + 1) = arg
max
{φi (t − 1)aij } ,
max
{φi (T )aiN } .
i=2,...,N −1 i=2,...,N −1
kde t = 2, . . . , T,
(1.41) (1.42)
ψj (t) uchovává nejpravděpodobnější stavy, kterými model procházel. Stavovou posloupnost pak získáme zpětným trasováním. Jestliže bude stavová posloupnost X obsahovat stavy x(0), x(1), . . . , x(T + 1), pak pro tyto stavy bude platit [2]: (1.43)
x(T + 1) = N, x(T ) = ψN (T + 1), x(t) = ψx(t+1) (t + 1),
(1.44) kde t = 1, . . . , T − 1,
x(0) = 1.
1.1.8
(1.45) (1.46)
Algoritmus putující značky (Token passing algorithm)
V modulu HTK se používá určitá modifikace Viterbiho algoritmu pro získání celkové akumulované pravděpodobnosti při průchodu jednotlivými stavy HMM modelu. Algoritmus si značkou (token) označuje stav, v němž se právě nachází, a postupně sčítá (akumuluje) logaritmy jednotlivých pravděpodobností. Algoritmus postupující značky lze popsat následovně [4]: 1. Je provedena inicializace tím, že do vstupního stavu každého modelu je vložena jedna prázdná značka. 2. Pro časové okamžiky t = 1, . . . , T opakujeme kroky 3) a 4). 3. V každém stavu si vložíme do značky logaritmus pravděpodobnosti, který danému stavu odpovídá. Při cestě do dalších stavů jsou logaritmy pravděpodobností přičítány a opět uloženy do značky log aij + log bj (ot ). 4. Pokud se v nějakém stavu objeví více značek, vybereme tu, která má největší akumulovanou pravděpodobnost. Je to možné proto, že se do daného stavu můžeme dostat různými cestami. 5. Ze všech stavů si pošleme do výstupního stavu značku s největší akumulovanou pravděpodobností. Tato pravděpodobnost pak odpovídá logaritmu Viterbiho pravděpodobnosti Pˆ (O|M ). 11-12
2009/11 – 4. 3. 2009
1.2
Rozpoznávání spojité řeči
Obr. 1.3: Síť HMM určená k rozpoznávání spojité řeči. Při rozpoznávání spojité řeči si již nevystačíme s jedním modelem, ale naopak použijeme těchto modelů více. V tomto případě s výhodou využijeme neemitující stavy, jejichž pomocí modely spojíme do jednoho velkého makromodelu. Jednotlivé modely pak mohou být natrénovány na izolovaná slova, nebo na drobnější řečové jednotky jako jsou např. difony nebo trifony. Při trénování tohoto makromodelu se používají postupy podobné jako při trénování modelů jednotlivých, nicméně výpočty se vztahují na celý makromodel. Stejně tak při rozpoznávání musíme token passing algoritmus drobně upravit. Nejčastěji se na token pomocí ukazatele naváže struktura WLR (Word Link Record), která uchovává identitu právě opuštěného slova a čas. Zpětným trasováním WLR pak zjistíme slova, kterými model procházel [3]. Pokud budeme například rozpoznávat spojitou řeč, ve které se budou vyskytovat pouze slova „ jednaÿ, „dvaÿ a „třiÿ, mohla by síť hláskových modelů vypadat jako na obr. 1.3. Jednotlivé ovály zde reprezentují skryté Markovovy modely a obdélníky výsledná slova, která vzniknou sloužením těchto modelů. V tomto příkladě byla použita fonetická abeceda SAMPA [5].
11-13
2009/11 – 4. 3. 2009
2
Rozpoznávání spojité řeči pomocí modulu HTK
Proces rozpoznávání si můžeme rozdělit na dvě části. Nejdříve je potřeba navrhnout vhodnou strukturu modelu HMM (určit počet stavů, inicializovat matice přechodových pravděpodobností apod.) a dále natrénovat na patřičném množství trénovacích dat jednotlivé modely. Modul HTK k zjištění parametrů modelů HMM používá Baumův-Welchův algoritmus. V dalším kroku pak provádíme samotné rozpoznávání, přičemž modul HTK pro tyto účely využívá token passing algoritmus [3]. Pokud bychom chtěli detailnější popis postupu návrhu rozpoznávače spojité řeči, rozdělili bychom jej do čtyř fází: příprava dat, trénování, testování a analýza.
2.1
Příprava dat
Modul HTK při trénování využívá parametrický popis dat. Může se jednat například o melovské frekvenční koeficienty (MFCC), lineární predikční koeficienty (LPC), percepční lineární predikční koeficienty (PLP) atd. Nejprve je třeba tyto parametry ze zvukových nahrávek vypočítat. K tomu slouží nástroj HCopy, který tyto parametry ze souborů typu *.wav, *.raw nebo jiných formátů vypočítá. Pomocí nástroje HList si pak můžeme vypsat obsahy těchto souborů. Pokud k trénovacím datům již existují transkripce (jak na úrovni slov, tak na úrovni hlásek), je potřeba tyto transkripce konvertovat do formátů čitelných modulem HTK. K tomu nám slouží nástroj HLEd, pomocí něhož můžeme rovněž z několika transkripcí vytvořit jeden Master Label File (MLF), který je pak výhodnější pro další zpracování. Soubor MLF usnadňuje orientaci ve velkém množství zpracovávaných souborů. Jestliže si chceme pořídit vlastní nahrávky, můžeme využít nástroj HSLab, který rovněž umožní nahrávky ihned označit.
2.2
Trénování
V dalším kroku si definujeme topologii každého modelu HMM a rovněž nastavíme počáteční hodnoty matice přechodových pravděpodobností. V prvním cyklu se data rovnoměrně rozdělí a vypočítají se střední hodnoty a rozptyly. V dalších cyklech je rovnoměrné rozdělení nahrazeno Viterbiho algoritmem. Během inicializace je z trénovacích dat první sada parametrů vypočítána nástrojem HInit. K dalšímu přetrénování se pak používá nástroj HERest, který využívá již zmíněný Baumův-Welchův algoritmus. 11-14
2009/11 – 4. 3. 2009
Filozofie modulu HTK je taková, že by se modely HMM měly zdokonalovat postupně. Proto se nejčastěji začíná s kontextově nezávislými modely, které se dále rozšiřují na kontextově závislé, tj. na modely, které zohledňují své okolí. Nástroj HHEd se používá k tomu účelu, že provede klonování modelů do kontextově závislých sad s následným svazováním parametrů. To zvyšuje robustnost rozpoznávače.
2.3
Rozpoznávání
Pro rozpoznávání používá modul HTK jeden ze tří programů: HVite, HLRecsore a HDecode. Podrobněji si popíšeme práci programu HVite. Tento program používá k rozpoznávání již zmíněný token passing algoritmus. Na vstup programu se předává síť možných slov, která se v řeči mohou vyskytovat, a pouze tato slova se mohou v řeči objevit. Dále je nutné uložit slovník s fonetickou transkripcí jednotlivých slov a nakonec sadu modelů HMM. Program HVite pak dokáže na základě těchto informací určit hranice slov v řečových datech, která jsou buď uložena na disku, nebo která přichází přímo ze zvukové karty. Síť možných slov lze vygenerovat automaticky např. pomocí programů HBuild nebo HParse. Pokud máme vytvořenou síť, můžeme nástrojem HSGen vygenerovat náhodné posloupnosti slov, která se mohou na vstupu vyskytovat. Pořadí výskytu těchto slov se však může řídit některými pravidly. To může sloužit ke kontrole správně vytvořené sítě, nebo tyto věty můžeme použít k nahrání nových řečových dat. Pokud již existuje k datům slovník fonetické transkripce, musíme jeho formát transformovat na formát používaný v modulu HTK. K tomu slouží program HDMan.
2.4
Analýza
Jakmile je rozpoznávač připravený, provedeme testování a analýzu rozpoznávání na testovacích datech. Testovací nahrávky by měly být označené na úrovni hlásek, nicméně může postačit i transkripce na úrovni slov. Nejdříve nahrávky zpracujeme natrénovanými modely a poté zjistíme úspěšnost rozpoznávání na základě statistik získaných nástrojem HResults. Ze statistik pak můžeme zjistit počet správně rozpoznaných slov (nebo delších úseků) a počet chyb vzniklých substitucí, vynecháním nebo přidáním.
V modulu HTK existuje mnoho dalších programů, které mají různé využití. Jejich detailní popis je spolu s příklady použití dostupný v dokumentaci k modulu HTK, tzv. HTK Book [3].
11-15
2009/11 – 4. 3. 2009
3
Příklad vytvoření rozpoznávače spojité řeči s omezeným slovníkem v modulu HTK verze 3.4
V této části popisu si uvedeme jednoduchý postup vytvoření rozpoznávače, který bude pracovat pouze s omezeným slovníkem. Účelem tohoto popisu není tvorba robustního a velmi přesného rozpoznávače. Chceme zde jen uvést postup návrhu použitím modulu HTK, shlukování trifonových stavů, svazování trifonů a následné rozpoznávání spojité řeči. Nicméně pokud budeme mít již vytvořený jednoduchý rozpoznávač, můžeme jeho přesnost a robustnost dále vylepšovat (kapitola 3.14). Zde jsou použity nahrávky TIMIT, které jsou popsány v kapitole 3.1, nicméně je možné použít i jakékoliv jiné nahrávky. Dokumentace k modulu HTK je volně dostupná na internetu. Další návody, které se zabývají tvorbou rozpoznávače spojité řeči, jsou v pramenech [1] [6] [7].
3.1
TIMIT data
Řečový korpus2 TIMIT (Texas Instruments/Massachusetts Institute of Technology) byl navržen k vývoji a testování automatických systémů rozpoznávání řeči. Korpus TIMIT (1993) obsahuje řečové nahrávky 630 mluvčích, reprezentujících osm hlavních dialektů americké angličtiny. Od každého mluvčího je v korpusu uchováno deset projevů. Z celkového počtu mluvčích je mužské pohlaví zastoupeno 70 % a ženské 30 %. Každá z promluv byla zaznamenána v bezodrazové komoře, přičemž řečový signál byl vzorkován kmitočtem fvz = 20 kHz a dále decimován na fvz = 16 kHz. Tato data jsou pro účely rozpoznávání již předem rozdělena na trénovací a testovací [8].
3.2
Příprava modulu HTK
Modul HTK je soubor programů s otevřeným zdrojovým kódem, který je po registraci volně stažitelný ze zdroje [1]. Je doporučeno stáhnout z těchto stránek také soubory s příklady a pomocnými skripty v jazyce Perl, které se budou v tomto návodu používat. Způsobů instalace je několik, existuje verze modulu HTK jak pro operační systém UNIX, tak pro MS Windows. Ve Windows se nejvíce osvědčila kompilace zdrojových *.c souborů v Unixu podobném prostředí Cygwin. Toto prostředí je volně dostupné ze zdroje [9]. Nicméně soubory je možné zkompilovat i přímo 2
Pojmem řečový korpus se zde rozumí soubor nahrávek řečového signálu, ke kterému existuje anotace, což je symbolická reprezentace řeči, která podává informaci o tom, jak byly jednotlivé promluvy v nahrávce vysloveny.
11-16
2009/11 – 4. 3. 2009
pomocí externího kompilátoru jazyka C. K další práci bude také potřeba nainstalovat program, který by umožňoval spouštět skripty napsané v jazyce Perl. K tomu lze použít například ActivePerl, který je volně stažitelný z pramenu [10]. I když je přímo na internetových stránkách modul HTK popsán postup instalace, tento popis je dosti strohý a nemusí vždy vést k úspěšné kompilaci. Proto se doporučuje raději postupovat podle návodu, který je zveřejněn na stránkách VoxForge, [11]. Po úspěšné instalaci modulu HTK si vytvoříme adresář, ve kterém budeme dále vytvářet soubory potřebné k rozpoznávání a do kterého nahrajeme TIMIT data. Dále se již bude pokračovat podle následujícího postupu.
3.3
Gramatika
Nejdříve je potřeba vytvořit k rozpoznávání gramatiku (možnou posloupnost slov) gram. V našem případě se omezíme pouze na některá slova, přičemž je budeme psát verzálkami. Výpis souboru gram bude vypadat následovně: $word = A | ALL | ARE | BEFORE | BELOW | BOX | CONVENIENT | DARK | DROP | EXPECTATIONS | FALL | FAR | FIVE | FOR | FORMS | GO | GREASY | HAD | IN | LUNCH | MAY | OUT | PIZZERIAS | PRODUCTION | QUICK | SHE | SUIT | THE | WASH | WATER | YEAR | YOU | YOUR; ( SENT-START (<$word>) SENT-END ) . Do proměnné $word nejdříve uložíme všechna slova, která chceme rozpoznávat. Poslední příkaz pak slouží k definování různého sledu slov. V našem jednoduchém příkladě umístíme proměnnou $word do ostrých závorek, což znamená jedno a více opakování slov. Takto vytvořenou gramatiku uložíme do adresáře grammar. Dále je potřeba získat síť slov. Modul HTK totiž nedokáže pracovat přímo s gramatikou, proto je potřeba vytvořit soubor, který by gramatiku pro HTK interpretoval pomocí HTK Standard Lattice Format (SLF), což lze pomocí HParse vytvořit přímo z gramatiky následujícím příkazem: HParse gram wdnet , kde gram je soubor s gramatikou a wdnet vytvořený soubor se sítí.
11-17
2009/11 – 4. 3. 2009
3.4
Tvorba slovníku
Dalším krokem je tvorba slovníku3 . Slovník musí být abecedně seřazen, přičemž každý výraz musí být na zvláštním řádku a fonetická transkripce od výrazu oddělena mezerou nebo tabulátorem4 . V adresáři se soubory TIMIT5 je na adrese TIMIT\DOC\TIMITDIC.TXT uložen již připravený slovník, nicméně pro použití modulu HTK je potřeba jej upravit. Vytvoříme si nový adresář dictionary, kde vytvoříme soubor timit trans.txt, do kterého zkopírujeme obsah TIMITDIC.TXT. Je nutné zde dále doplnit některá slova, a naopak některé záznamy smazat. Všechny výrazy musí být napsány verzálkami a transkripce minuskami. Rovněž je nutné odstranit lomítka a poslední záznam ukončit novým řádkem. Tento slovník lze vytvářet také automaticky. Příklad upraveného slovníku může být například takový6 : A ax ABBREVIATE ax b r iy1 v iy ey2 t ABDOMEN ae1 b d ax m ax n ABIDES ax b ay1 d z ... ZONING z ow1 n ix ng ZOO z uw1 ZOOLOGIST z ow aa1 l ax jh ix s t ZOOS z uw1 z~ . V dalším kroku vytvoříme soubor wlist.txt, který obsahuje pouze slova bez transkripce ze souboru timit trans.txt . Poté je již možné vytvořit slovník příkazem HDMan -m -w wlist.txt -n monophones1 -l dlog dict timit\_trans.txt , 3
Jedná se o seznam slov, kterým jsou přiřazeny jejich fonetické transkripce. Nedodržení těchto podmínek způsobuje v dalších krocích časté chyby, proto je nutné vše správně dodržet. 5 Tyto soubory jsou na CD spolu s TIMIT nahrávkami. 6 V tomto případě je použita fonetická abeceda ARPABET, nicméně na použitém druhu fonetické abecedy v modulu HTK nezáleží, [12] [3]. Pokud disponujeme pouze slovy bez fonetické transkripce, můžeme fonetický přepis vytvořit automaticky pomocí různých nástrojů, [13]. 4
11-18
2009/11 – 4. 3. 2009 kde monophones1 je seznam všech vyskytujících se monofonů7 , dlog je soubor obsahující různé informace (např. jestli byla přeložena všechna slova, kolik jich chybí atd.) a dict je již samotný slovník. Aby byla tvorba provedena korektně, je nutné mít v adresáři ještě soubor s názvem global.ded, který obsahuje následující příkazy: AS sp RS cmu MP sil sil sp . kde první příkaz přidává na konec každé fonetické transkripce krátkou pauzu sp (short pause), druhý příkaz odstraňuje z fonetické abecedy přízvuk značený číslicí (např. ae1 transformuje na ae) a poslední příkaz spojuje dlouhou pauzu sil (silence) a krátkou pauzu sp, přičemž toto spojení nahradí dlouhou pauzou sil.
3.5
Vytvoření seznamu vět a MLF souborů
V dalším kroku je potřeba vytvořit seznamy trénovacích a testovacích TIMIT dat a jejich popisů. Nejdříve vytvoříme soubor promptlist.txt, což je seznam trénovacích zdrojů a příslušných vět. Jelikož je manuální tvorba tohoto souboru při velkém počtu trénovacích dat časově náročná, doporučujeme k tvorbě využít některý ze skriptovacích jazyků, jako např. Perl či Python. Výpis souboru promptlist.txt může vypadat např. takto: ..\data\TRAIN\DR1\FCJF0\SX307 THE MEETING IS NOW ADJOURNED ..\data\TRAIN\DR1\FCJF0\SX217 HOW PERMANENT ARE THEIR RECORDS ..\data\TRAIN\DR1\FDML0\SI2075 NOW FORGET ALL THIS OTHER ... . Pokud máme seznam všech vět v jednom souboru, můžeme vytvořit MLF (Master Label File) soubor všech slov v promluvách, který bude umístěn v adresáři mlf, do kterého se nyní přesuneme. Soubor vytvoříme pomocí skriptu v jazyce Perl prompts2mlf, který je uložen v HTKTutorial skupině souborů. Tato skupina je volně dostupná ze stránek HTK[1]. Spustíme následující příkaz: perl prompts2mlf words.mlf ../dictionary/promptlist.txt . 7
Základní jednotkou fonetických popisů jazyka je hláska, minimální zvuková jednotka řeči, zobecněný typ zvukové reality patřící určitému jazyku. Foném je základní jednotkou fonologie. Jedná se o nejmenší zvukový prostředek schopný rozlišit minimální významovou jednotku jazyka, [14]. Při popisu mluvené podoby jazyka se obě jednotky vzájemně doplňují, v tomto článku je budeme společně označovat jako monofony.
11-19
2009/11 – 4. 3. 2009
Vznikne soubor words.mlf. Nyní vytvoříme MLF soubor na úrovní hlásek. Připravíme si soubor mkphones0.led, který bude obsahovat příkazy (sil – silence, sp – short pause): EX IS sil sil DE sp . kde první příkaz rozděluje slova na fonémy podle slovníku dict, druhý příkaz přidává na začátek a konec věty dlouhou pauzu sil, a poslední příkaz maže všechny výskyty krátké pauzy sp. Poslední příkaz je nutné ukončit novým řádkem. Dále spustíme příkaz: HLEd -d ../dictionary/dict -i phones0.mlf mkphones0.led words.mlf . Výstupem tohoto příkazu bude soubor phones0.mlf. Je třeba upozornit, že vhodné umístění pauz uvnitř slov a mezi slovy dosti ovlivňuje účinnost rozpoznávání.
3.6
Kódování dat
V dalším kroku vypočítáme ze všech nahrávek trénovacích a testovacích dat koeficienty typu MFCC. K tomu si musíme nejdříve vytvořit několik podpůrných souborů a skriptů8 . Nejdříve si vytvoříme seznamy trénovacích a testovacích dat. Vytvoříme si nový adresář scripts, kam se nyní přesuneme. Zde vytvoříme dva seznamy codetr.scp a codets.scp, které budou mít na řádku cestu k *.wav souboru a cestu k souboru *.mfc, kde budou uloženy koeficienty. Výpis souboru codetr.scp může vypadat např. takto: ..\data\TRAIN\DR1\FCJF0\SA1.WAV ..\data\TRAIN\DR1\FCJF0\SA1.mfc ..\data\TRAIN\DR1\FCJF0\SI648.WAV ..\data\TRAIN\DR1\FCJF0\SI648.mfc ..\data\TRAIN\DR1\FCJF0\SX127.WAV ..\data\TRAIN\DR1\FCJF0\SX127.mfc ..\data\TRAIN\DR1\FCJF0\SX307.WAV ..\data\TRAIN\DR1\FCJF0\SX307.mfc ... . Dále si vytvoříme dva seznamy train.scp a test.scp, kde se budou vyskytovat cesty k *.mfc souborům. Zatímco seznam train.scp bude obsahovat všechna trénovací data, seznam test.scp bude obsahovat jen data, ve kterých se budou vyskytovat pouze slova z gramatiky grammar/gram9 . Výpis souboru test.scp tak bude např. následující: 8
Skripty zde nejsou myšleny nějaké posloupnosti příkazů, ale spíše konfigurační soubory. Je to zřejmé, jelikož jiná slova by rozpoznávač zaměnil za slova z gramatiky, a došlo by tak k rozpoznávacím chybám. 9
11-20
2009/11 – 4. 3. 2009
..\data\TEST\DR1\FAKS0\SA1.mfc ..\data\TEST\DR1\FAKS0\SI943.mfc ..\data\TEST\DR1\FAKS0\SX133.mfc ..\data\TEST\DR1\FAKS0\SX313.mfc . Nyní vytvoříme skript configtr.txt pro trénovací data a configts.txt pro testovací data. Oba skripty budou obsahovat následující příkazy: # Coding parameters SOURCEFORMAT = NIST TARGETKIND = MFCC_0_D_A TARGETRATE = 100000.0 SAVECOMPRESSED = T SAVEWITHCRC = T WINDOWSIZE = 250000.0 USEHAMMING = T PREEMCOEF = 0.97 NUMCHANS = 26 CEPLIFTER = 22 NUMCEPS = 12 ENORMALISE = F . Příkaz MFCC 0 D A znamená že se kódují koeficienty spolu s logaritmem energie a odhadem první a druhé diference. SOURCEFORMAT určuje formát vstupních dat. TARGETRATE určuje vzorkovací periodu výstupních vektorů po 100 ns (v našem případě tedy 100 ms), SAVECOMPRESSED = T znamená, že výstup bude komprimován, SAVEWITHCRC = T zabezpečuje data pomocí CRC, WINDOWSIZE určuje délku okna 100 ns, USEHAMMING znamená použití Hammingova okna, PREEMCOEF značí, že bude provedena preemfáze s koeficientem a = 0,97, NUMCHANS značí, že banka filtrů bude mít 26 kanálů, CEPLIFTER značí liftering koeficientů typu MFCC, NUMCEPS určuje počet koeficientů typu MFCC, ENORMALISE = F vypíná normalizaci energie10 . Nyní již provedeme parametrizaci pomocí následujících příkazů: HCopy -T 1 -C configtr.txt -S codetr.scp , HCopy -T 1 -C configts.txt -S codets.scp . Tímto k datům přibudou nové *.mfc soubory s koeficienty. Tyto soubory lze číst pomocí příkazu: HList -h nazev\_souboru.mfc . 10
Normalizace se používá při zpracování v reálném čase [3].
11-21
2009/11 – 4. 3. 2009
V dalším kroku již můžeme vytvářet skryté Markovovy modely (HMM).
3.7
Tvorba monofonových modelů typu HMM
Pro tento příklad budeme využívat tzv. flat start, což znamená, že budeme uvažovat trénovací data, která nejsou předem označena11 . V hlavním adresáři vytvoříme adresáře hmm0 a proto, do kterých se přesuneme. Nejdříve vytvoříme prototypový model a uložíme do souboru proto, který rovněž zkopírujeme do adresáře hmm0. Obsah tohoto souboru bude následující: ~o
39 ~h "proto" 5 <State> 2 <Mean> 39 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39 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 39 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 39 11
<MFCC_0_D_A>
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.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
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.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
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
I když naše TIMIT data již označena jsou, a to jak na úrovni slov, tak na úrovni hlásek.
11-22
2009/11 – 4. 3. 2009
1.0 1.0 1.0 1.0 1.0 1.0 5 0.0 1.0 0.0 0.6 0.0 0.0 0.0 0.0 0.0 0.0 <EndHMM> .
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 0.0 0.4 0.6 0.0 0.0
0.0 0.0 0.4 0.7 0.0
0.0 0.0 0.0 0.3 0.0
V našem případě tedy používáme pětistavové modely typu HMM, přičemž první a poslední stav není emitující, ale slouží k navazování modelů. Každý stav má nastavené střední hodnoty na nuly a rozptyly na jedničku. Za příkazem 5 následuje matice přechodových pravděpodobností, kde pozice hodnoty na řádku n a sloupci m udává přechodovou pravděpodobnost an,m . Dále do adresáře proto zkopírujeme soubor configtr.txt z adresáře scripts. V tomto souboru odstraníme řádek SOURCEFORMAT = NIST. Nyní musíme nastavit střední hodnoty, odchylky a všechny Gaussovy průběhy v HMM. To provedeme příkazem HCompV -C configtr.txt -f 0.01 -m -S ../scripts/train.scp -M ../hmm0 ../hmm0/proto . Tím se nám v adresáři hmm0 upraví soubor proto, a rovněž se vytvoří makro vFloors. Nyní se přesuneme do adresáře hmm0. V dalším kroku vytvoříme dva soubory. Ze souboru vFloors vytvoříme soubor macros přidáním hlavičky: ~o 39 <MFCC_0_D_A> . Dále se přesuneme do složky dictionary, kde kopírujeme soubor monophones1 a přejmenujeme jej na monophones0. V tomto souboru smažeme mezislovní pauzu sp a přidáme dlouhou sil. Takto upravený soubor zkopírujeme do adresáře hmm0 a přejmenujeme jej na hmmdefs. Tento soubor upravíme tak, že ke každému řádku přidáme data ze souboru proto, přičemž příklad takového souboru může být následující: ~h "sil" ... <ENDHMM> 11-23
2009/11 – 4. 3. 2009
~h "ax" ... <ENDHMM> ~h "sp" ... <ENDHMM> ... . V hlavním adresáři vytvoříme podadresáře hmm1, hmm2 a hmm3. Nyní se přesuneme do adresáře hmm0 a spustíme příkazem: HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm1 ../dictionary/monophones0 . Přesuneme se do adresáře hmm1 a spustíme příkazem: HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm2 ../dictionary/monophones0 . Nakonec se přesuneme do adresáře hmm2 a spustíme příkazem: HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm3 ../dictionary/monophones0 . Tím jsme třikrát přetrénovali model typu HMM, přičemž jsme zatím neuvažovali mezislovní pauzy sp. Příznakem -t jsme v příkazech nastavovali prahovou úroveň logaritmu částečné zpětné pravděpodobnosti β. Při překročení této úrovně dojde k zastavení procesu přetrénování. Zvyšováním prahové úrovně zajišťujeme přesnější přetrénování modelů.
3.8
Zavedení modelů pauzy
V předchozím bodě jsme vygenerovali pětistavové levo-pravé modely HMM (první a poslední stav není emitující) pro každou hlásku a model pauzy sil. V dalším kroku vygenerujeme třístavový model (s jedním emitujícím stavem) pro krátkou pauzu sp. Tento model bude mít emitující stav svázán s prostředním stavem modelu pauzy sil. Takový model vytvoříme ve dvou krocích. Z adresáře hmm3 zkopírujeme soubor hmmdefs do nového adresáře hmm4. Tento soubor dále editujeme, přičemž zkopírujeme prostřední stav modelu sil a vytvoříme 11-24
2009/11 – 4. 3. 2009 nový model sp. Takto nově vytvořený sp model by mohl vypadat např. takto12 : ~h "sp" 3 <STATE> 2 <MEAN> 39 -1.905831e+01 -2.318672e+00 -6.234688e+00 -1.990136e+00 -2.092976e+00 -2.573914e-01 -7.386095e-01 2.931617e-01 -6.817085e-01 4.748913e-01 -4.791465e-01 2.573071e-01 3.286690e+01 -1.675636e-01 1.354374e-01 1.738080e-01 1.213613e-01 8.271752e-02 8.141164e-02 1.469952e-02 -4.667811e-02 3.661389e-03 1.093205e-01 5.605623e-02 -3.884711e-02 -1.527206e-01 5.819472e-02 -6.436200e-02 -1.883480e-02 -5.772859e-02 -3.444229e-02 -5.697624e-02 -2.284278e-02 9.972874e-05 -2.019464e-02 -3.792312e-02 -3.076673e-02 -6.435335e-03 1.199906e-01 39 6.160837e+00 7.934437e+00 9.820024e+00 1.162281e+01 1.183406e+01 1.410295e+01 1.464444e+01 1.622942e+01 1.635606e+01 1.679205e+01 1.503452e+01 1.273678e+01 6.774286e+00 4.137819e-01 6.588092e-01 8.895987e-01 1.036966e+00 1.177018e+00 1.361918e+00 1.475117e+00 1.586270e+00 1.646126e+00 1.696561e+00 1.497926e+00 1.331998e+00 3.486073e-01 7.852182e-02 1.228069e-01 1.630246e-01 2.019144e-01 2.285312e-01 2.646243e-01 2.946185e-01 3.124516e-01 3.234148e-01 3.302834e-01 2.955636e-01 2.645462e-01 7.693569e-02 8.368510e+01 3 0.000000e+00 8.486999e-01 1.513001e-01 0.000000e+00 8.486999e-01 1.513001e-01 0.000000e+00 0.000000e+00 0.000000e+00 <ENDHMM> . V dalším kroku svážeme emitující stav modelu sp s prostředním emitujícím stavem modelu sil. Využijeme k tomu příkaz HHEd, přičemž si nejdříve vytvoříme pomocný soubor sil.hed, jehož obsah bude následující: AT 2 4 0.2 {sil.transP} 12
Při tvorbě matice přechodových pravděpodobností musíme dbát na to, aby členy a1,1 , a2,1 , a3,1 , a3,2 a a3,3 byly nulové. Součet hodnot na řádku musí být rovněž ≤ 1.
11-25
2009/11 – 4. 3. 2009
AT 4 2 0.2 {sil.transP} AT 1 3 0.3 {sp.transP} TI silst {sil.state[3],sp.state[2]} . kde obecně příkaz AT i j prob itemList(t) zvyšuje přechodovou pravděpodobnost ze stavu i do j o hodnotu prob ve všech maticích přechodových pravděpodobností v seznamu itemList. Poslední příkaz pak svazuje všechny stavy ze seznamu a výsledek pojmenuje silst. Nyní se ještě ujistíme, že se v souboru dictionary/monophones1 vyskytuje dlouhá pauza sil. Pokud ne, tak ji sem připíšeme. Dále již provedeme příkaz: HHEd -H macros -H hmmdefs -M ../hmm5 sil.hed ../dictionary/monophones1 , pomocí něhož vytvoříme svázaný stav silst, jehož parametry budou uloženy v souboru hmmdefs, který se vytvořil v adresáři hmm5. V dalším kroku modely dvakrát přetrénujeme: HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm6 ../dictionary/monophones1 HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm7 ../dictionary/monophones1 .
3.9
Výpočet nových hranic v trénovacích datech
Dříve vytvořený slovník dictionary/dict může pro jedno slovo obsahovat několik různých výslovností. Námi vytvořené modely HMM pro jednotlivé hlásky můžeme využít k vytvoření nové fonetické transkripce z již existující transkripce na úrovni slov, která je uložena v souboru mlf/words.mlf. Ještě před tvorbou nové fonetické transkripce upravíme slovník dictionary/dict přidáním nového řádku: silence sil , přičemž musíme stále pamatovat na to, že slovník je setříděn nejdříve podle velikosti písma (první jsou v pořadí verzálky, poté mínusky). V druhé řadě je slovník seřazen abecedně. Fonetickou transkripci vytvoříme příkazem: HVite -l ’*’ -o SWT -b silence -C ../proto/configtr.txt -a -H macros -H hmmdefs -i ../mlf/aligned.mlf -m -t 250.0 -y lab -I 11-26
2009/11 – 4. 3. 2009
../mlf/words.mlf -S ../scripts/train.scp ../dictionary/dict ../dictionary/monophones1 . Fonetickou transkripci nalezneme na adrese mlf/aligned.mlf. V dalším kroku znovu dvakrát přetrénujeme modely: HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm8 ../dictionary/monophones1 HERest -C ../proto/configtr.txt -I ../mlf/phones0.mlf -t 250.0 150.0 1000.0 -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm9 ../dictionary/monophones1 .
3.10
Tvorba trifonů z monofonů
Dalším požadavkem je vytvořit kontextově závislé trifonové modely HMM13 . To rovněž proběhne v několika krocích. Nejdříve konvertujeme fonetickou transkripci na trifonovou. Dále vytvoříme z monofonových modelů trifonové, a to zkopírováním a přetrénováním. V druhém kroku svážeme podobné akustické stavy trifonů14 . Kontextově závislé hláskové modely jednoduše vytvoříme klonováním monofonových a přetrénováním pomocí trifonové transkripce. Nejdříve si vytvoříme trifonovou transkripci. K tomu budeme potřebovat soubor mktri.led, jehož obsah je následující: WB sp WB sil TC . Aby vše správně fungovalo, musí být poslední příkaz ukončen novým řádkem. Nyní spustíme příkaz: HLEd -n ../dictionary/triphones1 -l ’*’ -i ../mlf/wintri.mlf mktri.led ../mlf/aligned.mlf . Monofonová transkripce v souboru mlf/aligned.mlf bude konvertována na trifonovou do nového souboru mlf/wintri.mlf. Rovněž se vytvoří seznam všech použitých trifonů v souboru dictionary/triphones1. Jelikož se některá slova mohou skládat 13
Trifonem zde v podstatě rozumíme kontextově závislou hlásku, neboli hlásku závislou na svém levém a pravém okolí. 14 Svazováním se míní to, že jeden nebo více modelů HMM sdílí stejné sady parametrů.
11-27
2009/11 – 4. 3. 2009 pouze ze dvou hlásek, vytvoří se v souboru i některé difony15 . Před klonováním si dále vytvoříme skript mktri.hed, který bude obsahovat klonovací příkaz a příkazy, které budou svazovat všechny přechodové matice v každé trifonové sadě. Tento soubor vytvoříme pomocí skriptu v jazyce Perl maketrihed, který je uložen v HTKTutorial adresáři: perl maketrihed ../dictionary/monophones1 ../dictionary/triphones1 . Některá varování, která skript vypíše, budeme ignorovat, jelikož u kontextově nezávislých modelů sp a sil nemáme co svazovat. Skript vytvoří soubor mktri.hed, který dále použijeme v příkazu: HHEd -B -H macros -H hmmdefs -M ../hmm10 mktri.hed ../dictionary/monophones1 . Tento příkaz nám v adresáři hmm10 vytvoří nové soubory macros a hmmdefs. Tyto soubory jsou však zapsány již v binární formě. Jakmile máme naklonované kontextově závislé modely, můžeme nové trifonové sady přetrénovat: HERest -B -C ../proto/configtr.txt -I ../mlf/wintri.mlf -t 250.0 150.0 1000.0 -s stats -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm11 ../dictionary/triphones1 , HERest -B -C ../proto/configtr.txt -I ../mlf/wintri.mlf -t 250.0 150.0 1000.0 -s stats -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm12 ../dictionary/triphones1 . Příznakem -s stats zajistíme vygenerování souboru, který nese statistiky o počtech výskytu jednotlivých trifonů v trénovacích datech.
3.11
Tvorba trifonů se sloučenými stavy
V předchozím kroku jsme vytvořili sadu trifonových modelů HMM. V posledním kroku vytvoříme z některých trifonových stavů shluky, přičemž stavy v těchto shlucích budou sdílet podobné vlastnosti. K vytvoření shluků použijeme binární rozhodovací stromy, které jsou založeny na otázkách o levém a pravém kontextu každého trifonu. Nejdříve spustíme funkci HDMan, přičemž jako vstup ji předáme slovník beep, který by měl obsahovat slova pokrývající všechny požadované trifony 16 : 15
HTK totiž z těchto hlásek nevytvořilo trifony, které by obsahovaly krátkou nebo dlouhou pauzu. 16 Nemělo by se jednat o slovník, který byl použit při trénování.
11-28
2009/11 – 4. 3. 2009
HDMan -b sp -n fulllist -g ../dictionary/global.ded -l flog beep-tri ../dictionary/beep . Tímto příkazem vytvoříme dva soubory fulllist a beep-tri. V textovém editoru vytvoříme nový soubor fulllist1, kam zkopírujeme obsah souboru fulllist a obsah souboru dictionary/triphones1. Ze souboru fulllist1 odstraníme duplicitní záznamy. To můžeme udělat například skriptem v jazyce Perl, který je uložen na stránkách VoxForge17 . perl fixfulllist.pl fulllist1 fulllist . Vzniklý soubor fulllist je tak připraven k dalšímu zpracování. Nyní si připravíme konfigurační soubor s binárními rozhodovacími stromy tree.hed. Do adresáře hmm12 si zkopírujeme soubor quests.hed, který je uložen pod cestou RMHTK/lib. Adresáře RMHTK a HTKTutorial jsou ve stejném bloku s příklady. Soubor quests.hed obsahuje seznam možných otázek, které budeme pro naše shlukování potřebovat. Dále si vytvoříme seznam všech příkazů, které budou sloužit ke shlukování stavů. Tento soubor vygenerujeme skriptem v jazyce Perl mkclscript, který je uložen na adrese RMHTK/perl scripts/mkclscript.prl: perl mkclscript.prl TB 350.0 ../dictionary/monophones1 > tree1 . Výstupem tohoto skriptu je soubor tree1. Nyní již můžeme vytvořit skript tree.hed spojením a drobnou modifikací souborů quests.hed a tree1 tak, jak je tomu v příkladě níže: RO 100.0 ../hmm11/stats TR 0 QS QS QS QS ... QS QS QS
"R_NonBoundary" "R_Silence" "R_Stop" "R_Nasal"
{ { { {
*+* } *+sil } *+p,*+pd,*+b,*+t,*+td,*+d,*+dd,*+k,*+kd,*+g } *+m,*+n,*+en,*+ng }
"L_w" "L_y" "L_z"
{ w-* } { y-* } { z-* }
TR 2
17
Tento skript je dostupný na adrese : http://www.voxforge.org/uploads/LU/Di/LUDii uUSzS weNNPpU-6iQ/fixfulllist pl.txt
11-29
2009/11 – 4. 3. 2009
TB 350.0 TB 350.0 TB 350.0 ... TB 350.0 TB 350.0
"ST_sil_2_" {("sil","*-sil+*","sil+*","*-sil").state[2]} "ST_ax_2_" {("ax","*-ax+*","ax+*","*-ax").state[2]} "ST_sp_2_" {("sp","*-sp+*","sp+*","*-sp").state[2]} "ST_em_4_" {("em","*-em+*","em+*","*-em").state[4]} "ST_a_4_" {("a","*-a+*","a+*","*-a").state[4]}
TR 1 AU "fulllist" CO "tiedlist" ST "trees" . Poslední příkaz musí být opět ukončen novým řádkem. Shluky trifonů nyní vytvoříme příkazem: HHEd -B -H macros -H hmmdefs -M ../hmm13 tree.hed ../dictionary/triphones1 > log . Tímto příkazem vytvoříme v adresáři hmm13 nové modely HMM a v adresáři hmm12 soubor tiedlist, log a trees. V tomto okamžiku jsme vytvořili i modely pro trifony, které nebyly původně zastoupeny v trénovacích datech. To je velká výhoda shlukování, jelikož je velmi obtížné získat trénovací data, kde by byly zastoupeny všechny požadované trifony. Díky binárním fonetickým rozhodovacím stromům si tak můžeme položit otázky, které se týkají každé části nezastoupeného trifonu. Výsledkem toho dotazování jsou pak tři shluky, které dohromady tvoří požadovaný trifon. Nakonec modely ještě dvakrát přetrénujeme: HERest -B -C ../proto/configtr.txt -I ../mlf/wintri.mlf -t 250.0 150.0 1000.0 -s stats -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm14 ../hmm12/tiedlist HERest -B -C ../proto/configtr.txt -I ../mlf/wintri.mlf -t 250.0 150.0 1000.0 -s stats -S ../scripts/train.scp -H macros -H hmmdefs -M ../hmm15 ../hmm12/tiedlist .
11-30
2009/11 – 4. 3. 2009
3.12
Testování modelů HMM pro *.wav soubory
V této fázi máme již připravené trifonové modely HMM k rozpoznávání. Rozpoznávání může probíhat buď pro reálné soubory dat, nebo pro testovací data (náš případ). Před samotným testováním se ještě ujistíme, zda slovník dictionary/dict obsahuje tyto záznamy: SENT-END [] sil SENT-START [] sil
.
Pokud tomu tak není, tak je do slovníku doplníme. Dále vytvoříme adresář test, do kterého se přesuneme. Zde spustíme příkaz: HVite -H ../hmm15/macros -H ../hmm15/hmmdefs -S ../scripts/test.scp -l ’*’ -i recout.mlf -w ../grammar/wdnet -p 0.0 -s 5.0 ../dictionary/dict ../hmm12/tiedlist . Tím se nám vytvoří soubor recout.mlf, který obsahuje slovní překlad testovacích dat. Soubor rovněž informuje o časových okamžicích, ve kterých se slova vyskytují. Příklad tohoto souboru může být takový: #!MLF!# "*/..\data\TEST\DR1\FAKS0\SA1.rec" 5800000 8200000 SHE -1765.885986 8200000 10600000 HAD -1938.722778 10600000 11800000 YOUR -1024.345825 11800000 14900000 DARK -2574.495850 14900000 18100000 SUIT -2576.625488 18100000 19600000 IN -1293.957520 19600000 19900000 A -264.362701 19900000 24000000 GREASY -3343.672363 24000000 28200000 WASH -3111.687500 28200000 32200000 WATER -3073.211426 32200000 34400000 ALL -1712.456177 34400000 38200000 YEAR -2724.031982 . "*/..\data\TEST\DR1\FAKS0\SI943.rec" 6700000 11900000 PRODUCTION -4369.475586 11900000 12800000 IN -730.948730 12800000 14300000 MAY -1164.452881 14300000 17800000 FALL -2664.805664 17800000 21200000 FAR -2789.683594 11-31
2009/11 – 4. 3. 2009
21200000 25000000 BELOW -2883.899170 25000000 36500000 EXPECTATIONS -9116.680664 . ... . V případě, že bychom chtěli změnit seznam rozpoznávaných slov, stačí jen upravit soubor grammar/gram a zopakovat bod 3.3.
3.13
Zhodnocení rozpoznávače
V posledním kroku zjistíme úspěšnost rozpoznávače. K tomu budeme potřebovat seznam testovacích vět promptlisttest.txt, který vytvoříme stejně jako seznam vět trénovacích v bodě 3.5. Takový seznam může vypadat např. takto: ..\data\TEST\DR1\FAKS0\SA1 SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR ..\data\TEST\DR1\FAKS0\SI943 PRODUCTION MAY FALL FAR BELOW EXPECTATIONS ..\data\TEST\DR1\FAKS0\SX133 PIZZERIAS ARE CONVENIENT FOR A QUICK LUNCH ..\data\TEST\DR1\FAKS0\SX313 DROP FIVE FORMS IN THE BOX BEFORE YOU GO OUT . Z tohoto seznamu vytvoříme soubor testref.mlf skriptem v jazyce Perl: perl ../mlf/prompts2mlf testref.mlf promptlisttest.txt . Výsledek rozpoznávání pak již zjistíme příkazem: HResults -I testref.mlf ../hmm12/tiedlist recout.mlf . Výstupem tohoto příkazu mohou být například následující řádky: ====================== HTK Results Analysis ======================= Date: Tue Sep 30 22:53:56 2008 Ref : testref.mlf Rec : recout.mlf ------------------------ Overall Results -------------------------SENT: %Correct=0.00 [H=0, S=4, N=4] WORD: %Corr=91.18, Acc=79.41 [H=31, D=1, S=2, I=4, N=34] =================================================================== . 11-32
2009/11 – 4. 3. 2009
V části Overall Results můžeme vyčíst některé statistiky. Řádek začínající slovem SENT: nám udává přesnost rozpoznání vět jako celků. V tomto případě nebyla ani jedna věta rozpoznána přesně, jelikož v každé došlo alespoň k drobné chybě. Řádek začínající slovem WORD: udává přesnost rozpoznání jednotlivých slov. Přesnost na úrovni slov je 91,18 %, přičemž proměnná D udává počet chyb vzniklých umazáním slova, proměnná S počet chyb vzniklých substitucí a proměnná I počet chyb vzniklých nesprávným přidáním slova. Proměnná N udává počet všech slov a proměnná H počet správně rozpoznaných slov. Proměnná Acc udává přesnost s ohledem na chyby vzniklé nesprávným přidáním slova, což je v našem případě 79,41 %.
3.14
Další vylepšení
V tomto popisu šlo především o to, vytvořit jednoduchý trifonový rozpoznávač, na kterém bychom vysvětlili základní použití modulu HTK a postup při tvorbě trifonových modelů HMM. Úspěšnost rozpoznávače je v našem případě 79,41 %, přičemž ji můžeme dále zvýšit. Obecně se doporučuje používat při trénování co největší objem trénovacích dat. Dobrý rozpoznávač tak může být natrénovaný až na desítkách hodin řeči. Nicméně problém nastává při získávání tak dlouhých nahrávek. To je dosti časově náročná a také nákladná práce. Můžeme například nahrávky pořídit z rozhlasu či televize při vysílání zpravodajských pořadů, nicméně tyto nahrávky nejsou tak kvalitní jako nahrávky, které byly pořízené v bezodrazové komoře, což může být nežádoucí při využití rozpoznávače pro syntézu řečového signálu. Na druhou stranu, někdy jsou příliš kvalitní nahrávky nežádoucí, protože neobsahují šumový signál pozadí a znějí nepřirozeně. Jestliže máme trénovací data již předem označena, můžeme místo metody flat start použít při inicializaci modelů HMM tzv. bootstrap. To rovněž zvýší přesnost rozpoznávače, nicméně k tomu, aby byla data správně označena, potřebujeme odborníky, kteří se touto problematikou zabývají. Označit několik hodin zvukových souborů je časově velmi náročné a dnes se tato metoda již příliš nevyužívá.
4
Přehled programů modulu HTK
Modul HTK obsahuje několik desítek programů, které slouží k trénování modelů HMM, rozpoznávání, adaptaci, k tvorbě jazykových modelů atd. Níže je uveden stručný přehled programů a jejich funkcí dostupných v modulu HTK verze 3.4 [3]. Nápovědu k těmto programům je možné obdržet zadáním názvu do příkazové řádky, 11-33
2009/11 – 4. 3. 2009
nebo vyhledáním v části HTK Book, kde je rovněž podrobnější popis práce s těmito programy. Název programu
Funkce
Cluster
Slouží ke statistickému shlukování slov do deterministických tříd. Konvertuje vstupní soubory reprezentující jazykové modely do několika různých formátů a vrací standardní HTK mřížku. Vypočítává střední hodnoty a kovarianční matice z množiny trénovacích dat. Provádí konverzi formátu vstupních dat (nejčastěji z dat vypočítává parametry). Vytváří slovník fonetické transkripce, čitelný v modulu HTK, z několika zdrojů. Rozpoznávač využívající velký slovník. Přepočítává parametry sady HMM pomocí BaumovaWelchova algoritmu. Skripty ovládaný editor, který modifikuje sady HMM. Provádí inicializaci jednotlivých modelů HMM na základě posloupností pozorování. Jednoduchý editor určený k práci se soubory, které označují nahrávky. Vypíše zdrojová data ve formátu podporovaným modulem HTK. Slouží ke kopírování jazykových modelů, během kterého může dojít k různým modifikacím. Načítá mřížky a provádí nad nimi různé operace. Vypočítává různé statistiky, které se využívají při analýze akustických trénovacích dat, nebo při tvorbě jednoduchých jazykových modelů. Slouží k přetrénování sady modelů HMM, při kterém využívá rozdílná trénovací kritéria. Generuje sítě slov z textových dat, která obsahují různá pravidla. Vytváří tabulky zpracovatelné moduly HTK, které obsahují kódové knihy, z nichž každá odpovídá jednomu datovému toku.
HBuild HCompV HCopy HDMan HDecode HERest HHEd HInit HLEd HList HLMCopy HLRescore HLStats
HMMIRest HParse HQuant
11-34
2009/11 – 4. 3. 2009
HRest HResults HSGen HSLab HSmooth HVite LAdapt LBuild LFoF LGCopy LGList LGPrep LLink LMerge LNewMap LNorm LPlex LSubset
5
Přepočítává parametry jednotlivých modelů HMM pomocí Baum-Welchova algoritmu. Program sloužící k analýze rozpoznávače. Načítá síť slov ve standardním SLF formátu a na základě této sítě generuje náhodné věty. Interaktivní editor sloužící ke značení zvukových souborů. Vyhlazuje Gaussovské směsi kontextově závislých nebo diskrétních modelů HMM. Viterbiho rozpoznávač pracující na úrovni slov. Adaptuje existující jazykový model z dodaných textových dat. Načítá jeden nebo více souborů s gramatikou a generuje nebo aktualizuje jazykový model založený na více gramatikách. Načítá jeden nebo více souborů s gramatikou a generuje FoF (Frequency-of-Frequency) soubor. Kopíruje jeden nebo více souborů s gramatikou do jedné nebo více sad výstupních souborů. Vypisuje obsah souborů s gramatikou pro jazykové modely. Prohledává textové soubory určené k trénování jazykových modelů a generuje sady gramatik. Vytvoří soubor s odkazy potřebnými k práci s jazykovými modely. Kombinuje jazykové modely a vytváří model určený pro specifický slovník. Generuje prázdné slovní mapy vhodné pro použití s programem LGPrep. Normalizuje jazykové modely. Vypočítává složitost ze slovníkových statistik užitím jednoho nebo více jazykových modelů. Porovnává slovní mapy s mapami tříd a vytváří novou mapu slov, která obsahuje slova z mapy tříd.
Oblasti využití modulu HTK
Modul HTK byl vyvinut především k rozpoznávání spojité řeči nebo izolovaných slov, nicméně během několika let vývoje se z tohoto souboru programů stal velmi účinný nástroj správy modelů HMM, a proto se modul HTK začal nasazovat i v ji-
11-35
2009/11 – 4. 3. 2009
ných oblastech, kde se skryté Markovovy modely využívají. Ne vždy je ovšem výhodné použít tento dosti komplikovaný modul. Příkladem může být rozpoznávání statických obrazů, kde stačí použít jednodušší metody.
5.1
Zpracování řeči
V poslední době se vyvíjí software, který by byl schopen automaticky vygenerovat titulky k mluvené řeči nebo videozáznamu. Jisté úspěchy byly zaznamenány při nasazení těchto programů na různé projevy či diskuze např. z parlamentu, Evropského soudu atd. Takový program může například na základě obličeje mluvčího a jeho prozodických charakteristik zjistit z databáze jeho jméno a dále může k tomuto jménu přikládat jeho přeloženou pasáž v řečové nahrávce. Tyto systémy jsou dnes schopny pracovat i v reálném čase [15]. Automatické vytváření titulků má i velké uplatnění v různých databázových systémech, kde můžeme na základě různých hesel vyhledávat v nahrávkách určité pasáže, které nás zajímají, a nemusíme tak přehrávat celé sekvence. Toho chce v budoucnu využívat např. společnost Google Inc., která by v nahrávkách umístěných na Internetu vyhledávala stejně jako v textových souborech [16]. Další oblastí, kde se modul HTK využívá, je analýza prozodie. Tato analýza se například používá v jazykových výukových systémech, kde systém přehraje nahrávku a člověk vyslovenou frázi znovu zopakuje. Systém pak zaznamenanou řeč analyzuje a rozhoduje se, zdali byla použita správná intonace, správný přízvuk atd. Na základě těchto informací pak může vyzvat studenta k zopakování fráze nebo upozorní, kde dělá student chybu [17]. Podobně se mohou chovat i programy, které slouží jako pomůcky pro logopedy. Jestliže jsme schopni analyzovat prozodii, můžeme na základě změn hlavních suprasegmentálních rysů (kmitočet základního tónu, intenzita a trvání řeči) určovat emoce řečníka, jako např. strach, úžas, neutralitu atd. [18]. Stejně tak můžeme na základě těchto prozodických vlastností zjišťovat, o kterého řečníka se jedná. Toho se může využívat v různých identifikačních systémech [19]. Podobné principy může rozpoznávač také využívat k detekci řečové aktivity. Trifonové rozpoznávání lze s výhodou využít k syntéze řečového signálu. Každý kontext trifonů je jedinečnou akustickou realizací hlásky nebo více hlásek. Znamená to, že každé dvě realizace, které jsou z artikulačního a fonetického hlediska stejné, se zde považují za různé. Pomocí trifónů se můžeme dostat na nejjemnější možnou reprezentaci řeči, nicméně k tomu je potřeba např. v českém jazyce teoreticky až 403 trifonů (některé kombinace nejsou možné, např. znělá vedle neznělé, takže se 11-36
2009/11 – 4. 3. 2009
počet značně snižuje). Z hlediska syntézy a rozpoznávání je pak vhodné, aby se trifon v množině řečových dat vyskytoval několikrát. To však klade velké nároky na rozsáhlost řečového korpusu. Proto se používá již dříve zmíněná metoda shlukování, která tento potřebný rozsah významně redukuje [2]. Po vytvoření trifonového inventáře můžeme poměrně dobře modelovat přirozenou řeč. Existuje nástroj HMM-based Speech Synthesis System (HTS), který je rozšířením modulu HTK. Tento nástroj slouží k tvorbě inventářů řečových jednotek z korpusu a následné syntéze řečového signálu [20].
5.2
Zpracování obrazu
I když byl zprvopočátku modul HTK určen především ke zpracování řeči, používá parametrickou reprezentaci dat, a tudíž je v podstatě jedno, jestli modely HMM trénujeme na sadě parametrů vypočítaných z dat akustických nebo obrazových. Takové netradiční použití modulu HTK je např. při rozpoznávání gest. V tomto případě snímají systémy pohyb předmětu a na základě křivek, které předmět při pohybu kopíruje, provádí různé operace. Toho lze například využít u tzv. bezdotykového psaní nebo kreslení. V tomto případě uložíme systému, který objekt má sledovat, např. konec prstu nebo červený míček. Systém pak pohyb tohoto objektu snímá a, v případě kreslení, převádí přímo do křivek v některém grafickém editoru, nebo v případě psaní rozpoznává, která písmena pohyb kopíruje [21], [22]. Vícestavové modely HMM se mohou nasadit k odezírání ze rtů. Jestliže si totiž rozdělíme videosekvenci, při které došlo k vyslovení některé hlásky, na určitý počet snímků, pak můžeme snímky přidělit jednotlivým stavům modelu HMM, a na základě posloupnosti snímků rozhodnout, o jakou hlásku se jedná. V podstatě sledujeme, v jaké poloze se ústa řečníka na snímku nachází [23]. Modul HTK je možné rovněž využít k rozpoznávání statických obrazů. Příkladem mohou být různé programy OCR (Optical Character Recognition), které rozpoznávají tištěné nebo psané písmo [24], [25]. Na stejném principu pracují i systémy rozpoznávající noty [26].
5.3
Další možné využití
Jak již bylo v kap. 5.2 řečeno, modul HTK lze nasadit kdekoliv, kde se používá parametrický popis dat. Tudíž se může používat i v genovém inženýrství, robotice, ekonomice a všude jinde, kde se modely HMM aplikují [27].
11-37
2009/11 – 4. 3. 2009
Závěr Modul HTK je soubor programů, které jsou určeny k práci se skrytými Markovovými modely. Původně byl tento nástroj navržen k rozpoznávání spojité řeči, nicméně díky tomu, že dokáže pracovat s parametrickým popisem dat, začal se nasazovat i v jiných oblastech, jako např. při analýze prozodie řečníka, při tvorbě inventáře řečových jednotek pro syntézu řeči, při zpracování obrazových dat atd. Modul HTK je možné použít ve všech fázích návrhu rozpoznávače řeči. Může vypočítávat parametry ze zvukových dat, dokáže pracovat se slovníkem fonetické transkripce, vytváří strukturu modelu HMM, inicializuje a trénuje modely, shlukuje a svazuje trifony, rozpoznává řečové nahrávky a analyzuje přesnost rozpoznávání. Značná část programů je také určena k práci s jazykovými modely. Článek byl vytvořen při práci na grantovém projektu GAČR reg. č. 102/07/1303 a výzkumném záměru MSM 0021630513.
Reference [1] HTK Speech Recognition Toolkit [online]. 2007. URL: . [2] MATOUŠEK, J. Syntéza řeči z textu s využitím statistického přístupu k automatickému vytvoření databáze řečových jednotek: ARTIC – český TTS systém. Katedra Kybernetiky, ZČÚ, Plzeň, 2000. 164 stran. [3] YOUNG, S., et al. The HTK Book. Cambridge University Engineering Department, 2006. 359 pages. [4] ČERNOCKÝ, J. Zpracování řečových signálů. Elektronická skripta FIT VUT v Brně. 2006, 129 pages. URL: . [5] BATŮŠEK, R. Czech SAMPA [online]. Praha: ČVUT, 2003. URL: . [6] Tutorial: Create Acoustic Model – Manually. VoxForge, 2008. URL: . [7] ESPOSITO, A. Mini–Tutorial for Building a Basic Small–Vocabulary Continuous Speech Recognizer Using HTK. Caserta, Italy, 2006. 38 pages. 11-38
2009/11 – 4. 3. 2009
[8] GAROFOLO, J., et al. DARPA TIMIT Acoustic-Phonetic Continuous Speech Corpus CD-ROM: NIST Speech Disc 1–1.1. Gaithersburg: U. S. Department of Commerce, 1993. 79 pages. [9] Cygwin Information and Installation. c2008 [cit. 6. 10. 2008]. URL: . [10] ActivePerl – The complete and ready-to-install Perl distribution [online]. ActiveState Software Inc., c2008. URL: . [11] Windows: Download Cygwin, HTK, Julius and Audacity [online]. VoxForge, 2008. URL: . [12] TSOURAKIS, N. ARPABET List [online]. [2002]. URL: . [13] CUCCHIARINI, C., STRIK, H. Automatic Phonetic Transcription: An overview [online]. University of Nijmegen, Netherlands, 2003. 4 s. URL: . [14] KRČMOVÁ, M. Fonetika [online]. Brno: Filosofická fakulta MU, 2007. URL: . [15] SUBHRANSU, M. Fast Automatic Alignment of Video and Text for Search/Names and Faces [online]. University of California at Berkeley, 2007. 8 s. URL: . [16] Google Audio Indexing [online]. 2008. URL: . [17] TOSHIFUMI, O., ATWELL, E. Using the HTK speech recogniser to analyse prosody in a corpus of German spoken learners’ English [online]. School of Computing, University of Leeds, 2003. 8 pages. URL: . [18] VLASENKO, B., WENDEMUTH, A. Tuning Hidden Markov Model for Speech Emotion Recognition. Cognitive Systems Group, IESK, Otto von Guericke University, 2007. 2 pages. URL: .
11-39
2009/11 – 4. 3. 2009
[19] McKENNA, J. Building a Simple Speaker Identification System. School of Computing, Dublin City University, 2004. 6 pages. URL: . [20] HMM-based Speech Synthesis System (HTS) [online]. Department of Computer Science and Engineering, Nagoya Institute of Technology, 2008, 31. 7. 2008. URL: . [21] Touchless SDK. CodePlex – Open Source Project, 2008. URL: . [22] PERRIN, S., et al. Gesture Recognition Using Laser-Based Tracking System. University of Tokyo, Ishikawa Hashimoto Laboratory, 2004. 6 pages. URL: . [23] CHEE YAU, W. Cluster Analysis K–means. School of Electrical and Computer Engineering, RMIT University, 2006. 17 pages. URL: . [24] KHORSHEED, M. S. Offline Recognition of Omnifont Arabic Text Using the HMM ToolKit (HTK). Elsevier Science Inc., 2007. 8 pages. URL: . [25] DOMÉNECH, J., et al. An off-line HTK-based OCR System for Isolated Handwritten Lowercase Letters [online]. Instituto Tecnologico de Informatica, Departamento de Sistemas Informaticos y Computacion, 2000. 6 pages. URL: . [26] PUGIN, L. Optical Music Recognition of Early Typographic Prints using Hidden Markov Models [online]. Music Technology Area, Schulich School of Music, McGill University, 2006. 4 pages. URL: . [27] KIM, J. A Study on Dicodon-oriented Gene Finding using Self–Identification Learning. School of Knowledge Science, Japan Advanced Institute of Science and Technology, 2000. 57 pages. URL: .
11-40
2009/11 – 4. 3. 2009
[28] MATOUŠEK, J., TIHELKA, D., PSUTKA, J. Automatic Segmentation for Czech Concatenative Speech Synthesis Using Statistical Approach with Boundary-Specific Correction. [online]. In Proceedings of the 8th European Conference on Speech Communication and Technology EUROSPEECH 2003. Ženeva, Švýcarsko, 2003. pp. 301-304. URL: .
Seznam symbolů, veličin a zkratek A
matice přechodových pravděpodobností
aij
pravděpodobnost přechodu ze stavu si do stavu sj
bj (ot )
funkce rozdělení výstupní pravděpodobnosti
EM
(Expectation Maximization) algoritmus maximální pravděpodobnosti
FoF
(Frequency-of-Frequency) změna kmitočet - kmitočet
fvz
vzorkovací kmitočet [Hz]
HMM
(the Hidden Markov Models) skryté Markovovy modely
HTK
(Hidden Markov Model Toolkit) modul pro práci se skrytými Markovovými modely
HTS
(HMM–based Speech Synthesis System) systém syntézy řeči s HMM
LPC
lineární predikční koeficienty
MFCC (Mel-Frequency Cepstral Coefficients) melovské kepstrální koeficienty MLE
(Maximum Likehood Estimation) odhad s maximální pravděpodobností
MLF
(Master Label File) nadřazený (hlavní) značkový soubor
O
posloupnost vektorů pozorování
OCR
(Optical Character Recognition) optické rozpoznání písmene
ot
vektor pozorování
PLP
(Preceptual Linear Prediction) percepční lineární predikční koeficienty
Sˆi
symbol vektoru pozorování 11-41
2009/11 – 4. 3. 2009
sj
stav skrytého Markovova modelu
sil
(Silence) dlouhá pauza
SLF
(HTK Standard Lattice Format) HTK standardní mřížkový formát
sp
(Short Pause) krátká pauza
TIMIT Texas Instruments/Massachusetts Institute of Technology URL
(Uniform Resource Locator) doménová adresa serveru
wi
slovo, difón, trifón apod.
WLR
(Word Link Record) záznam pro navázání slov
αj (t)
dopředná (forward) pravděpodobnost
βj (t)
zpětná (backward) pravděpodobnost
11-42