Textovou (řetězcovou) funkci
index můžeme využít k hledání cílových hlásek (například všech frikativ) v TextGridu. Základní struktura vypadá takto:
index(a$, b$). Zjišťuje, zda se řetězec
b$ nachází v řetězci
a$.
Na začátku skriptu definujeme cílové hlásky jako textovou proměnnou, jejíž členy budou odděleny mezerami. Př.:
frikativy$ = "f v s z š ž x h" ; pozn. [x] je symbol po české ch
|
Po zjištění aktuální hlásky pak vložíme podmínku s použitím funkce index. Zároveň musíme přidat podmínku, která vyloučí prázdné intervaly (protože prázdný řetězec je „nalezen“ vždy). Celá podmínka bude vypadat takto:
if (index (frikativy$, label$)) and (label$ <> "")
|
Pozor! Funkce index skutečně jen zjišťuje, zda se druhý řetězec nachází v prvním řetězci. Výše uvedený způsob zápisu může být proto velmi nebezpečný v tom, že skript bude ve skutečnosti dělat něco jiného, než jsme zamýšleli. Pokud např. definujeme následujícím způsobem seznam dlouhých vokálů, budeme možná nepříjemně překvapeni, že budou nacházeny i krátké vokály. Ale skutečně je tomu tak, protože samotné znaky i e a o u jsou také součástí tohoto řetězce. A pokud bude label intervalu obsahovat znak mezera, i takový interval bude vyhodnocen jako vyhovující.
vokaly$ = "i: e: a: o: u:"
|
Použití funkce index proto vyžaduje vysokou obezřetnost a v současné době ho již vyučující předmětu Akustika řeči nedoporučuje, protože může napáchat více škody než užitku. Naprosto bezpečné řešení, přitom ne o moc pracnější (použijeme-li schránku pro kopírování opakujících se částí) je vyjmenovat požadované labely jako samostatné jasně ohraničené řetězce ve vícenásobné podmínce:
if label$ = "i:" or label$ = "e:" or label$ = "a:" or label$ = "o:" or label$ = "u:"
|
Následující skript měří formanty v prostřední třetině krátkých vokálů (monoftongů):
zvukID = selected ("Sound")
textID = selected ("TextGrid")
select zvukID
To Formant (burg)... 0 3 3000 0.025 50
formantID = selected ("Formant")
vokaly$ = "i i: e e: a a: o o: u u:"
select textID
no = Get number of intervals... 1
for i from 1 to no
select textID
label$ = Get label of interval... 1 i
if label$ = "i" or label$ = "e" or label$ = "a" or label$ = "o" or label$ = "u"
a = Get start point... 1 i
b = Get end point... 1 i
c = a + (b-a)/3
d = b - (b-a)/3
select formantID
f1 = Get mean... 1 c d Hertz
f2 = Get mean... 2 c d Hertz
printline 'label$''tab$''f1:1''tab$''f2:1'
endif
endfor
|