České vysoké učení technické v Praze Fakulta elektrotechnická
Předzpracování řeči s šumovým pozadím pro účely komunikace a rozpoznávání Diplomová práce
Vypracoval: Petr Fousek Vedoucí práce: Ing. Petr Pollák, CSc. Rok obhajoby: 2002
Čestné prohlášení Prohlašuji, že jsem diplomovou práci vypracoval samostatně a uvedl veškerou použitou literaturu. Nemám námitek proti půjčování práce se souhlasem katedry a proti zveřejnění práce nebo jejích částí.
Obsah 1 Úvod
2
2 Metody parametrizace řečového signálu 2.1 Standardní parametrizace . . . . . . . . . . . . . . . . . . . . . . . 2.2 Lineární prediktivní kódování pro robustní parametrizaci . . . . . 2.2.1 Spektrální odečítání . . . . . . . . . . . . . . . . . . . . . . 2.2.2 Rozšířené spektrální odečítání . . . . . . . . . . . . . . . . . 2.2.3 Převod autoregresních koeficientů na kepstrální koeficienty 2.3 Robustní parametrizace melovskou bankou filtrů . . . . . . . . . . 2.4 Robustní PLP parametrizace . . . . . . . . . . . . . . . . . . . . . 2.5 Sloučení parametrizací . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
4 4 5 7 9 10 12 13 15
3 Implementace 3.1 Implementace metod spektrálního odečítání . 3.1.1 Inicializace programu . . . . . . . . . 3.1.2 Jeden krok spektrálního odečítání . . 3.2 Implemetace parametrizačních metod . . . . 3.2.1 LPC parametrizace — cep . . . . . . 3.2.2 Parametrizace melovskou bankou filtrů 3.2.3 PLP parametrizace — plp . . . . . . 3.3 CtuCopy z hlediska uživatele . . . . . . . . . . 3.3.1 Příklad použití . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
18 22 23 23 25 25 28 30 32 36
. . . . . . . . . . — . . . . . .
. . . . . . . . . . . . . . . mel . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
4 Experimenty
37
5 Závěr
41
1
Kapitola 1
Úvod Systémy pro rozpoznávání souvislé řeči, založené na dnes již klasickém principu skrytých Markovových modelů (dále jen HMM - Hidden Markov models), existují od poloviny sedmdesátých let. Přestože je jejich vývoji od té doby věnováno stále se zvětšující úsilí, není možné proces rozpoznávání dosud považovat za uspokojivě zvládnutý, zvláště pokud pracujeme se signály obsahujícími různé formy rušení, např. řeč v jedoucím automobilu, mobilní telefonie, či řeč rušená nedokonalostmi přenosové cesty ještě v analogové formě – pevná telefonie. Proces rozpoznávání mluvené řeči založený na HMM lze rozdělit na dva základní kroky. Prvním je předzpracování vstupního řečového signálu - parametrizace, při které se ze vstupních dat, vzniklých navzorkováním řečového signálu a obsahujících kromě čistého řečového signálu i šumové pozadí, snažíme extrahovat informaci popisující pouze promluvu ve formě vhodné pro vstup druhého kroku rozpoznávání, vlastní klasifikace do vhodných kategorií. Celková úspěšnost rozpoznávání pak závisí jak na kvalitě klasifikátoru, tak na kvalitě předzpracování. Tato práce se zabývá pouze prvním krokem rozpoznávání, robustním předzpracováním řeči se šumovým pozadím pro účely komunikace a rozpoznávání. Standardní parametrizační metody vycházejí z toho, že signál není degradován přítomností rušení a nezabývají se jeho potlačováním. Pokud je však rušení příliš velké, může docházet k selhávání parametrizačních metod nebo obecně k selhání rozpoznávání. V takovém případě je třeba použít robustní parametrizaci, která vliv rušení omezí nebo zcela potlačí. Metod na potlačování šumu v řečovém signálu existuje celá řada. Účinné jsou vícekanálové metody, kde se využívá vysoké korelovanosti řeči a nízké korelovanosti rušení v jednotlivých kanálech, směrovosti užitečné složky signálu a dalších specifik vícekanálových metod, na jejichž principu je rušení potlačováno. K tomu je však potřeba snímání více mikrofony na různých místech a celé řešení je tak komplikovanější a dražší, v některých případech dokonce nerealizovatelné. Cílem této diplomové práce je navrhnout a implementovat takovou robustní parametrizaci, kterou bude možno nahradit standardní parametrizaci používanou v systému HTK [2], aniž by bylo nutno stávající rozhraní navazujících bloků jakkoliv upravovat. Vstupem tedy bude zdigitalizovaný jednokanálový řečový signál obsahující navíc rušení, výstupem bude parametrický popis přítomným rušením co nejméně ovlivněný. Algoritmy budou implementovány v jazyce C++ a budou tvořit jeden spustitelný program typu filtr, který bude podporovat několik formátů vstupních dat a několik formátů výstupního parametrického popisu. Alternativním výstupem programu bude řečový signál s potlačeným šumem, zapsaný v jednom ze vstupních formátů. Řetězec základních funkčních bloků parametrizace bude sestaven a konfigurován na základě parametrů příkazového řádku. Zpráva je rozdělena na několik kapitol. První kapitola shrnuje teoretický základ, nutný pro další výklad. Popisuje principy použitých metod na zvýrazňování řeči a parametrizaci, vysvětluje vzájemné souvislosti. Důraz při výkladu je kladen zejména na vlastnosti specifické pro 2
KAPITOLA 1. ÚVOD
3
implementaci. Druhá kapitola se zaměřuje na techniku implementace všech dříve uvedených metod do programu. Cílem je osvětlit způsob implementace v jazyce C++ tak, aby byl patrný přechod od teoretického odvození principů metod k jejich přímému použití v praxi, kdy je potřeba zohlednit požadavky na rychlost výpočtu a uvážit další režii, spojenou se správným chodem kompletního programu. Hloubka výkladu je volena tak, aby mohl sloužit rovněž jako orientační návod k implementaci podobných výpočetních struktur. Poslední část kapitoly se dívá na program z hlediska uživatele, rozebírá možnosti konfigurace výpočtu prostřednictvím parametrů příkazového řádku a uvádí příklady použití.
Kapitola 2
Metody parametrizace 2.1
Standardní parametrizace
Následující příklad standardně používané LPC parametrizace poslouží k vysvětlení základních kroků procesu předzpracování a k popisu obecně používaných metod. Hammingovo okno x [n]
x’ [n]
R [k]
a [k]
LPC
autokorelace
c [k]
a
c
Obr. 2.1: Standardní LPC parametrizace
Vstupem algoritmu na obr. 2.1 je zdigitalizovaný řečový signál x[n]. Zatím budeme pro jednoduchost předpokládat, že neobsahuje rušení. Parametry digitalizace odpovídají požadavkům na popis řečového signálu, tedy vzorkovací frekvence je 8kHz – 16kHz a kvantování 16 bitů. Prvním krokem je segmentace signálu a váhování. Vzdálenost jednotlivých segmentů je volena s ohledem na to, že řečový signál je tvořen v prvním přiblížení stacionárními úseky s délkou 5 – 100ms [1]. Délka segmentu bývá větší než jejich vzájemná vzdálenost, a to z několika důvodů. Hlavním důvodem překryvu jsou vlastnosti váhování, viz níže, a dalším důvodem je to, že segmentace po fixních intervalech není synchronní se stacionárními úseky signálu. Celý následující algoritmus vychází ze spektrální analýzy řečového signálu. Protože však máme k dispozici jen krátký úsek signálu, je třeba počítat s krátkodobou aproximací spektrální hustoty dané jedinou realizací. Tato realizace je po segmentaci vlastně dána celým vstupním signálem vynásobeným pravoúhlým oknem. Ve spektru to znamená konvoluci spektra signálu a spektra okna a z toho vyplývající nepřesnosti výpočtu [3]. Proto se segment váhuje oknem s vhodnými spektrálními vlastnostmi, např. Hammingovým oknem. Tím je zajištěn dobrý odhad spektrální hustoty segmentu. Časový průběh Hammingova okna , daný vztahem W [n] = 0.54 + 0.46 cos
2πn , N −1
(2.1)
kde N je délka okna a n = 0..N − 1 [1], však potlačuje význam okrajových hodnot, a proto je potřeba segmenty překrývat zpravidla o 50 – 75%. Nyní máme váhovaný segment x0 [n]. Dalším krokem parametrizace je výpočet odhadu autokorelačních koeficientů jako vstupu do autoregresní analýzy, obvykle podle vztahu pro vychýlený 4
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU odhad autokorelace
N −k X ˆ x [k] = 1 R x[n] x[n + k], N n=1
k = 0, 1, ...K,
5
(2.2)
kde K je maximální zpoždění. Pro obvyklé parametry digitalizace vychází délka segmentu 256 vzorků a potřebné maximální zpoždění pro autoregresní analýzu je obvykle 12 vzorků. Zpoždění vzhledem k délce segmentu tedy není větší než 10%, což je podmínka pro chybu odhadu všech potřebných autokorelačních koeficientů menší než 10% [9]. ˆ x [k] vstupují do algoritmu lineárního prediktivního kódování Autokorelační koeficienty R (dále jen LPC – linear predictive coding), kde se vypočtou LPC, přesněji autoregresní koeficienty a[k]1 . Základní myšlenka algoritmu je následující [1]. Každý n-tý vzorek segmentu je možné aproximovat lineární kombinací p předchozích vzorků. Váhovací koeficienty a[k] jsou určeny tak, aby byla minimalizována celková chyba predikce. Blok LPC může být realizován různými algoritmy, obecně se lišícími výslednými LPC koeficienty. Společná vlastnost LPC koeficientů však je, že popisují vyhlazený tvar spektra signálu. Abychom mohli provést dokonalou rekonstrukci původního signálu z LPC koeficientů, museli bychom mít k dispozici příslušný chybový signál, který jediný nese informaci o fázi původního signálu. LPC koeficienty tuto informaci zahazují, což je podstatné pro další výklad. Detailnější rozbor LPC analýzy bude uveden později a zaměří se konkrétně na implementovanou metodu výpočtu. Posledním blokem parametrizace je převod LPC koeficientů a[k] na kepstrální koeficienty c[k]2 . Důvodem k tomuto kroku jsou jejich rozdílné vlastnosti. Oboje koeficienty popisují vyhlazený tvar spektra signálu, ale kepstrální koeficienty, na rozdíl od LPC koeficientů, jsou vzájemně velmi málo korelované, což je výhodné pro algoritmy klasifikace. Kepstrální koeficienty jsou koeficienty Fourierova rozvoje logaritmu amplitudového spektra a pro účely rozpoznávání jsou robustnější a vhodnější. Pro výpočet kepstrálních koeficientů z LPC koeficientů lze odvodit rekurzivní vztah, který bude uveden později. Výše uvedený příklad demonstruje, jak lze parametrizovat digitalizovaný řečový signál standardním postupem, neřešícím problémy dané přítomností rušení. V následujících odstavcích budou postupně popsány metody robustní parametrizace, implementované do výsledného programu.
2.2
Lineární prediktivní kódování pro robustní parametrizaci
V minulém odstavci byla popsána standardní parametrizace pomocí metody lineárního prediktivního kódování – jedné ze základních metod, využívaných k získání parametrického popisu signálu. Abychom mohli navrhnout robustnější parametrizaci, musíme si nejprve lépe objasnit její princip. Tím bude současně definován později implementovaný algoritmus. Hloubka popisu bude taková, aby byly vysvětleny všechny důležité body implementovaného algoritmu. Úlohu nalezení vhodného modelu signálu je možné si představit na základě filtrace, kdy vzorky vstupního signálu představují koeficienty impulsové odezvy lineární časově invariantní soustavy [3]. Z toho plyne, že se kvadrát modulu frekvenční charakteristiky filtru s takovouto impulsovou odezvou shoduje se spektrální hustotou vstupního signálu. Jinými slovy, pokud takovýmto filtrem filtrujeme signál o konstantní spektrální hustotě, dostáváme signál se spektrální hustotou shodnou se spektrální hustotou vstupního signálu:
2
Sx (ejΘ ) = Su (ejΘ ) H(ejΘ ) , 1
(2.3)
rozdíl mezi LPC a autoregresními koeficienty bude vysvětlen v kapitole o lineárním prediktivním kódování pojmem kepstrální koeficienty zde máme na mysli LPC reálné kepstrální koeficienty vypočtené rekurzí z LPC koeficientů 2
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
6
kde S(ejΘ ) je spektrální hustota signálu, u[n] je signál s konstantní spektrální hustotou, x[n] je výstupní signál a H(ejΘ ) je frekvenční charakteristika filtru. Tento proces je označován jako syntéza a příslušný filtr je pak filtr syntetizující. Pro účely zpracování řečového signálu je vhodné hledat přenosovou funkci syntetizujícího filtru ve tvaru [3] H(z) =
G G Pp = , C(z) 1 + k=1 ak z −k
(2.4)
kde G je zisk, C(z) je polynom stupně p a p je řád LPC. Tento model se nazývá autoregresní (AR); protože využívá IIR filtr typu All-poles, modeluje dobře špičky (peaky) ve spektru, což koresponduje s požadavky na zpracování řeči a navíc je určení koeficientů tohoto filtru lineární úloha3 . Schéma generace signálu syntetizujícím filtrem je na obr. 2.2. u [n]
G
x [n]
+ −a[1]
−a[p]
Obr. 2.2: Autoregresní model syntézy Abychom mohli určit koeficienty přenosové funkce, musíme ještě definovat prediktor, resp. predikční chybový filtr. Jeho schéma je na obr. 2.3. x [n]
x^ [n]
x [n−1]
H[z]
−
+
e [n]
+
Obr. 2.3: Schéma prediktoru Prediktor předpovídá (predikuje) hodnotu aktuálního vzorku signálu z p vzorků předcházejících podle vztahu x ˆ[n] = −
N X
a[i] x[n − i],
i−1
kde a[i] jsou koeficienty již zmíněného polynomu A(z). Je to filtr FIR s koeficienty −a[1], −a[2], . . . , −a[p]. Predikční chybový filtr je nadstavbou prediktoru. Jeho výstupem je chyba predikce, daná vztahem e[n] = x[n] − x ˆ[n] =
p X
a[i] x[n − i],
a[0] = 1.
(2.5)
i=0
Ze vztahu 2.5 je patrné, že řád chybového filtru je o jedničku vyšší, než řád prediktoru, nicméně koeficient a[0] je jednotkový a v parametrickém popisu se proto neuvádí. Vztah popisuje proces analýzy, kdy se chybovým, bělícím filtrem snažíme vytvořit ze vstupního signálu dekorelovaný chybový signál s konstantní spektrální hustotou tak, aby informace o spektrálních vlastnostech 3 Metoda LPC se obecně snaží najít přenosovou funkci syntetizujícího filtru ve tvaru racionální lomené funkce, která má polynom v čitateli i jmenovateli. Tento model se jmenuje ARMA - Autoregressive moving average a nalezení koeficientů takovéto přenosové funkce obecně není lineární úloha.
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
7
vstupního signálu zůstala zaznamenána v analyzujícím filtru, odtud název procesu bělení. Hodnoty e[n] by měly aproximovat bílý šum, neboť lze dokázat, že v tomto případě je vstupní signál nejlépe aproximován signálem x ˆ[n] [3]. Je zřejmé, že kvalita aproximace bude úměrná řádu p použitého polynomu. Kritériem pro určení koeficientů a[i] je minimalizace výkonu chybového signálu Pe =
M 1 X e2 [i]. M i=1
(2.6)
Tento požadavek vede na soustavu tzv. normálních rovnic, v našem případě konkrétně na tzv. Yule-Walkerovy rovnice, řešitelné autokorelační metodou. Díky vlastnostem těchto rovnic existují rychlé algoritmy jejich řešení. Do programu CtuCopy byl implementován standardní Levinson-Durbinův algoritmus, založený na Levinsonově rekurzi. Kroky algoritmu je možné nalézt např. v [1], či [3]. Výhodou tohoto algoritmu je, že dává vždy stabilní model; jeho mezivýsledky jsou koeficienty odrazu, které se rovněž používají k parametrickému popisu signálu [2]. Vstupem do Levinson-Durbinova algoritmu jsou autokorelační koeficienty (spočítané podle vztahu 2.2) a požadovaný řád LPC. Výstupem jsou v našem případě autoregresní koeficienty a[n], n = 1 ... p a výsledný výkon chyby predikce Pe po filtraci predikčním chybovým filtrem4 . Odhad spektrální hustoty signálu je určen kvadrátem modulu přenosu filtru s racionálně lomenou přenosovou funkcí, proto je vyhlazený. Kvalita odhadu je u lineární predikce však značně degradována přítomností rušení, ve srovnání s metodami založenými na diskrétní Fourierově transformaci [3], proto je třeba pro získání robustnější parametrizace signál upravit ještě před vstupem do bloku lineární predikce5 . Protože hlavním úkolem této práce je potlačit aditivní šum v řečovém signálu, budou použity metody spektrálního odečítání.
2.2.1
Spektrální odečítání
Spektrální odečítání je založeno na myšlence odečítání spektra šumu od spektra směsi šumu a řeči, které by nebylo možné v časové oblasti provádět. K tomu je ale zapotřebí znát spektrum šumu. Budeme vycházet z předpokladu, že máme k dispozici odhad řečové aktivity v signálu. Pak je snadné určit spektrum šumu v pauze mezi úseky obsahujícími řeč a toto spektrum odečíst. V praxi je však vzhledem k příliš velké chybě tohoto základního přístupu nutné spektrum šumu, získané v pauzách, průměrovat – tj. ke spektrálnímu odečítání používat jeho průbežný odhad. Odtud plyne požadavek na kvazistacionaritu šumu, který je ve většině případů splněn. Odvození spektrálního odečítání bylo uvedeno v [10]. Blokové schéma implementované metody spektrálního odečítání je na obrázku 2.4. Signál x[n] je nejprve segmentován a váhován tak, jak bylo popsáno v kapitole Standardní parametrizace. Následně je pomocí rychlé Fourierovy transformace (dále jen FFT - fast Fourier transform) určena amplitudová a fázová složka spektra segmentu. Amplitudová složka |X[k]| prochází blokem průměrování, kde se provádí průběžný odhad spektra šumu podle vztahu ˆi−1 [k]|. |N i [k]| = p|N i−1 [k]| + (1 − p) |N
(2.7)
Dlouhodobý odhad spektra šumu se odečte od spektra signálu: |Si0 [k]| = |Xi [k]| − b |N i [k]|,
(2.8)
index i popisuje časovou souslednost a b je konstanta, kterou je třeba volit s ohledem na následující usměrnění 6 . Zde se algoritmus dělí na tři varianty: 4
výkon chyby predikce se často uvádí jako jeden z parametrů signálu existují i speciální algoritmy LPC, snižující vliv rušení bez předchozích úprav signálu, ale tato práce se jimi nezabývá 6 pro dvoukrokový algoritmus není konstanta b použita 5
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
8
(a)
x [n]
|X[k]|
segmentace váhování
+
FFT
+
−
(a)
^ |N[k]| prumerování
_
(a)
|N[k]|
VAD < X[k]
(1)
s^ [n]
OLA
iFFT
HW
(a)
^ |S[k]|
(2) FW
FW
FW
(3) + prumerování
Obr. 2.4: Blokové schéma spektrálního odečítání (1) — jednocestné usměrnění, záporné složky spektra jsou vynulovány (2) — dvoucestné usměrnění, u záporných složek spektra je obráceno znaménko (3) — dvoukrokový algoritmus s dvoucestným usměrněním. Po usměrnění následuje průměrování zbytkového šumu a jeho odečítání s dvoucestným usměrněním. V předposledním kroku proběhne inverzní Fourierova transformace (dále jen iFFT - inverse fast ˆ Fourier transform) odhadu amplitudového spektra řeči |X[k]| za použití fáze z původního signálu, čímž získáme odhadovaný segment signálu v časové oblasti. Protože jsme však na začátku algoritmu prováděli segmentaci s překryvem a váhování, je třeba na konci signál vhodně skládat. K tomu poslouží metoda OLA (OverLap Addiction), jež zaručí správnou návaznost segmentů a rovněž výkonovou korekci váhovacího okna [10]. Index (a) ve schématu naznačuje, že celé spektrální odečítání může pracovat nejen s amplitudovým spektrem, ale s jeho obecnou mocninou. Umocnění proběhne hned po výpočtu FFT, před zpětnou transformací se spektrum opět odmocní. Blok s označením VAD na obrázku je detektor řečové aktivity (voice activity detector ), který v každém segmentu odhadne, zda je přítomna řeč, či nikoliv. VAD může získávat informaci buď externě (ruční anotace signálu či obecně nekauzální metoda určení řečové aktivity) – externí
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
9
detektor, anebo z časového průbehu daného segmentu – interní detektor. Pro naše účely bude použit interní kepstrální detektor založený na výpočtu kepstrálních vzdáleností. Pro správnou funkci detektoru je třeba zajistit v inicializační fázi výpočtu, aby vstupní signál obsahoval pouze šum a nikoliv řečový signál, kvůli správné adaptaci odhadu spektra šumu. Kdyby v inicializační fázi byla přítomna řeč, detektor by mohl selhat.
2.2.2
Rozšířené spektrální odečítání
„Klasickéÿ spektrální odečítání, popsané v předchozí kapitole, vyžaduje ke své funkci detektor řečové aktivity. Následující alternativa k spektrálnímu odečítání, rozšířené spektrální odečítání (dále ji budeme označovat zkratkou exten – extended spectral subtraction), detektor řečové aktivity nepotřebuje [14]. Exten vychází z předpokladu, že aditivní šum, přítomný v řečovém signálu, má stacionární charakter. Samotný řečový signál lze považovat za kvazistacionární, tj. z hlediska delšího časového úseku je nestacionární, avšak v relativně krátkých úsecích (viz segmentace v kapitole Standardní parametrizace) ho lze považovat za stacionární. Aditivní šum může mít složky impulzního charakteru, jejichž potlačováním se nebudeme zabývat, a složky stacionární či kvazistacionární. V praktických aplikacích bývá velmi často splněno, že šum je stacionární v delších časových úsecích než řečový signál, což nám umožňuje metodu exten použít. Nebudeme zde uvádět podrobný výklad této metody, který lze nalézt v [6]. Zaměříme se pouze na vlastnosti specifické pro implementaci. Blokové schéma, neobsahující již vstupní segmentaci, převod na spektrum, výstupní převod do časové oblasti a skládání OLA, je zobrazeno na obr. 2.5. Spektrum segmentu
_
|X n[k]|
^ [k]| |N n
Hn [k] +
−
|S n−1[k]|
_
1−p
|Nn [k]|
_
p
|S n[k]| _
−
|Nn−1 [k]| +
prumerování
|S^ n[k]|
Obr. 2.5: Rozšířené spektrální odečítání |Xn [k]| vstupuje do Wienerova filtru označeného Hn , s přenosovou funkcí danou vztahem Hn [k] =
|N n−1 [k]|a |N n−1 [k]|a + |S n−1 [k]|a
!1
a
.
(2.9)
Na výstupu Wienova filtru je odhad spektra šumu aktuálního segmentu. Tento odhad je níže odečten od vstupního spektra signálu, čímž dostáváme výsledný odhad spektra řeči. Klíčovým parametrem je tedy přenosová funkce Wienerova filtru, která je určována zpětnovazebně. Jednak z vyhlazeného odhadu spektra šumu |N n−1 [k]| a jednak z odhadu spektra řeči |S n−1 [k]| vznikajícího odečtením vyhlazeného odhadu spektra šumu od aktuálního vstupního spektra
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
10
(viz schéma). Index malé n označuje čas. Je tedy patrné, že přenosová funkce, využitá pro výpočet odhadu spektra šumu v aktuálním segmentu, je vypočtena na základě průměrovaných minulých hodnot. V první fázi je tedy třeba nejprve určit přenosovou funkci filtru Hn , poté vypočítat odhad aktuálního spektra šumu a pak teprve provést další kroky algoritmu. Podobně jako u „klasickéhoÿ spektrálního odečítání je nutno metodu na začátku inicializovat. S použitím stejného předpokladu jako u spektrálního odečítání, že v inicializační části signálu není obsažena řeč, nastavíme výchozí parametry metody následovně. • přenosová funkce filtru Hn bude jednotková, tj. vstupující první segment bude prohlášen za šum a bude použit k průměrování spektra šumu • hodnoty vyhlazeného odhadu spektra šumu budou inicializovány aktuálním odhadem spektra šumu, tj. vstupním spektrem prvního segmentu • inicializace ostatních hodnot je dána principem metody Z uvedené inicializace vyplývá, že výstupní odhad spektra řeči bude v prvních dvou segmentech nulový, a proto se tyto segmenty nebudou zapisovat na výstup. Z hlediska rozpoznávání to znamená, že parametrický popis bude kratší o první dva segmenty, což ovšem v praxi nepůsobí žádné problémy. Při použití extenu jako zvýrazňovače řeči bude zapojena metoda OLA, jejímž vlivem bude výstupní signál kratší pouze o jeden segment v případě 50% překryvu, resp. o půl segmentu v případě 75% překryvu. Výhoda extenu oproti spektrálnímu odečítání je v tom, že není potřeba detektoru řečové aktivity, výpočet je proto podstatně rychlejší. Exten nepotřebuje na inicializaci garantovaný počet segmentů neobsahující řeč (stačí zde jeden segment), ale na druhou stranu je konvergence metody značně závislá na prvním segmentu, který by měl po spektrální stránce co nejlépe reprezentovat šumové pozadí. Pokud by byla přítomna řeč v prvním segmentu, metoda by mohla selhat.
2.2.3
Převod autoregresních koeficientů na kepstrální koeficienty
V tomto odstavci je potřeba upřesnit, jakým způsobem bude převod autoregresních koeficientů na kepstrální koeficienty probíhat. Standardní rekurentní algoritmus převodu je popsán následujícími vztahy [1],[2],[3]. cm = −am −
X 1 m−1 (m − k) cm−k ak , m k=1
1 ≤ m ≤ p,
p
cm = −
1 X (m − k) cm−k ak , m k=1
m > p;
pro m = 1 ... M,
(2.10)
ve kterých znaménka závisejí na předchozích definicích autoregresního modelu. Když je řád kepstrálního koeficientu m stejný nebo nižší než řád lineární predikce p, výpočet probíhá dle první rovnice. Kepstrální koeficienty vyšších řádů až do potřebného řádu M se dopočítávají podle druhého vztahu. Problematičtější je definice nultého kepstrálního koeficientu c0 , popisující energii segmentu. Ta se v různých pramenech liší. Do programu CtuCopy byla implementována následující definice, shodující se s [1]. c0 = ln σx2 = ln Pe = ln G2
(2.11)
Tento vztah svazuje nultý kepstrální koeficient c0 s výkonem chyby predikce Pe definovaným rovnicí 2.6 a se ziskem LPC predikčního filtru G.
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
11
Nyní máme pro návrh robustní LPC parametrizace k dispozici všechny potřebné bloky. Ještě je však třeba vyřešit návaznost bloku LPC na blok spektrálního odečítání. Výstupem spektrálního odečítání je buď odhad spektra segmentu nebo časový průběh zvýrazněného signálu. Vstupem do bloku LPC jsou autokorelační koeficienty spočítáné pro každý segment. Nabízí se tedy využít přímo přechod ze spektra segmentu na autokorelační koeficienty segmentu s využitím Wiener-Chinčinovy věty. V této souvislosti objasníme i další problémy, související se spektrálním odečítáním, které jsme doposud pomíjeli. Vztah pro diskrétní Fourierovu transformaci, implementovaný v programu CtuCopy, vychází z předpokladu, že neznáme vzorkovací frekvenci, se kterou byl vstupní signál pořízen a je proto definován takto7 : X[k] =
N −1 X
kn
x[n]e−j2π N ,
k = 0 ... N − 1.
(2.12)
n=0
Inverzní Fourierova transformace diskrétního spektra je definována x[n] =
−1 kn 1 NX X[k]ej2π N , N k=0
n = 0 ... N − 1.
(2.13)
Pro optimální výsledky spektrálního odečítání, založeného na segmentaci signálu, váhování a skládání metodou OLA, je vhodné segment signálu doplnit ještě před váhováním nulami na délku až dvojnásobnou, z důvodu interpretace DFT jako konvoluce s dlouhou posloupností [9]. To nebude do programu implementováno, na základě zkušeností, že pro účely zvýrazňování řeči není třeba doplnění nulami provádět. Pokud v dosud probíhající fázi testování programu bude zjištěno, že pro potřeby parametrizace bude vhodné doplňovat segmenty nulami, bude to případně do CtuCopy implementováno v rámci pokračování práce na tomto tématu formou nadcházejícího doktorandského studia. Wiener-Chinčinův teorém pro diskrétní signály konečné délky lze interpretovat s ohledem na přechozí definici DFT a iDFT takto [3]: N X km ˆ x [m] = 1 Pˆx [k]ej2π N , R N k=0
m = 1 ... M,
(2.14)
kde M je řád autokorelace, kterou počítáme, N je rozměr spektra a Pˆx [k] je odhad výkonové spektrální hustoty signálu, daný vztahem 1 ˆ 2 Pˆx [k] = |S[k]| . N
(2.15)
Uvedené definice 2.2, 2.14 a 2.15 zachovávají energetické poměry ve spektru, na rozdíl od definic, uvedených v [1] a v [2] a implementovaných v systému HTK. Protože však k parametrickému popisu potřebujeme hodnoty spočítané až po Levinsonově rekurzi (tj. výkon chyby predikce, autoregresní koeficienty, popř. kepstrální koeficienty), parametrický popis získaný pomocí HTK a pomocí programu CtuCopy se neliší, neboť je možné dokázat, že velikost autoregresních koeficientů definovaných Levinson-Durbinovým algoritmem je nezávislá na měřítku autokorelace. Hodnoty autokorelačních koeficientů, získaných ze vztahu 2.14 jsou shodné s hodnotami spočtenými z definice autokorelace 2.28 . Nyní je tedy možné sestavit blokové schéma prvního řetězce, robustní LPC parametrizace, viz obr. 2.6. Algoritmus můžeme shrnout takto: signál je uvedeným postupem segmentován a 7
tato definice je použita rovněž z důvodů kompatibility se systémem HTK pro získání identických hodnot by bylo nutno segment doplňovat nulami na dvojnásobnou délku, jak bylo výše uvedeno 8
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU x [n]
segmentace váhování
x’ [n]
SO exten
^ |S[k]|
^
iDFT
SO SO s VAD
R x [i]
LPC
a1[n]
12 c1[m]
a
c
none
Obr. 2.6: Robustní LPC parametrizace váhován Hammingovým oknem, dále jeden segment signálu vstupuje do bloku spektrálního odečítání SO, kde se provede dle uvedených vztahů diskrétní Fourierovy transformace převod do spektrální oblasti pomocí algoritmu FFT. Poté následuje buď jedna ze tří variant standardního spektrálního odečítání s detektorem řečové aktivity nebo metoda exten, či žádná z metod9 . Odhad spektra je převeden na odhad výkonové spektrální hustoty. Následuje blok inverzní DFT, kde se získá vhodný počet autokorelačních koeficientů, vstupujících do popsaného bloku linární predikce. Na výstupu LPC získáváme první variantu parametrického popisu, autoregresní koeficienty a výkon chybového signálu. Je možné dále zařadit blok a→c, který převede autoregresní koeficienty na koeficienty kepstrální.
2.3
Robustní parametrizace melovskou bankou filtrů
Druhým navrženým řetězcem metod je robustní parametrizace melovskou bankou filtrů. Parametrizace počítaná přes mel-spektrum je již sama o sobě robustnější, než metoda LPC. Využívá podobnosti se zpracováním řeči lidským sluchem, které je založeno na spektrální analýze. Rozlišovací schopnost sluchu nelineárně klesá s rostoucí frekvencí. Empirické průzkumy ukazují, že při parametrizaci snažící se příbližit modelu lidského vnímání, se účinnost rozpoznávání zvyšuje [2], proto je melovská banka filtrů navržena tak, aby simulovala přizpůsobení sluchu deformací frekvenční osy. Navíc parametrizace realizovaná spektrální bankou filtrů není ovlivněna šumem do takové míry, jako LPC. V případě programu CtuCopy bude celá metoda zkombinována se spektrálním odečítáním, čímž by měla její robustnost vůči šumu vzrůst. Blokové schéma navržené parametrizace je na obr. 2.7. Blok spektrálního odečítání je pouze x [n]
segmentace váhování
x’ [n]
^
SO
|S[k]|
BF (Mel)
SMel [l]
DCT
c [n] SMel [l]
Obr. 2.7: Blokové schéma parametrizace melovskou bankou filtrů naznačen. Na základě parametrů příkazového řádku se použije jedna z metod SO podobně, jako tomu bylo u robustní LPC parametrizace, což nám později umožní sdílení těchto metod ve výsledném programu. Vstupem do banky filtrů (blok BF na obrázku) je amplitudové spektrum segmentu. Výstupem je mel-spektrum. Banka filtrů provede přepočet následujícím způsobem. Frekvenční osa je převedena do melovského měřítka podle vztahu M el(f ) = 2595 log10 (1 +
f ), 700
(2.16)
kde je rozdělena na N stejných intervalů, překrývajících se o 50%. Každým intervalem je vymezen trojúhelníkový filtr s maximálním jednotkovým přenosem v polovině intervalu. Sada 9
tato varianta je implementována z důvodů kompatibility se systémem HTK a možností srovnávání výsledků
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
13
navržených filtrů je pak transformována zpět do lineárního frekvenčního měřítka, viz obr.2.8. 1
0
1000
2000
3000
4000 f[Hz]
Obr. 2.8: Blokové schéma robustní parametrizace melovskou bankou filtrů Vstupní amplitudové spektrum je filtrováno každým z N filtrů a je určena plocha, resp. součet filtrovaných frekvenčních čar. Těchto N součtů reprezentuje mel-spektrum, které, jak je naznačeno na schématu 2.7, může být použito jako parametrizace. Protože jsou ale vzorky tohoto spektra vzájemně značně korelované, nejsou pro parametrický popis a rozpoznávání příliš vhodné a častěji se převádějí na kepstrální koeficienty blokem DCT (diskrétní kosinová transformace - Discrete Cosine Transformation). Z definice reálného kepstra plyne [9], že je jej možné určit z logaritmu amplitudového spektra. Proto blok DCT skrývá dvě úpravy spektra: první je aplikace přirozeného logaritmu na melspektrum a druhá je inverzní Fourierova transformace. Jestliže však nyní pracujeme pouze s nezáporným reálným mel-spektrem, resp. jeho logaritmem, je možné ukázat [11], že lze Fourierovu transformaci s výhodou nahradit výpočetně méně náročnější diskrétní kosinovou transformací. Označíme-li logaritmus melovského spektra mel[k] = ln(Smel [k]), můžeme psát [2]: r
ci =
N πi 2 X mel[j] cos (j − 0.5) , N j=1 N
i = 1 ... Nc ,
(2.17)
kde Nc je počet požadovaných mel-kepstrálních koeficientů. S použitím tohoto vztahu dostáváme druhou variantu koeficientů, melovské kepstrální koeficienty10 . Parametrizace melovskou bankou filtrů bude po výpočetní stránce lépe popsána v kapitole Implementace, na tomto místě nám jde jen o stručný popis principu.
2.4
Robustní PLP parametrizace
Třetím a posledním navrženým řetězcem je robustní parametrizace PLP (Perceptual linear predictive analysis), tedy lineární prediktivní analýza přizpůsobující se lidskému vnímání. Podobně jako Mel-spektrální analýza, PLP se snaží přiblížit způsobu zpracování signálu lidským sluchem. Zohledňují se dva základní faktory. Prvním je již uvedené pozorování, že spektrální rozlišení sluchu klesá s rostoucí frekvencí a druhým faktorem je to, že za podmínek úrovně hlasitosti konverzační řeči je sluch nejcitlivější uprostřed slyšitelného frekvenčního pásma [5]. Metoda PLP 10
konstanta
p
2/N ve vztahu 2.17 jen upravuje měřítko koeficientů, je použita pro kompatibilitu s HTK
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
14
je založena, podobně jako LPC, na autoregresním modelování tvaru spektra signálu. Adaptace na lidské vnímání je reprezentována úpravami amplitudového spektra před vstupem do bloku lineární predikce. V případě programu CtuCopy bude navíc opět přidán blok spektrálního odečítání. Blokové schéma je znázorněno na obr. 2.9. Řetězec je velmi podobný robustní LPC x [n]
c [m]
segmentace váhování
c
a
2
^ |S[k]|
x’ [n]
SO
CBA
a [n]
R [i]
LPC
iDFT
SPLP [l]
LPC parametrizace
EQ−LD
IN−LD PLP rozsírení
Obr. 2.9: Blokové schéma robustní PLP parametrizace parametrizaci, je však rozšířen o tři bloky. První blok PLP rozšíření je označen CBA (critical-band analysis). Na spektrum je v něm aplikována transformace aproximující první poznatek, že spektrální rozlišení sluchu klesá s rostoucí frekvencí. Lineární frekvenční osa je nejprve transformována do Barkova měřítka podle vztahu q f 2 Ω(f ) = 6 ln + (f /600) + 1) , (2.18) 600 frekvence f je v Hz a dále je spektrum konvolvováno se simulovanou maskovací křivkou, popsanou vztahy 0 Ω < −1.3 2.5(Ω+0.5) −1.3 ≤ Ω ≤ −0.5 10 1 −0.5 < Ω < 0.5 Ψ(Ω) = . (2.19) (0.5−Ω) 0.5 ≤ Ω ≤ 2.5 10 0 Ω > 2.5 Vstupem do bloku CBA je kvadrát odhadu amplitudového spektra signálu, tedy výkonové spektrum. Zavedeme-li pojem diskrétní lineární frekvenční osy f rozdělené na K − 1 intervalů délky fs /K počínaje 0Hz a konče (fs · (K − 1)/K)Hz jakožto frekvenční osy pro spektrum signálu při vzorkovací frekvenci fs , kde K je rozměr spektra, můžeme zapsat výkonové spektrum jako funkci této frekvence11 ˆ 2. P (f ) = |S[k]| Spektrum po průchodu tímto blokem je pak Θ(Ωi ),
i = 1 ... I,
kde I je řád PLP analýzy daný vlastním algoritmem, nikoliv zadáním12 , můžeme jejich vztah popsat rovnicí Θ(Ωi ) =
2.5 X
P (Ω − Ωi )Ψ(Ω).
(2.20)
Ω=−1.3
Vlivem diskrétní konvoluce s funkcí Ψ(Ω) se frekvenční rozlišení spektra značně zmenší, což umožňuje později zmenšit počet spektrálních čar bez snížení vypovídací hodnoty spektra[5]. Následující blok schématu robustní PLP parametrizace je označen EQ-LD (equal-loudness). Blok EQ-LD reflektuje nestejnou citlivost sluchu na různých frekvencích. Tento jev je popsán 11 12
kulaté závorky vyjadřují, že frekvence na diskrétní ose jsou reálné viz kapitola Implemetace
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
15
tzv. křivkami konstantní hlasitosti, jež budou v našem případě aproximovány jediným transformačním vztahem, odvozeným z těchto křivek pro hladinu hlasitosti 40dB. Aproximace má dvě varianty, k výpočtu se použije varianta odpovídající použité vzorkovací frekvenci: E(ω) =
E(ω) =
(ω 2 + 56.8 · 106 )ω 4 , (ω 2 + 6.3 · 106 )2 · (ω 2 + 0.38 · 109 )
fs ≤ 10kHz;
(ω 2 + 56.8 · 106 )ω 4 , (ω 2 + 6.3 · 106 )2 · (ω 2 + 0.38 · 109 ) · (ω 6 + 9.58 · 1026 )
fs > 10kHz.
(2.21)
(2.22)
Aplikací aproximovaných křivek konstantní hlasitosti dochází pouze k úpravě amplitudy spektrálních čar podle rovnice Ξ[Ω(ω)] = E(ω)Ψ[Ω(ω)]. Poslední blok schématu, označený IN-LD (intensity-loudness power law ) respektuje další vlastnost sluchu, nelineární závislost vnímané hlasitosti na intenzitě zvuku. Pro naše účely bude reprezentována třetí odmocninou spektra: Φ(Ω) = Ξ(Ω)0.33 .
(2.23)
Tato forma dynamické komprese umožňuje modelovat PLP-spektrum v autoregresní analýze filtrem nižšího řádu, než je běžně používaný řád při LPC parametrizaci[5]. Protože první dva popsané bloky PLP rozšíření představují lineární operace, je možné je sloučit a aplikovat na vstupní výkonové spektrum pomnocí jediné maticové úpravy, jak bude podrobněji popsáno v kapitole Implementace. Řetězec robustní PLP parametrizace začíná shodně s předchozími dvěma parametrizacemi segmentací, váhováním a funkčním blokem SO. Na vstupu bloku CBA se provede převod amplitudového spektra na výkonové spektrum, následovně jsou použity výše popsané tranformace v blocích CBA, EQ-LD a IN-LD. Výstupem je spektrum SP LP [k] o menším rozměru, než má spektrum na vstupu. Toto spektrum pak vstupuje do standardního bloku lineární predikce a výstupním parametrickým popisem je, podobně jako u robustní LPC parametrizace, sada PLP-autoregresních koeficientů a[n] či PLP-kepstrálních koeficientů c[n]. Blok iDFT na vstupu lineární predikce musí při převodu na autokorelační koeficienty počítat se zmenšeným rozměrem vstupujícího spektra. Na doplnění parametrického popisu může sloužit též energie chybového signálu Pe , určená v rámci lineárního prediktivního kódování; v tomto případě má však jiný informační charakter, než v předchozích popisovaných parametrizacích, vzhledem k úpravám spektra metodami PLP13 .
2.5
Sloučení parametrizací
V předchozích kapitolách jsme se seznámili se všemi navrženými metodami robustní parametrizace řečového signálu, s principy jejich funkce a s potřebnými parametry, nutnými k jejich konfiguraci. Než přejdeme k popisu vlastní implementace, sestavíme na základě společných vlastností těchto metod principielní blokové schéma, zahrnující veškeré možnosti budoucího programu z hlediska řazení funkčních bloků. Na obr. 2.10 lze pozorovat sloučení vstupních bloků, shodných pro všechny parametrizace. Zdrojem dat může být navzorkovaný signál x[n], který je segmentován, váhován a převeden v rámci bloku SO na spektrum. Alternativně může být vstupem rovnou toto spektrum X[k], spočítané buď dříve programem CtuCopy nebo získané jiným způsobem (na obrázku vyznačeno čerchovanou čarou). Poslední variantou vstupu je jednostranné amplitudové spektrum |X[k]|, neobsahující fázovou informaci (rovněž čerchovaná čára). Je použitelné pro parametrizaci, která 13
program CtuCopy počítá nultý PLP- a LPC-kepstrální koeficient právě z Pe
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU X[k] ,
16
|X[k]| segmentace váhování
^ s[n]
x [n]
x’ [n]
SO
^ |S[k]| ^ ^ S[k] , |S[k]|
SO exten
^ |S[k]|
none
SO s VAD
^
iDFT
R x [i]
a1[n]
LPC
c1[m]
a
c E , a1[n]
LPC parametrizace
Smel [l]
BF(mel)
c2[m]
DCT
E , Smel [l]
parametrizace Melovskou bankou filtru
BF(PLP)
SPLP [l]
^
iDFT
R x [i]
LPC
a3[n]
a
c
c3[m]
E , a3[n] PLP parametrizace
Obr. 2.10: Sloučení parametrizací nepotřebuje informaci o fázi, nebo i pro odšumění signálu, v tomto případě ale musí být výstupem opět amplitudové spektrum. Blok SO provede po převodu signálu do spektra blokem FFT buď rozšířené spektrální odečítání nebo spektrální odečítání s detektorem řeči VAD nebo neprovede žádnou úpravu spektra. Pokud je použit VAD, budou data načtena buď ze souboru, specifikovaného příkazovou řádkou, nebo bude použit interní kepstrální detektor. Blok SO může v návaznosti provést zpětnou transformaci spektra do časového průběhu sˆ[n], čímž dostáváme signál se zvýrazněnou řečí. Alˆ či amplitudové spektrum segmentů ternativou tohoto výstupu je opět spektrum segmentů S[k] ˆ |S[k]|. Za předpokladu použití programu jako parametrizátoru postupujeme z bloku SO po plné čáře do jedné ze tří výše popsaných metod s patřičnými parametrickými výstupy. Za povšimnutí stojí, že řetězec PLP parametrizace se liší od řetězce LPC parametrizace pouze blokem označeným BF(PLP), jež zahrnuje rozšíření PLP analýzy popsané v kapitole Robustní PLP parametrizace. Proto za tímto blokem bude následovat algoritmus, implementovaný již pro ro-
KAPITOLA 2. METODY PARAMETRIZACE ŘEČOVÉHO SIGNÁLU
17
bustní LPC parametrizaci – v obrázku to z důvodů přehlednosti není zakresleno. Symbol ’E’ u výstupů parametrického popisu značí energii segmentu, která bude vysvětlena v příští kapitole.
Kapitola 3
Implementace Při návrhu komplexnějších výpočetních struktur je vhodné přibližovat se k cíli postupně. V případě že pracujeme na vývojové úrovni, kdy nám jde o zjištění, či ověření funkce a vlastností navrženého algoritmu a nepočítá se s jeho přímým nasazením v praxi, stačí jednotlivé funkční bloky implementovat prostřednictvím specializovaného vyššího programovacího jazyka, který je orientován na co nejjednodušší popis algoritmu a nezabývá se optimalizacemi kódu. K tomuto účelu je navržen a v technických oborech často používán programovací jazyk Matlab. S tímto interpretačním jazykem a s jeho toolboxem na zpracování signálu jsem se seznámil prostřednictvím předmětů Katedry teorie obvodů a v této práci jsem jej využíval na kontrolu částí algoritmů a vypočítaných výsledků. Jestliže máme funci bloků programu ověřenu a chceme vytvořit kompaktní program, přeložitelný do spustitelného kódu na jakékoliv platformě a jde nám o jeho praktické nasazení, tj. i o rychlost výpočtů, je třeba sáhnout po nižším jazyce s kompilátorem. Doporučeným jazykem pro tuto práci bylo C nebo C++. Po seznámení se s oběma jazyky jsem se rozhodl pro implementaci v C++, a to zejména z následujících důvodů: • možnost objektového programování, užitečná v předpokládaném případě rozšiřování programu o další funkční bloky, pohodlně začlenitelné do zdrojového kódu bez nutnosti jeho rozsáhlých úprav • jednoduchý přístup ke vstupně – výstupním proudům prostřednictvím standardní knihovny iostream • větší bezpečnost při správě dynamické paměti pomocí operátorů new a delete. Sestavil jsem schéma hierarchie objektů. Objekty bylo třeba zvolit tak, aby na sebe mohly navazovat podle zásad blokového schématu na obr. 2.10. Rozdělení objektů do fyzických souborů jsem navrhl s ohledem na budoucí rozšiřování programu. Schéma je zachyceno na obr. 3.1. Popisuje pouze prvotní rozdělení funkčních bloků, nikoli jejich hlubší vzájemné souvislosti. V následujících odstavcích bude stručně popsán význam jednotlivých bloků.
main Hlavní jednotkou programu je soubor main. Ten obsahuje pouze kód na čtení parametrů příkazového řádku (popř. na nastavení výchozích hodnot) a na korektní inicializaci a destrukci jediné instance objektu job, přičemž vypisuje eventuelní chybová hlášení při nesprávném zakončení programu.
18
KAPITOLA 3. IMPLEMENTACE
19 CtuCopy main
job
exten
fft
cep
ss
mel
plp
CepstralDet
Obr. 3.1: Hierarchie objektů CtuCopy
job Další jednotkou je objekt job. Jeho funkcí je zapouzdřit celý algoritmus vůči souboru main. Job dostane od jednotky main kompletní soubor parametrů popisující konfiguraci programu. Vyhodnotí parametry příkazového řádku a při nesrovnalostech vypíše chybová hlášení. Pokud jsou parametry zadány chybně, program ukončí. V případě syntakticky a obsahově správných parametrů jednotka job vytvoří řetězec funkčních bloků parametrizace podle schématu na obr. 2.10 a inicializuje ho. Po obdržení příkazu execute od hlavní jednotky provede po jednotlivých segmentech celý výpočet. V případě nestandardního ukončení programu zachycuje chybová hlášení a ve vhodném formátu je předává hlavní jednotce, přičemž zařídí správnou destrukci všech zúčastněných objektů a dealokaci paměti. V případě korektního průchodu celým výpočtem provede job závěrečnou destrukci inicializovaných objektů, dealokaci paměti a vrátí řízení opět hlavní jednotce.
exten, ss Jednotky exten (extended spectral subtraction) a ss (spectral subtraction) implementují všechny dříve uvedené metody spektrálního odečítání. Jejich základní funkce jakožto bloků schématu na obr. 3.1 je následující. Jsou inicializovány jednotkou job (tj. buď je inicializována jednotka exten nebo jednotka ss), podle požadavků uživatele. V předchozí kapitole bylo uvedeno, že ve vstupní fázi algoritmu bude použita jedna z metod spektrálního odečítání nebo nebude použita metoda žádná. Jestliže se nemá provést žádná metoda, zavolá se jednotka exten se speciálním parametrem zaručujícím, že se nebude provádět rozšířené spektrální odečítání. Je to z toho důvodu, že kdyby k jednotkám exten a ss existovala ještě alternativa bez spektrálního odečítání, měla by téměř identickou strukturu s jednotkou exten a zdrojový kód by se jenom zbytečně opakoval. Inicializace těchto jednotek obnáší na základě předaných parametrů příkazového řádku vytvoření a inicializaci dalších zúčastněných metod. Konkrétně, pokud je potřeba např. sestavit řetězec parametrizace s rozšířeným spektrálním odečítáním používající mel-banku filtrů, musí si jednotka exten sama zavolat a inicializovat jednotku mel, kterou bude k výpočtu používat. Nemůže to dělat již jednotka job, vzhledem k celkovému přístupu ke struktuře programu. Pokud totiž předpokládáme budoucí rozšiřování programu CtuCopy o další jednotky, neví jednotka
KAPITOLA 3. IMPLEMENTACE
20
job o jejich funkcích a principech, a proto nechává režii zcela na nich. Tím je job oddělen od vlastních algoritmů. V rámci inicializace jednotek exten a ss jsou dále otevřeny soubory pro vstup a výstup, ss popřípadě otvírá ještě soubor s řečovou aktivitou. Alokuje se paměť pro všechna pole. Každá z obou jednotek je schopna v cyklu řízeném jobem zpracovat jeden segment vstupního signálu. Obnáší to přečtení ze vstupu, segmentaci, váhování, eventuelní převod na spektrum, dále jednu z metod spektrálního odečítání, eventuelní převod zpět do časové oblasti + skládání metodou OLA a konečně zavolání následných metod (v případě použití CtuCopy jako parametrizátoru). Při použití programu pouze jako zvýrazňovače řeči zapisují jednotky exten a ss výsledky přímo do výstupního souboru v jednom z formátů popsaných později. Při ukončení programu, ať už standardním, či na základě chyby za běhu programu, umí obě jednotky zavřít všechny soubory, dealokovat paměť a zavolat destruktory všech metod, inicializovaných na této úrovni.
cep, mel, plp Na nejnižší úrovni jsou jednotky fft, cep, mel, plp a CepstralDet. Předpokládají, že budou zavolány jednou z vyšších metod. Implementují dokončení řetězce parametrizace. Jejich vstupem je amplitudové spektrum a výstupem parametrický popis. Tyto jednotky pracují podobně jako o jednu úroveň vyšší exten a ss. V jednom kroku jsou schopny zpracovat jeden segment, resp. vstupní spektrum segmentu. Výsledek své činnosti zapisují do výstupního souboru, konfigurovány jsou opět předanými parametry. Při ukončení programu je dealokována použitá paměť.
fft Jednotka fft počítá dopřednou a inverzní Fourierovu transformaci jednoho segmentu prostřednictvím algoritmu FFT, je schopna pracovat s reálným a komplexním spektrem a provádět vzájemné převody těchto spekter. V inicializační fázi předpočítá konstanty a alokuje paměť a při ukončení programu paměť dealokuje. FFT byla vytvořena na základě implementace FFT napsané na Katedře teorie obvodů.
CepstralDet Tato jednotka je součástí již hotového programu VDET, napsaného p. Kalným na Katedře teorie obvodů. Implementuje kepstrální detektor řečové aktivity. Pro naše účely bude použita varianta detektoru s Burgovým algoritmem. Vstupem je jeden segment signálu v časové oblasti. CepstralDet určí, zda je v segmentu přítomna řeč a tuto informaci předá volající instanci. V programu CtuCopy je inicializována a volána jednotkou ss. Protože je tato jednotka převzata a není součástí této práce, nebude dále popisována. Bližší informace je možno nalézt v [13].
Nyní máme popsány základní funkční jednotky programu. Jestliže budeme chtít později hledat detailnější souvislosti a zaměřit se na specifika programu CtuCopy daná konkrétní implementací metod, musíme si ještě ujasnit strukturu programu z hlediska vazeb funkčních bloků na úrovni hlavičkových a „.ccÿ souborů. Ta je detailně zakreslena na obr. 3.2. Písmennými symboly ’A’ až ’K’ jsou označeny závislosti mezi soubory. Lze zde dobře pozorovat, jaké kroky je třeba udělat při začleňování další jednotky do programu. Kdybychom chtěli přidat např. alternativu ke spektrálnímu odečítání, bylo by nutno upravit pouze blok job.h, neboť je jediný,
Obr. 3.2: Vazby souborů CtuCopy H
C
job.cc
job.h
mel.cc
F
cep.cc
E
mel.h
D
fft.h
cep.h
exten.h exten.cc
A
main.cc
G
B
I
plp.cc
plp.h
ss.cc
ss.h
K
CepstralDet.h
KAPITOLA 3. IMPLEMENTACE 21
KAPITOLA 3. IMPLEMENTACE
22
který je závislý na implementaci hlavičkového souboru jednotky prostřednictvím vazby ’I’, resp. ’H’. K tomuto schématu se budeme v následujícím popisu ještě vracet. Implementace celého programu CtuCopy se snaží brát ohled vedle správné funkce programu především na: • rozšířitelnost programu o další jednotky • bezpečnost práce s pamětí a se soubory (důsledná dealokace paměti a co nejlépe ošetřená destrukce všech objektů na konci výpočtu, i při vyjímečných událostech, řešená pomocí tzv. vyjímek – exceptions) • ošetření nesprávného zadání parametrů příkazového řádku pomocí škály varovných zpráv
3.1
Implementace metod spektrálního odečítání
V tomto odstavci bude objasněn způsob implementace všech algoritmů na zvýraznění řeči v signálu. Popis bude často zmiňovat objekty v C++, a proto je třeba vymezit platnost nadále používaných pojmů: objekt — standardní třída v jazyce C++ (tento pojem bude využíván též pro instanci třídy) metoda — standardní metoda objektu v rámci C++; související pojmy jsou konstruktor a destruktor Stávající verze programu 1.15, o níž budeme dále výhradně hovořit, zahrnuje celkem čtyři algoritmy zvýraznění řeči, a to: • jednokrokové spektrální odečítání s dvoucestným usměrněním (tuto metodu budeme dále nazývat zkratkou ssfw - spectral subtraction with full-wave rectification) • jednokrokové spektrální odečítání s jednocestným usměrněním (dále jen sshw - spectral subtraction with half-wave rectification) • dvoukrokové spektrální odečítání s dvoucestným usměrněním dále jen ss2fw - 2-step spectral subtraction with full-wave rectification) • rozšířené spektrální odečítání (dále jen exten - extended spectral subtraction). Pro možnost co nejobecnějšího zařazování dalších jednotek na zvýraznění řeči do programu (v CtuCopy jsou tyto jednotky dvě, a to exten a ss, viz obr. 3.2) bylo třeba definovat prototyp rozhraní. Jediným společným místem v celé struktuře programu, kam je možné tyto jednotky začlenit, je job – viz obr. 3.1. Ten definuje abstraktní třídu tIO, která bude děděna všemi jednotkami zvýrazňujícími řeč. Obsahuje pouze konstruktor, destruktor a jedinou abstraktní metodu one step. Pro možnost snadného předávání souboru konfiguračních parametrů mezi objekty slouží třída opts. Lze ji při rozšiřování programu modifikovat, aniž by byly ostatní objekty ovlivněny. Základem jednotek exten a ss je třída IO, následník abstraktní třídy tIO. Jednotky tedy musí předefinovat konstruktor, destruktor a metodu one step. Aby mohly obě jednotky používat stejnou třídu IO, bylo třeba sáhnout po dalším nástroji jazyka C++, po prostrorech jmen (namespace). Tím je umožněno při eventuelním rozšiřování programu napsat nový objekt na zvýrazňování řeči úpravami již implementovaného, aniž by bylo nutno přejmenovávat proměnné apod., stačí pouze zvolit nové jméno prostoru jmen. Požadavky specifikované užším zadáním práce:
KAPITOLA 3. IMPLEMENTACE
23
• načítání dat buď z binárního souboru nebo ze standardního vstupu stdin • podpora vstupně – výstupních formátů: – 16-bitový PCM jednokanálový signál bez hlavičky – vzorky komplexního symetrického spektra segmentů – datový typ double – vzorky amplitudového spektra segmentů (jen polovina symetrického spektra) – datový typ float • konverze vstupně – výstupních formátů • načítání VAD dat ze souboru (jen jednotka ss)
3.1.1
Inicializace programu
Tento odstavec krátce popíše sled dějů po spuštění programu. Je ho třeba ozřejmit pro získání přehledu o průchodu dat programem. Po spuštění programu proběhnou následující události. Funkce main přečte parametry příkazového řádku do proměnné o typu opts, konfigurující celý program. Pokud nejsou některé zadány, nastaví je na výchozí hodnoty. Dále je vytvořen objekt JOB typu job, jemuž se objekt opts předá. JOB analyzuje přečtené parametry a rozhodne, zda použít objekt exten, či ss. V případě špatného zadání parametrů vypíše chybová hlášení a eventuelně program ukončí. Při správném běhu se na konci inicializace zavolá konstruktor objektu exten či ss a předá se mu opts. Další běh inicializace proto závisí jen na předefinovaném konstruktoru třídy IO. Konstruktor implementuje inicializaci popsanou již v úvodní části této kapitoly, zahrnující otevření vstupně – výstupních souborů, alokaci paměti a dále vytvoření objektů parametrizace, podle údajů z opts. Jestliže uživatel požaduje na vstupu či na výstupu pracovat se signálem v časové oblasti, zavolá se navíc inicializace rychlé Fourierovy transformace a předpočítají se koeficienty Hammingova okna. Ze vstupního souboru se přečte první segment, který se zpracuje. Znamená to, že tento segment absolvuje v případě potřeby převod do spektrální oblasti a dále eventuelně jeden z algoritmů spektrálního odečítání. Tím inicializace programu končí. Z toho vyplývá, že metoda one step vždy začne nejprve uložením vypočítaných hodnot do souboru, pak načte nová data a provede na nich výpočet.
3.1.2
Jeden krok spektrálního odečítání
Nyní si popíšeme jeden krok1 při průchodu programem, resp. jeho částí zabývající se potlačováním šumu. Po proběhnutí úvodní inicializace programu, popsané v předchozím odstavci, se vrátí řízení jednotce main. Ta provede druhý úkol, zavolá jedinou metodu objektu JOB, execute. Objekt JOB pak cyklicky spouští metodu one step – jeden krok v rámci spektrálního odečítání. Konec cyklu nastává, když se přečtou ze vstupního souboru všechna data. Průběh je schématicky nakreslen na obr. 3.3. Z hlediska objektu exten či ss představuje jeden krok algoritmu následující. Nejprve je zavolána privátní metoda save. Ta rozhodne, co se s odhadem amplitudového spektra řeči stane. Jestliže je program použit jako zvýrazňovač šumu a výsledek má být signál v časové oblasti, pak se zavolá metoda ifft, metoda save zařídí skládání OLA a zapíše výsledná data do souboru. V případě že výstupem je spektrum, stačí pouze zapsat data do souboru. Jestliže je 1
krokem programu se zde má na mysli průchod jednoho segmentu, neboli jednoho zavolání metody one step
KAPITOLA 3. IMPLEMENTACE
24
první segment
main:
inicializace
job:
inicializace
ostatní segmenty
destrukce automaticky
execute
one_step
jsou data?
destrukce
Obr. 3.3: Zapouzdření metod výsledkem programu parametrický popis, metoda save pošle dříve spočítaná data do objektu, zabývající se parametrickým popisem, jak bude uvedeno později. Následujícím úkolem je načtení nových dat prostřednictvím metody load. Metoda přečte ze vstupu jeden segment signálu v požadovaném formátu a převede ho do formy spektra segmentu. V případě použití externího VAD souboru se přečte informace o řečové aktivitě; v případě interního detektoru se zavolá metoda objektu CepstralDet, která řečovou aktivitu vyhodnotí. Za použití jednotky exten se řečová aktivita neurčuje. Pakliže vstupní soubor neobsahuje již další data, předá se chod programu vyššímu objektu, tedy jobu, jenž zavolá příslušné destruktory a program ukončí. Posledním a hlavním úkolem pro one step je potlačení šumu. To se provede zavoláním privátní metody denoise.
exten - denoise Pro případ algoritmu exten se nejprve vyhodnotí počítadlo segmentů. V případě, že algoritmem prošly již první dva segmenty, proběhne standardní jeden krok algoritmu, stručně popsaný v minulé kapitole: je aktualizován přenos Wienerova filtru z vyhlazeného odhadu spektra šumu a z vyhlazeného odhadu spektra řeči dle vztahu 2.9. Přefiltruje se vstupní segment, čímž dostáváme aktuální odhad spektra šumu, viz obr. 2.5 na straně 9. Ten odečteme od vstupního spektra. Zde využíváme vlastnosti přenosové funkce Wienerova filtru, že přenos je vždy menší než jedna (viz vztah 2.9), není proto třeba usměrnění, na rozdíl od algoritmů ss. Dále se opraví vyhlazené odhady spekter řeči a šumu. Dostáváme odhad aktuálního spektra řeči, jež je výstupem tohoto algoritmu. Pokud pracujeme s prvním nebo druhým segmentem, na výstup se spektrum nedostává, resp. metoda save neprovede nic.
ss - denoise V případě zpracování jednotkou ss vypadá poslední úkol jednoho kroku, metoda denoise, odlišně, a to vlivem jiného způsobu inicializace. Nejprve je pro první dva algoritmy (ssfw, sshw, ss2fw) provedeno umocnění spektra na a-tou2 , viz obr. 2.4 na straně 8. Dále je v případě, že segment neobsahuje řeč, opraven odhad spektra šumu dle vztahu 2.7. Zde se uplatní počítadlo segmentů. V případě, že je algoritmus v inicializační fázi3 , je zaručeno, že na vstupu není řečový signál a VAD je pevně nastaven na nulu. Následně je provedeno spektrální odečítání odhadu šumu od vstupního spektra dle vztahu 2.8 a usměrnění, závislé na použitém algoritmu. V případě 2 3
algoritmus ss2fw spektrum neumocňuje implicitní počet inicializačních segmentů je 10
KAPITOLA 3. IMPLEMENTACE
25
dvoukrokového algoritmu se dále provede oprava odhadu spektra zbytkového šumu, druhý krok spektrálního odečítání a druhé usměrnění podle stejných pravidel, jako pro první krok. Zbývá zpětné odmocnění spektra, platící pro první dva algoritmy. Výsledkem je opět odhad spektra řeči v segmentu. Na základě dosavadního popisu by měl být principielně objasněn chod programu CtuCopy v režimu zvýrazňovače řeči. V následujících odstavcích se budeme zabývat implementací navazujících bloků, počítajících parametrický popis signálu.
3.2
Implemetace parametrizačních metod
Ve snaze o co největší flexibilitu programu CtuCopy jsem implemetoval algoritmy parametrizace do oddělených jednotek. Každá z jednotek obsahuje definici jednoho objektu, jež implementuje všechny potřebné metody. V CtuCopy jsou tyto jednotky tři, viz obr. 3.2: cep — dokončení řetězce robustní LPC parametrizace od odhadu amplitudového spektra řeči po kepstrální koeficienty, odtud také název jednotky cep mel — dokončení řetězce robustní paramentrizace melovskou bankou filtrů plp — dokončení robustní parametrizace metodou PLP Z obrázku plyne, že každá z jednotek exten a ss závisí na všech parametrizačních jednotkách prostřednictvím vazeb ’D’, ’E’ a ’F’. Znamená to tedy, že jsou pokryty všechny kombinace algoritmů spektrálního odečítání a parametrizace. Na rozdíl od objektů zvýrazňujících řeč není nutné, aby měly všechny tři objekty cep, mel a plp shodnou kostru, podobnou abstraktní třídě tIO. Jejich vnitřní implementace může být totiž natolik rodílná, že bychom jen těžko hledali společné vlastnosti. Proto, kdybychom chtěli do programu přidávat další algoritmus parametrizace, není jeho vnitřní struktura limitována, vstupem obecně nemusí být ani odhad amplitudového spektra segmentu a výstup není vůbec specifikován. Jediným požadavkem je, aby algoritmus pracoval po segmentech, tj. aby obsahoval metodu, podobnou výše popsanému one step, pro synchronní činnost s objekty exten a ss. Daní za tuto benevolenci je nutnost ruční integrace takovéto nové jednotky do objektů exten a ss. Pro konfiguraci jednotek parametrizace se používá opět třída opts, předaná při inicializaci. Výsledek činnosti jednotek je obecně směrován do výstupních souborů, proto je nutná komunikace s nadřazenými objekty jenom pro chybová hlášení. Vyskytne-li se tedy z nějakého důvodu za běhu programu chyba (např. smazání souboru pro zápis dat, nedostatek operační paměti apod.), objekt předá tuto chybu vyšší instanci, kterou je buď exten nebo ss.
3.2.1
LPC parametrizace — cep
Objekt cep musí podle postupu uvedeného v předchozí kapitole implementovat několik metod, které z hlediska programu představují: • výpočet energie segmentu • převod vstupního amplitudového spektra na autokorelační koeficienty — metoda idft • Levinson – Durbinův algoritmus na výpočet autoregresních koeficientů a výkonu chyby predikce — metoda LevDurb • převod autoregresních koeficientů na kepstrální koeficienty — metoda a2c
KAPITOLA 3. IMPLEMENTACE
26
• uložení výsledků do souboru, eventuelně zapsání hlavičky souboru — metoda save V předchozí podkapitole byl popsán chod programu, zejména metoda one step. Bylo řečeno, že objekt exten či ss předá vypočtené hodnoty amplitudového spektra na výstup prostřednictvím metody save. Tato metoda je v případě použití programu jako zvýrazňovače řeči zapíše do souboru a v případě parametrizace je postoupí jednomu z objektů, jimiž se zabývá tato podkapitola, což je právě bod, který nás bude dále zajímat. Předání vzorků amplitudového spektra se realizuje pomocí jediné veřejně přístupné metody process, která zapouzdřuje všechny metody idft, LevDurb, a2c a save, viz obr. 3.4. one_step
exten / ss:
save
load
denoise
process
cep:
| |
2
idft
LevDurb
a2c
save
Obr. 3.4: Vnitřní schéma metody process objektu cep Před výpočtem autokorelačních koeficientů je třeba převést amplitudové spektrum na výkonové, podle vztahu 2.15 ze strany 11. Dále je použita privátní metoda idft.
idft Výpočet inverzní diskrétní Fourierovy transformace podle definice 2.13 představuje v každém kroku počítat p · K násobení komplexní exponencielou, kde p je řád LPC a K je rozměr spektra. Pokud uvážíme, že vstupní amplitudové spektrum je symetrické, neboť popisuje reálný signál, můžeme zjednodušit komplexní exponenicielu na jedno násobení goniometrickou funkcí. Algoritmus výpočtu iDFT pak vypadá následovně. for n = 0 : for k~= 0 : R[n] = R[n] end R[n] = R[n] end.
p, - cyklus pro všechny autokorelační koeficienty K, - cyklus přes celé spektrum + P[k]*cos(2*pi*k*n/K); / K;
- viz definiční vztah
To však stále ještě neřeší nutnost počítat p · K - krát funkci kosinus. Bylo by možné si všechny potřebné hodnoty ve fázi inicializace programu předpočítat do pole a ve fázi výpočtu je pak vybírat pomocí indexu k ∗ n - viz výše uvedený algoritmus. Toto pole by však bylo příliš velké. Nicméně, vezmeme-li v úvahu periodicitu goniometrických funkcí, zúží se nám škála potřebných hodnot jen na jednu periodu funkce kosinus, kterou lehce uložíme do paměti. Hodnoty pak vybíráme upraveným algoritmem indexace. Výsledný algoritmus vypadá takto: inicializace: for int i = 0 : K, W[i] = cos(2*pi*i/K); end
- naplnění pole W hodnotami cos
KAPITOLA 3. IMPLEMENTACE
27
výpočet: for n = 0 : p, for k~= 0 : K~index = (n*k) mod K; R[n] = R[n] + P[k]*W[index]; end R[n] = R[n] / K; end.
- funkce mod značí zbytek po dělení - jen jedno reálné násobení
Tento algoritmus jsem implementoval do CtuCopy. Bylo by možné ještě dále zjednodušit výpočet tím, že bychom pracovali jen s jednou polovinou spektra, čímž by se ušetřila téměř polovina násobení. To jsem do implementace nezahrnul z důvodu, že vlivem drobných numerických nepřesností je vstupní spektrum mírně nesymetrické4 a zprůměrováním stejnolehlých hodnot kompletního spektra dosáhneme zmenšení chyb. Z vypočítaných p autokorelačních koeficientů je třeba spočítat autoregresní koeficienty a výkon chyby predikce pomocí Levinson – Durbinova algoritmu. Tento algoritmus jsem převzal z [1] a implementoval bez úprav. Převod autoregresních koeficientů na kepstrální koeficienty metodou a2c probíhá podle vztahu 2.10. Nultý kepstrální koeficient je vypočten podle vztahu 2.11.
save Poslední metodou je save. V inicializační fázi programu se nejprve zjistí ze sdíleného objektu opts, zda je třeba zapisovat výstupní soubor s hlavičkou. Pokud ano, zapíše se hlavička kompatibilní se systémem HTK. Protože je ale její součástí informace o počtu zpracovaných segmentů, který bude znám až na konci algoritmu, musí být hlavička vyplněna až před koncem běhu programu. V každém kroku algoritmu5 se zvyšuje počítadlo segmentů a na výstup se zapisuje parametrický popis. Nyní je třeba upřesnit formát výstupního souboru, neboť nebyl dosud přesně vymezen. S ohledem na kompatibilitu se systémem HTK je možno zapisovat do výstupního souboru za použití robustní LPC parametrizace následující data. První variantou jsou autoregresní koeficienty segmentu bez koeficientu a[0], který je roven jedné, viz minulá kapitola. Druhou variantou jsou kepstrální koeficienty segmentu, získané funkcí a2c. Parametrický popis může být v obou případech doplněn ještě dvěma hodnotami. První je logaritmus energie segmentu, počítaný dle vztahu6 ! K 1 X ˆ 2 , E = ln |S[k]| (3.1) K i=1 kde K je rozměr spektra, resp. segmentu, neboť dle Parsevalova vztahu pro reálný diskrétní signál platí [3] K K K X X X 1 ˆ 2 s2 (i) = P [k] = |S[k]| . K i=1 i=1 i=1 Druhou doplňující hodnotou je nultý kepstrální koeficient, nesoucí informaci o energii chybového signálu. Po uložení hodnot pro všechny segmenty se v rámci destruktoru celého objektu cep zapíše do hlavičky správný počet zpracovaných segmentů (pokud výstup obsahuje hlavičku). jedná se o nesrovnalosti v řádu 10−14 zde máme opět na mysli jeden krok ve smyslu one step, resp. process 6 převzato z HTK pro kompatibilitu a upraveno
4
5
KAPITOLA 3. IMPLEMENTACE
3.2.2
28
Parametrizace melovskou bankou filtrů — mel
Druhý algoritmus parametrizace, implementovaný do objektu mel, jsem rozdělil metodám takto: • výpočet energie segmentu • aplikace banky filtrů, tj. převod spektra na mel-spektrum — metoda toMel • přepočet mel-spektra na kepstrální koeficienty pomocí DCT — metoda toCep • uložení výsledků do souboru — metoda save. Všechny tři privátní metody jsou podobně jako u objektu cep zapouzdřeny do veřejné metody process. Princip činnosti objektu mel je rovněž analogický, viz obr. 3.5. one_step
exten / ss:
save
load
denoise
process
mel:
toMel
toCep
save
Obr. 3.5: Vnitřní schéma metody process objektu mel Inicializace objektu proběhne při inicializaci jedné z nadřazených metod, tj. exten nebo ss, přičemž jsou objektu mel předány konfigurační parametry opts. Jeden krok výpočtu obnáší zavolání metody process z metody save objektu pro zvýraznění řeči. Po zavolání metody process se události vyvíjejí následovně. Nejprve je určena energie vstupního segmentu podle vztahu 3.1. Dále se zavolá metoda toMel.
toMel Převod vstupního amplitudového spektra na mel-spektrum představuje realizaci banky filtrů ve frekvenční oblasti. Aby mohl být celý program co nejrychlejší, bylo nutno algoritmus filtrace optimalizovat. Znamená to předpočítat v rámci inicializace programu transformační matici banky filtrů. V jednom kroku processu pak počítáme jen součet součinů, tj. diskrétní konvoluci. Konstrukce melovské banky filtrů z obr. 2.8 na str. 13 byla naznačena již v minulé kapitole. Na tomto místě je potřeba upřesnit možnosti konfigurace algoritmu uživatelem. Jako parametr příkazové řádky je možné specifikovat: • počet filtrů, resp. rozměr výstupního melovského spektra — parametr nmelbands • horní a dolní mezní frekvence — parametry lofreq, hifreq. Vytvoření banky filtrů pak proběhne v těchto krocích: 1. Horní a dolní mezní frekvenece se převede do melovského měřítka dle vztahu 2.16. 2. Vytvoří se lineární frekvenční osa pro spektrum, od 0Hz do fs /2 Hz, rozdělená na K/2 intervalů, kde K je rozměr spektra. Osa tedy popisuje první polovinu symetrického spektra.
KAPITOLA 3. IMPLEMENTACE
29
3. Lineární frekvenční osa se převede do melovského měřítka. Máme tedy K/2 + 1 bodů na melovské stupnici. 4. Proběhne cyklus přes všechny hledané filtry, tj. od 1 do nmelbands. Filtry mají být lineárně rozprostřeny po melovské stupnici, a to od lofreq do hifreq v melech. V každém cyklu se proto pro hledaný filtr nalezne přesná mel-frekvence jeho počátku a konce (s nulovým přenosem) a středu (s jednotkovým přenosem). Potom se ve vnořeném cyklu projde celá mel-frekvenční osa, napočítaná v bodu 2) a vytvoří se návrh jednoho filtru, tj. jednoho trojúhelníku z obr. 2.8. Znamená to konkrétně, že se pro každý jednotlivý bod frekvenční osy zjistí přenos právě navrhovaného filtru, viz obr. 3.6. prenos 1
0.5
0
1
2
3 4 5 6 7 ... nelineární osa v Hz lineární osa v melech
index 1 − (K/2+1)
Obr. 3.6: Návrh jednoho mel-filtru V jednom kroku vnějšího cyklu tedy spočítáme přenos všech bodů frekvenční osy. Tento přenos uložíme do prvního řádku matice mat. Ve zbývajících cyklech pak navrhneme postupně všech nmelbands filtrů a uložíme jejich přenosy do dalších řádků. Výsledná matice mat má logicky rozměry nmelbands × (K/2 + 1). V tomto okamžiku máme již hotovou matici přepočtu vstupního amplitudového spektra do mel-spektra. Výpočet by nyní mohl probíhat tak, že bychom pro získání každého koeficientu mel-spektra provedli součet součinů vstupního spektra s příslušným řádkem matice mat. Matice je však ve skutečnosti velmi řídká, a proto je vhodné provést ještě následující krok. index
1
2
3
4
1
0
0
0.3
0.9
2
0
0
3
0
5
6
7
8
9
10
0.6
0.2
0
0
0
0
rozmer poloviny vstupního spektra K/2+1
nmelbands−1
0
nmelbands
0
K/2+1 0
3
6
rozmer výstupního spektra nmelbands
matice "mat" Obr. 3.7: Matice mat
5. Matici rozšíříme ještě o dva sloupce, viz obr. 3.7. V každém řádku nalezneme první nenulovou hodnotu a její index zapíšeme do předposledního sloupce. Dále nalezneme poslední nenulovou hodnotu a její index zapíšeme do posledního sloupce. Tím máme na posledních pozicích každého řádku uloženu informaci o poloze příslušného filtru na frekvenční ose.
KAPITOLA 3. IMPLEMENTACE
30
Nyní můžeme převod amplitudového spektra do mel-spektra v každém kroku realizovat diskrétní konvolucí: for i = 0 : nmelbands, // cyklus přes všechny filtry for k~= mat[i,(K/2+1)+1] : mat[i,(K/2+1)+2], // dva přidané sloupce // - počítáme jen v~místě nenulového přenosu Smel[i] = Smel[i] + S[k]*mat[i,k] // suma součinů end // Smel[i] - výstup end. // S[k] - vstup Po proběhnutí metody toMel následuje metoda toCep (v případě, že výsledkem parametrického popisu budou mel-kepstrální koeficienty). Spočítá se přirozený logaritmus mel-spektra mel[k] = ln(Smel [k]) a kepstrální koeficienty se určí ze vztahu 2.17. Podobně jako při zjednodušování algoritmu iDFT v předchozí jednotce se v rámci inicializace programu nejprve předpočítají potřebné koeficienty DCT do pole a během jednoho kroku výpočtu se jen pomocí vhodného indexování pole vybírají z paměti. Tímto postupem se algoritmus jednoho kroku redukuje opět pouze na součet součinů7 . Poslední metoda save pracuje zcela obdobným způsobem jako metoda save jednotky cep.
3.2.3
PLP parametrizace — plp
Jednotka plp má rozhraní stejné jako objekty cep a mel. Znamená to, že plp je inicializován při inicializaci nadřazeného objektu exten či ss, pokud se požaduje robustní PLP parametrizace. Plp není na rozdíl od objektů cep a mel autonomní, viz vazba G na obr. 3.2. Ke své činnosti využívá metody objektu cep, který sama spravuje. Obnáší to vytvoření objektu cep při inicializaci plp a jeho opětovnou destrukci při destrukci objektu plp. Vlastní průběh jednoho kroku názorně popisuje obr. 3.8. one_step
exten / ss:
save
load
denoise
process
plp:
| |
2
cep :: process BF
IN−LD
Obr. 3.8: Zapouzdření metody process objektu plp V rámci objektu plp jsem implementoval pouze jedinou metodu process, zahrnující následující kroky výpočtu (viz obrázek). Nejprve se určí energie segmentu podle vztahu 3.1 a současně se vypočítá kvadrát vstupního spektra. Hned v následujícím kroku bude totiž vstupní spektrum filtrováno bankou filtrů a energii by už nebylo možné určit. 7
vlivem nesekvenčního výběru koeficientů z pole nelze hovořit o diskrétní konvoluci
KAPITOLA 3. IMPLEMENTACE
31
V předchozí kapitole bylo naznačeno, že první dva bloky PLP rozšíření robustní LPC parametrizace (tj. blok CBA a EQ-LD z obr. 2.9 na straně 14) představují lineární operace. Lze je proto sloučit a převést na provádění součtu součinů, podobně jako tomu bylo u melovské banky filtrů. Z tohoto důvodu je nutné při inicializaci objektu plp vytvořit PLP banku filtrů, která bude metodou process využívána. Uvedený převod lineárních operací na banku filtrů je v tomto případě z hlediska rychlosti výpočtu velice zajímavý, a proto si proces tvorby PLP banky filtrů osvětlíme podrobněji: 1. Frekvenční osa spektra představuje K lineárně rozložených bodů na intervalu 0 Hz – (fs (K − 1)/K) Hz, jak bylo řečeno již v kapitole popisující objekt mel. Protože celý algoritmus pracuje jen s jednou polovinou symetrického amplitudového spektra, odpovídá poslední spektrální čáře frekvence (fs /2) Hz. Tuto frekvenci přepočteme dle vztahu 2.18 do Barkovy stupnice a dostáváme maximum frekvenční osy maxBark. Jeho zaokrouhlením na celé číslo a odečtením jedničky je určen rozměr PLP spektra plpsize. PLP analýza tedy určí sama rozměr spektra tak, aby vzdálenost spektrálních čar v PLP spektru byla co nejbližší hodnotě 1Bark. Protože ale maximální Barkova frekvence musí odpovídat hodnotě maxBark fs /2, bude se krok Barkovy osy hodnotě 1Bark pouze blížit: BarkStep = plpsize+1 . 2. Lineární frekvenční osu spektra v Hz8 přepočítáme do Barkovy osy dle vztahu 2.18 – její rozměr je (K/2 + 1) vzorků. 3. Vytvoříme lineární osu v Barkově měřítku, popisující výstupní spektrum, tj. plpsize bodů od (1 · BarkStep)Bark do (plpsize · BarkStep)Bark. 4. V cyklu přes tuto lineární Barkovu osu spočítáme banku filtrů (každý bod na ose odpovídá jednomu filtru): • vypočítáme koeficient equal-loudness filtru určený ze vztahu 2.21 resp. 2.22, • v cyklu přes vstupní spektrum (resp. jeho polovinu) spočítáme za pomoci vztahu 2.19 diskrétní konvoluci dle vztahu 2.20, čímž dostaneme přenos filtru, reprezentující blok CBA z obr. 2.9. Přenos je nutno celý vynásobit koeficientem equal-loudness, reprezentujícím blok EQ-LD. Nyní máme hotový návrh jednoho filtru9 . Koeficienty přenosu filtru uložíme do jednoho řádku matice mat. Dokončením cyklu získáváme kompletní transformační matici mat o rozměrech plpsize × (K/2 + 1), nahrazující výpočetně náročné bloky CBA a EQ-LD ze schématu 2.9. 5. Posledním krokem přípravy matice je podobně jako u melovské banky filtrů rozšíření o dva sloupce, do kterých je uložen index první a poslední nenulové hodnoty z každého řádku. Tyto dvě hodnoty pro každý řádek reprezentují začátek a konec nenulového přenosu filtru. Je opět možné ukázat[5], že indexy vymezují jedinou nenulovou oblast. Vraťme se k výkladu metody process. S použitím vytvořené matice mat je možné implementovat banku filtrů BF z obr. 3.8 elementárním vnořeným cyklem takto: for i = 0 : plpsize, // cyklus přes všechny filtry for k~= mat[i,(K/2+1)+1] : mat[i,(K/2+1)+2], // dva poslední sloupce s~indexy začátku a konce // - počítáme jen v~místě nenulového přenosu S_BF[i] = S_BF[i] + S[k]*mat[i,k] // suma součinů end end. 8 9
zde už pracujeme jen s jednou polovinou symetrického spektra popis je zestručněn, jde spíše o vytvoření představy než o výklad algoritmu
KAPITOLA 3. IMPLEMENTACE
32
Symbol S BF[i] značí výstupní spektrum po filtraci bankou filtrů, S[i] je vstupní amplitudové spektrum po umocnění na druhou. K vytvoření PLP spektra SP LP [k] zbývá podle obr. 3.8 aplikovat dynamickou kompresi (blok IN-LD – intensity – loudness power law ) na spektrum SBF [k] prostřednictvím vztahu 2.23. Dostáváme tak plpsize vzorků spektra. Následující proces už je shodný s algoritmem LPC, o jehož implementaci jsme již hovořili. Před předáním PLP spektra objektu cep je nutno provést jeho symetrizaci, neboť jsme až doposud pracovali jen s jeho první polovinou. Objekt cep pracuje s jiným rozměrem spektra, než by pracoval při robustní LPC parametrizaci. Právě proto je nutné, aby byl cep inicializován objektem plp, který mu předá konfigurační parametry opts již vhodně upravené. Při každém kroku je třeba cepu předat kromě spektra SP LP ještě spočítanou energii segmentu. Ukládání výsledného parametrického popisu je zcela v režii objektu cep.
3.3
CtuCopy z hlediska uživatele
Program CtuCopy byl napsán pod operačním systémem linux, neboť na této platformě běží i navazující nástroje HMM rozpoznávače, proto je jeho dokumentace zpracována v angličtině v linuxové manuálové stránce. CtuCopy je určen ke spouštění z příkazové řádky, či prostřednictvím jiného neinteraktivního nástroje, je to tedy program typu filtr, který je konfigurován parametry příkazové řádky zadanými při spuštění. Lze ho spustit v režimu zvýrazňovače řeči, kdy je zapojena jedna z jednotek na potlačování šumu, nebo v režimu parametrizátoru. Výchozí nastavení programu předpokládá, že vstupní data budou čtena ze standardního vstupu stdin a výstupní data budou zapisována do standardního výstupu stdout. Proto program při spuštění bez parametrů očekává vstup dat z klávesnice. Vstup a výstup můžeme přesměrovat na jakékoliv jiné standardní zařízení či do souboru prostřednictvím zápisu10 ctucopy < vstupni_zarizeni > vystupni_zarizeni nebo použít CtuCopy v koloně příkazů („v rouřeÿ): program1 < vstup.aiff | ctucopy | program2 > vystup.bin. Tento zápis je užitečný např. když je vstupní soubor v jiném formátu a je ho potřeba převést pomocí programu sox. Ke specifikaci vstupu ze souboru a výstupu do souboru je možné použít též parametry příkazového řádku (dále jen parametry) “-i” pro vstup a “-o” pro výstup např. takto: ctucopy < vstupni_zarizeni -o jmeno_souboru Pozn.: všechny parametry a jejich eventuelní argumenty jsou vzájemně odděleny mezerou. Zápisy ctucopy < vstup.bin > vystup.bin ctucopy -i vstup.bin -o vystup bin mají nepatrně rozdílné chování. Pokud totiž specifikujeme výstupní soubor pomocí přesměrovávače “>” a výstupem programu bude parametrický popis ve formátu HTK (viz níže), do 10
následující příklady jsou uvedeny pro bourne again shell - bash
KAPITOLA 3. IMPLEMENTACE
33
výstupního souboru nebude zapisována HTK hlavička. Za použití parametru “-o” se hlavička zapisuje. Obecný prototyp příkazového řádku pro spuštění CtuCopy je tento: ctucopy [ -i input_file ] [ -o output_file ] [ -vad [string] ] [ -isig || -ispec || -iaspec ] [ -osig || -ospec || -oaspec || -olpc || -ocep || -oplp || -oplpcep || -omelspec || -omelcep ] [ -w [int] ] [ -t [string] ] [ -m [string] ] [ -p [float] ] [ -a [float] ] [ -b [float] ] [ -ninitsegs [int] ] [ -nlpc [int] ] [ -ncepcoefs [int] ] [ -nmelbands [int] ] [ -lofreq [float] ] [ -hifreq [float] ] [ -c0 ] [ -energy ] [ -fs [int] ] [ -nowarnings ] [ -h || -? ] Význam dosud neuvedených parametrů: -vad [string] — Specifikace použití detektoru řečové aktivity VAD. Namísto [string] lze doplnit klíčová slova: burg – použije se interní kepstrální detektor file
– VAD data se budou číst ze souboru filename (výchozí nastavení). -isig — Vstupem bude signál v časové oblasti. Rozumí se tím sekvence 16-ti bitových vzorků jednokanálového signálu ve standardním PCM formátu, bez hlavičky (výchozí nastavení). -osig — Analogický parametr, platící pro výstup (výchozí nastavení). -ispec — Vstupem bude kompletní spektrum signálu po segmentech. Pro jeden krok výpočtu se načte w vzorků amplitudového spektra segmentu11 , následovaného w vzorky fázového spektra. Všechny hodnoty jsou uloženy v proměnných typu double. Uživatel musí zajistit, aby program načítal pro každý segment tolik vzorků, kolik jich bylo do souboru uloženo, neboť jsou data čtena bez hlavičky. -ospec — Analogický parametr, platící pro výstup. Fáze spektra je shodná s fází vstupního signálu. -iaspec — Vstupem bude zkrácené amplitudové spektrum po segmentech. Pro každý krok se načte w/2+1 vzorků amplitudového spektra segmentu (využívá se jeho symetrie). Hodnoty jsou uloženy v proměnných typu float. Protože vstup neobsahuje informaci o fázi, výstupní formát musí být buď shodný se vstupním formátem, nebo musí být výstupem parametrický popis. Uživatel musí opět zajistit, aby program načítal pro každý segment tolik vzorků, kolik jich bylo do souboru uloženo. -oaspec — Analogický parametr, platící pro výstup. -olpc — Výstupem programu bude parametrizace LPC autoregresními koeficienty. Tato volba specifikuje, že se k parametrizaci použije algoritmus robustní LPC parametrizace. Formát výstupu je kompatibilní s HTK parametrizací, nemusí nutně obsahovat hlavičku (viz parametry < a -i) [2]. -ocep — Výstupem bude parametrizace LPC kepstrálními koeficienty. Použije se tedy rovněž algoritmus robustní LPC parametrizace. Formát výstupu je kompatibilní s HTK a může či nemusí obsahovat hlavičku. 11
počet vzorků – viz parametr -w [int]
KAPITOLA 3. IMPLEMENTACE
34
-omelspec — Výstupem bude parametrizace mel-spektrem. V tomto případě se použije algoritmus robustní parametrizace melovskou bankou filtrů. Formát výstupu je kompatibilní s HTK a může či nemusí obsahovat hlavičku. -omelcep — Výstupem budou mel-kepstrální koeficienty, k jejichž výpočtu se použije algoritmus parametrizace melovskou bankou filtrů. Formát výstupu je kompatibilní s HTK a může či nemusí obsahovat hlavičku. -oplp — Výstupem programu je parametrizace PLP autoregresními koeficienty. K výpočtu se použije algoritmus robustní PLP parametrizace. Protože HTK neimplementuje PLP parametrizaci, formát výstupního souboru bude shodný, jako při parametrizaci LPC autoregresními koeficienty, viz parametr -olpc. -oplpcep — Výstupem je parametrizace PLP kepstrálními koeficienty, odvozenými z PLP autoregresních koeficientů. Formát výstupu bude shodný jako při parametrizaci LPC kepstrálními koeficienty, viz parametr -ocep. -c0 — Tento přepínač říká, že pokud je výstupem programu parametrický popis jakýmikoliv kepstrálními koeficienty, bude doplněn koeficientem c0 , spočítaným podle příslušného algoritmu parametrizace. Výchozí nastavení – vypnuto. -energy — Přepínač fungující podobně jako předchozí. Pakliže je výstupem jakýkoliv parametrický popis, je doplněn o energii segmentu E, určenou podle příslušného algoritmu parametrizace. Výchozí nastavení – vypnuto. -w [int] — Specifikace délky segmentu. Tento parametr určuje počet načítaných vzorků spektra (v případě, že je vstupem spektrum) nebo délku okna (pro případ vstupu signálu v časové oblasti). Místo [int] je třeba doplnit celočíselnou hodnotu. Výchozí nastavení je 256. -t [string] — Určení typu segmentace. Parametr je použit jenom pokud je vstupem signál v časové oblasti. Program CtuCopy je schopen provádět dva typy segmentace, místo [string] lze doplnit: hamm50 – segmentace s 50% překryvem, váhování Hammingovým oknem (výchozí nastavení) hamm75 – segmentace s 75% překryvem, váhování Hammingovým oknem. -m [string] — Specifikace použité metody na zvýrazňování řeči. [string] nahradíme jedním z pěti klíčových slov: exten – rozšířené spektrální odečítání (výchozí nastavení). Při použití této metody se na výstup nedostávají první dva segmenty, viz popis rozšířeného spektrálního odečítání v kapitole 2. ssfw – spektrální odečítání s dvoucestným usměrněním sshw – spektrální odečítání s jednocestným usměrněním ss2fw – dvoukrokové spektrální odečítání s dvoucestným usměrněním none – není použit žádný algoritmus zvýraznění řeči. -p [float] — Specifikace konfigurační proměnné p. Význam této proměnné závisí na použité metodě zvýrazňování řeči. V případě algoritmu exten určuje konstantu vyhlazování odhadu spektra šumu po filtraci Wienerovým filtrem, nepřímo tedy určuje hranici rozlišení mezi řečí a šumem. Její volba je pro funkci algoritmu kritická a doporučená hodnota je 0.95 [7]. Při malých hodnotách je řeč více zkreslena, ale algoritmus se rychleji adaptuje na
KAPITOLA 3. IMPLEMENTACE
35
změny spektra šumu. Při hodnotách blízkých jedné je řeč zkreslena méně, ale adaptace je pomalá. V případě algoritmů ss určuje p konstantu vyhlazování odhadu spektra šumu ze vstupního signálu (pokud v segmentu není přítomna řeč) – viz vztah 2.7 na str. 7, nepřímo tedy znamená maximální možnou rychlost časových změn spektra šumu. Vysoká hodnota zaručuje dlouhodobější odhad spektra šumu, při nízké hodnotě se naopak algoritmus rychleji adaptuje na změny tohoto spektra. Doporučená hodnota je současně výchozí hodnotou a je rovna 0.8. -b [float] — Specifikace konfigurační proměnné b. Význam proměnné opět závisí na metodě zvýrazňování řeči. Pro případ extenu není použita; pro algoritmy ss vyjadřuje faktor b ze vztahu 2.8. V ss2fw je napevno nastavena na 1, v ssfw je doporučená hodnota 1. V algoritmu sshw znamená vyšší hodnota b větší potlačení šumu, ale také větší zkreslení řeči a více tzv. parazitních hudebních zvuků, nižší hodnota znamená naopak menší potlačení šumu, ale i menší zkreslení [7]. Výchozí nastavení je 1. -a [float] — Specifikace konfigurační proměnné a. V případě použití extenu udává konstantu a ze vztahu 2.9, jejíž doporučená hodnota je a = 1. Při použití hodnoty a = 2 dochází k většímu zkreslení řeči. Za použití metod ss 12 udává mocninu spektra, použitou v celém průběhu spektrálního odečítání – viz výklad spektrálního odečítání v kap. 2. Pro algoritmus ssfw je doporučená hodnota 1, pro algoritmus sshw má vlastnosti podobné parametru b, tedy vyšší hodnota znamená větší potlačení šumu, nižší naopak menší zkreslení [7]. Výchozí nastavení je 2. -ninitsegs [int] — Počet inicializačních segmentů. Tato hodnota udává, během kolika prvních segmentů je VAD napevno nastaven na hodnotu “není řeč”, tj. průměruje se spektrum šumu - viz popis implementace spektrálního odečítání ss. Parametr má význam jen pro . Výchozí nastavení je 10. algoritmy ss -ncepcoefs [int] — Počet kepstrálních koeficientů použitých pro výstupní parametrický popis. Relevantní pro všechny tři metody parametrizace. Výchozí hodnota je 12. -nlpc [int] — Počet autoregresních koeficientů použitých pro výstupní parametrický popis, současně určuje řád LPC analýzy. Používá se při robustní LPC parametrizaci a při robustní PLP parametrizaci. Výchozí hodnota je 12. -nmelbands [int] — Počet filtrů neboli rozměr mel-spektra při robustní parametrizaci melovskou bankou filtrů. Výchozí hodnota je 20. -lofreq [float] — Dolní frekvenční hranice pro melovskou banku filtrů. Tato reálná hodnota v Hz by měla být v intervalu (0 . . . f2s ) Hz. Výchozí hodnota je 0. -hifreq [float] — Horní frekvenční hranice pro melovskou banku filtrů. Měla by být v intervalu (0 . . . f2s ) Hz a být větší než lofreq, CtuCopy to však kontroluje. Výchozí hodnota je fs /2. -fs [float] — Velikost vzorkovací frekvence v Hz. Tuto hodnotu je třeba specifikovat jenom v případě, že používáme CtuCopy jako parametrizátor, neboť je potřebná pro některé algoritmy, navíc se uvádí v hlavičce HTK souboru. Výchozí hodnota je 8000Hz. -nowarnings — Přepínač na vypnutí varovných hlášení objektu job. Hlášení se týkají nespecifikovaných nebo špatně specifikovaných parametrů, popř. jiných událostí. Jejich výpis není nezbytný. Výchozí nastavení – vypnuto, tj. varovná hlášení jsou vypisována. 12
v algoritmu ss2fw není použita, resp. je rovna jedné
KAPITOLA 3. IMPLEMENTACE
36
-h,-?, popř nesprávná syntaxe parametrů — Vypsání pomocného textu (v angličtině) se stručným popisem všech parametrů.
3.3.1
Příklad použití CtuCopy
zvýrazňovač řeči: ctucopy < input.bin > output.bin -w 512 -t hamm75 -m ss2fw -vad file aktivita.vad -p 0.9 Program čte data ze souboru input.bin po segmentech dlouhých 512 vzorků při segmentaci se 75% překryvem (v každém kroku se tedy načítá 128 vzorků), použije dvoukrokový algoritmus spektrálního odečítání s dvoucestným usměrněním s externím VAD a s konstantou zapomínání p = 0.9 a zvýrazněnou řeč ukládá do souboru output.bin. parametrizace: ctucopy < input.bin -o output.mfcc -omelcep -m exten -ncepcoefs 10 -fs 8000 -lofreq 300 -hifreq 3500 -c0 -energy Data jsou načítána ze souboru input.bin po segmentech dlouhých 256 vzorků s překryvem 50% (výchozí nastavení), je provedeno rozšířené spektrální odečítání s výchozím nastavením parametrů p a a, dále je provedena parametrizace mel-bankou filtrů o dvaceti pásmech (výchozí nastavení) pro vstupní spektrum v intervalu 300Hz – 3500Hz a výsledný parametrický popis kepstrálními koeficienty c0 – c10 plus energií segmentu je ukládán do souboru output.mfcc včetně hlavičky.
Kapitola 4
Experimenty Odladění všech funkčních jednotek programu proběhlo pod operačním systémem Red Hat Linux 6.2CZ, překlad do spustitelného kódu byl proveden pomocí C++ kompilátoru egcs 2.91.66, který je součástí distribuce. Při pokusu o překlad na jiných verzích operačního systému linux bylo zjištěno, že starší překladač egcs 2.90.29 neobsahuje veškeré potřebné knihovny a překlad programu není možný. Testování a experimenty s přeloženým programem proběhly na několika úrovních, za použití vstupních dat z těchto zdrojů: • česká databáze SpeechDat-E — signály nahrané z telefonní linky • databáze CAR2 — česká databáze signálů v autě • další signály převzorkované z vyšších frekvencí do 8kHz a 16kHz. Prvotní testy funkce jednotlivých bloků programu jsem provedl srovnáním výsledků dosažených pomocí CtuCopy a Matlabu. Tímto způsobem jsem ověřil všechny algoritmy parametrizace. Na této úrovni šlo především o odhalení eventuelních chyb v programu, vedoucích na zcela nesprávné výsledky, nikoliv o kvantitativní shodu hodnot v rámci několika řádů. Funkce metod na potlačování šumu byla ověřena poslechovými testy na signálech z databáze SpeechDat-E a na uměle vytvořených směsích řeči a šumu pro různé odstupy signálu od šumu SNR. Prováděl jsem orientační poslechy u všech implementovaných metod s příslušnými konfiguračními parametry. Další testování programu jsem provedl srovnáním vypočtených parametrizací pomocí CtuCopy a programu Hcopy ze systému HTK [2]. Protože Hcopy neimplementuje všechny algoritmy parametrizace použité v CtuCopy, test se mohl týkat pouze těchto: • LPC parametrizace bez použití spektrálního odečítání s výstupem autoregresních koeficientů a energie segmentu • LPC parametrizace bez použití spektrálního odečítání s výstupem LPC kepstrálních koeficientů a energie segmentu • robustní parametrizace melovskou bankou filtrů s výstupem mel-spektra a energie segmentu • robustní parametrizace melovskou bankou filtrů s výstupem mel-kepstra a energie segmentu
37
KAPITOLA 4. EXPERIMENTY
38
Pro případy robustní parametrizace melovskou bankou filtrů se shodovaly výsledky obou programů velice dobře, tj. rozdíly v hodnotách jednotlivých mel-kepstrálních koeficientů se pohybovaly v řádu jednotek procent. Pro případ LPC parametrizace se výsledky obou metod lišily, nicméně pokud jsem vypočítal na základě autoregresních koeficientů tvar přenosové funkce filtru, modelujícího tvar spektra, obě metody se téměř shodovaly. Vzhledem k různým způsobům implementace algoritmů do obou programů a dalším zjednodušením vedoucím ke zrychlení výpočtu je dosažená shoda výsledků dostatečná k ověření správné funkce CtuCopy. Dále jsem provedl experimenty s potlačováním šumu. Jako vstup i výstup programu jsem použil signál v časové oblasti. Signály jsem po výpočtu přenesl do Matlabu, analýzu jsem prováděl pomocí matlabovské funkce specgram a pomocí orientačního poslechu. Při volbě konfiguračních parametrů jsem se zaměřil především na vlastnosti související s následnou parametrizací signálu. Veškeré experimenty jsem prováděl se segmentací s délkou okna 256 vzorků a přesahem 50%. U metody rozšířeného spektrálního odečítání jsou volitelné dva parametry, integrační konstanta p a mocnina a přenosu Wienerova filtru1 . Pokud volíme konstantu a rovnu jedné, je řečový signál zkreslen minimálně, naopak volíme-li a rovnu dvěma, zkreslení je větší, šum je však v tomto případě potlačen podstatně více. Demonstruje to obr. 4.1. Recovy signal + stacionarni sum 8000
6000
6000 frekvence[Hz]
frekvence[Hz]
Recovy signal 8000
4000
2000
0
4000
2000
0
0.5
1
1.5 cas[s]
2
0
2.5
0
8000
6000
6000
4000
2000
0
1
1.5 cas[s]
2
2.5
Zvyraznena rec exten p=0.95, a=2
8000
frekvence[Hz]
frekvence[Hz]
Zvyraznena rec exten p=0.95, a=1
0.5
4000
2000
0
0.5
1
1.5 cas[s]
2
2.5
0
0
0.5
1
1.5 cas[s]
2
2.5
Obr. 4.1: Potlačení aditivního šumu metodou exten Na pozici vlevo nahoře je spektrogram čistého řečového signálu s promluvou „dva – osm – jedna – šestÿ, vzorkovaného s frekvencí 8000Hz. Na pozici vpravo nahoře je spektrogram téhož signálu s přimíchaným stacionárním aditivním šumem 10dB. Signál vlevo dole byl získán pomocí 1
viz oddíl CtuCopy z hlediska uživatele
KAPITOLA 4. EXPERIMENTY
39
algoritmu exten s parametry p = 0.95 a a = 1, signál vpravo dole s parametry p = 0.95 a a = 2. Z obrázku je vidět, že stacionární složky jsou potlačeny více při volbě konstanty a = 2. Ze spektrogramu však již není patrné, že při větším potlačení šumu je signál znatelně zkreslen – to lze rozeznat při poslechu. Zkreslení není kritické, pokud je metoda použita ke zvýrazňování řeči. Pokud ovšem předpokládáme následnou parametrizaci, je nutné volit konstantu a rovnu jedné. Druhým volitelným parametrem metody exten je integrační konstanta p. Vliv změn tohoto koeficientu na kvalitu parametrizace a potažmo na celkovou úspěšnost rozpoznávání zatím nebyl podrobně zkoumán. Podobná analýza totiž představuje opakované výpočty parametrizace a přetrénovávání HMM rozpoznávače na velkém objemu dat, což je náročné jak na výpočetní prostředky, tak na čas. Analýze tohoto problému bych se rád částečně věnoval v rámci postgraduálního studia. Všechny implementované metody zvýrazňování řeči, použité v této práci, vycházejí z předpokladu stacionarity či kvazistacionarity aditivního šumu. V případě nedodržení těchto podmínek, při rychlých změnách šumového pozadí, mohou metody selhat, neboť se nedokáží adaptovat na nové šumové pozadí. Příkladem toho může být obr. 4.2. Vlevo nahoře je spektrogram vstupního Recovy signal + nestacionarni sum 4000
3000
3000 frekvence[Hz]
frekvence[Hz]
Recovy signal 4000
2000
1000
0
2000
1000
0
0.5
1
0
1.5
0
0.5
cas[s]
1.5
Zvyraznena rec ss2fw p=0.8 4000
3000
3000 frekvence[Hz]
frekvence[Hz]
Zvyraznena rec exten p=0.95, a=2 4000
2000
1000
0
1 cas[s]
2000
1000
0
0.5
1 cas[s]
1.5
0
0
0.5
1
1.5
cas[s]
Obr. 4.2: Vliv náhlé změny spektra šumu na metody exten a ss2fw signálu. Jedná se o promluvu „ jedna – šestÿ, slovo „šestÿ není celé. Vzorkovací kmitočet je 8kHz. Vpravo nahoře je tatáž promluva s přimíchaným syntetickým aditivním šumem 10dB. Jedná se o ostrý přechod dvou barevných šumů, vzniklých filtrací bílého šumu. V první polovině časového průběhu má šum střed pásma kolem 1200Hz, v druhé polovině kolem 600Hz. Vlevo dole je zobrazena rekonstrukce řeči pomocí metody exten s parametry p = 0.95 a a = 2. Je patrné, že
KAPITOLA 4. EXPERIMENTY
40
algoritmus se na nové šumové pozadí v druhé polovině signálu adaptoval velice rychle. Naopak metoda ss2fw, tj. dvoukrokové spektrální odečítání s dvoucestným usměrněním (vpravo dole) a s parametrem p = 0.8 se nedokázala přizpůsobit novému spektru šumu vůbec. V druhé polovině je znatelně zvýšená výkonová hustota v pásmu kolem 1200Hz přesto, že se v signálu tento šum již nevyskytuje. Plyne to z dvoucestného usměrnění spektra po spektrálním odečítání, kdy se neopravený špatný odhad šumu zrcadlí na místo původního výskytu. Rovněž druhá složka šumu se středem pásma kolem 600Hz není příliš potlačena. Předpoklad stacionarity či kvazistacionarity šumu musí být splněn zejména s ohledem na parametrizaci signálu. Pokud by totiž selhala metoda potlačování šumu podobně jako na uvedeném příkladě, do algoritmů pro výpočet parametrického popisu by se dostával chybný odhad spektra, obsahující i šumovou složku a vlivem velké citlivosti některých navazujících metod na šum (zejména LPC analýzy) by se parametrizace mohla zcela znehodnotit. Další experimenty prováděné s CtuCopy se měly týkat již přímo parametrizace databáze signálů, následného rozpoznávání a vyhodnocení úspěšnosti použitých metod. Výsledky se měly porovnat i s úspěšností rozpoznávání na základě parametrizace programem Hcopy. K experimentům byla zvolena databáze SpeechDat-E v konkurenci s databází CAR2, a to z následujících důvodů. CAR2 sice obsahuje signály více rušené, kde by se uplatnily robustní parametrizační metody lépe, než na SpeechDat-E, nicméně aby měly výsledky dostatečnou vypovídací hodnotu a abychom mohli postihnout rozdíly v úspěšnosti parametrizačních metod, musí se rozpoznávač trénovat na velkém objemu dat, který v případě CAR2 nemáme k dispozici. Pakliže chceme skutečně objektivně vyhodnotit úspěšnost metod, musíme vytvořit inicializační HMM fonémů bez jakýchkoliv již známých modelů z průměrných kepster (resp. jiných parametrů) a modely pak natrénovat z této inicializace, aby měly všechny hotové HMM stejné výchozí podmínky. Pokud ale trénujeme modely z inicializace průměrnými kepstry, potřebujeme k dostatečnému natrénování větší počet dat, než kdybychom přetrénovávali modely již známé. Z tohoto důvodu by experimenty, pořizované na CAR2, neměly tak spolehlivé výsledky jako u SpeechDat-E, byť bychom naopak rozdíly v kvalitě parametrizace CtuCopy oproti standardní parametrizaci pomocí Hcopy očekávali u CAR2 větší. První navržené parametrizace: • preemfáze s koeficientem 0.97 (realizuje se pomocí externího programu filter, robustní parametrizace melovskou bankou filtrů bez potlačování šumu s konfigurací: nmelbands = 20, ncepcoefs = 12, energy = TRUE • preemfáze s koeficientem 0.97, robustní PLP parametrizace bez potlačování šumu s konfigurací: ncepcoefs = 6, nlpc = 6, energy = TRUE • preemfáze s koeficientem 0.97, robustní parametrizace melovskou bankou filtrů s potlačováním šumu metodou exten s konfigurací: p = 0.95, a = 1, nmelbands = 20, ncepcoefs = 12, energy = TRUE • preemfáze s koeficientem 0.97, robustní PLP parametrizace s potlačováním šumu metodou exten s konfigurací: p = 0.95, a = 1, ncepcoefs = 6, nlpc = 6, energy = TRUE. Ačkoliv již proběhly první parametrizace databáze SpeechDat-E pomocí CtuCopy, dosud se nepodařilo natrénovat rozpoznávač a provést pokusy s rozpoznáváním, neboť odevzdání navazující diplomové práce J. Žďánského „?????ÿ bylo posunuto až na červen 2002. Rovněž byly odloženy parametrizace pomocí jednotky ss, neboť se ukázalo, že kepstrální detektor řečové aktivity na databázi SpeechDat-E selhává.
Kapitola 5
Závěr - β verze Doposud implementované a používané metody robustní parametrizace řečového signálu využívají ke zvýšení odolnosti vůči šumu různých technik, např. modifikace výkonových spekter ještě před autoregresním modelováním, transformace spektra pomocí bank filtrů apod. [5] Metody spektrálního odečítání byly v této souvislosti použity vždy odděleně od vlastního parametrizačního algoritmu. Takový postup představuje po spektrálním odečítání přechod zpět do časové oblasti pomocí inverzní diskrétní Fourierovy transformace a další režii spojenou s předáváním dat. Pokud však integrujeme algoritmus spektrálního odečítání do parametrizačního postupu, uvedená transformace do časové oblasti již není nutná a takto navržené metody dosahují výrazného ušetření potřebného počtu operací, viz (zatím nenapsáno). Program CtuCopy využívá objektových nástrojů jazyka C++ k co nejflexibilnější integraci navržených metod robustní parametrizace do samostatně spustitelné jednotky, nezávislé na platformě. Tento přístup přináší dvě základní výhody. Jednou je zmenšení výpočetních a paměťových nároků a druhou je zapouzdření struktury funkčních bloků parametrizace. Zapouzdření představuje možnost kontroly správného sestavení řetězce dílčích kroků výpočtu programem, a tím i eliminaci eventuelních chyb při nesprávně předávaných datech. Program je rozšiřitelný o další funkční jednotky, z nichž první vzniká v rámci diplomové práce A. Fidranského „?????ÿ. Do programu byly implementovány všechny navržené parametrizační postupy. Funkce programu byla ověřena pomocí testů, uvedených v kapitole Experimenty. Některé metody a jejich vzájemné vazby nejsou zatím optimalizovány z hlediska rychlosti výpočtu. Na základě výsledků dosud nedokončených experimentů s rozpoznáváním řeči se předpokládájí dílčí úpravy použitých parametrizací, např. implementace preemfáze apod. Těmto úkolům, spolu s již zmíněnými experimenty s vlivem konfiguračních parametrů na úspěšnost rozpoznávání, bych se chtěl věnovat v rámci nadcházejícího postgraduálního studia.
41
Literatura [1] Rabiner, L.; Biing-Hwang, J : Fundamentals of Speech Recognition, Prentice Hall, 1993. [2] Young, S.; Kershaw, D; Odell, J.; Ollason, D.; Valchev, V.; Woodland, P. : The HTK Book, version 2.2, Entropic Ltd., 1999. [3] Uhlíř, J.; Sovka, P. : Číslicové zpracování signálů, Vydavatelství ČVUT, 1995. [4] Davídek, V.; Sovka, P. : Číslicové zpracování signálů a implementace, Vydavatelství ČVUT, 1999. [5] Heřmanský, H. : Perceptual linear predictive (PLP) analysis of speech, J. Acoust. Soc. Am., Vol. 87, No. 4, April 1990. [6] Sovka, P.; Pollák, P.; Kybic, J. : Extended spectral subtraction, EUROSIPCO ‘96, Trieste, 1996. [7] Pollák, P. : Spektrální odečítání pro potlačování šumu v řeči snímané v jedoucím automobilu, kandidátská disertační práce, FEL ČVUT, Praha, 1993. [8] Vopička, J.; Pollák, P.; Sovka, P., Uhlíř, J. : Phoneme Model Based ASR of Words in Car Environment, Proceedings of the 1999 Polish-Hungarian-Czech Workshop on Circuit Theory, Signal Processing, and Applicatins, Herbertov, 1999. [9] Zápisy z přednášek předmětu CZS - Číslicové zpracování signálu prof. P. Sovky, 2000. [10] Zápisy z přednášek předmětu ASI - Algoritmy zpracování signálů prof. P. Sovky, 2000. [11] Brookes, M. : Speech processing lectures, pdf dokument z http://www.ee.ic.ac.uk/hp/staff/dmb/dmb.html, Imperial College of Science, Technology and Medicine, 2001. [12] Seltzer, M. : SPHINX III Signal Processing Front End Specification, pdf dokument, Dept. of Electrical & Speech Engineering, Carnegie Mellon University, Pittsburgh, 1999. [13] Kalný, P. : Dokumentace k programu VDET, Katedra teorie obvodů ČVUT, 2001. [14] Novotný, J. : Potlačování aditivních šumů pro účely rozpoznávání, diplomová práce, Katedra teorie obvodů FEL ČVUT, 2001.
42