Formant-Analysen von Vokalen Ellipse-Darstellung ungespannter Vokale Ausreißer identifizieren Sprecher-Normalisierung Im Original von Jonathan Harrington Die Sprechdaten Ungespante ["E" "a" "I" "O"] deutsche Vokale Sprecher 67 (M) und Sprecherin 68 (W) Standard-Norddeutsche Sprecher, Vokale aus 100 gelesenen Sätzen. data(package="emu") bzw. über R-Menü „Pakete“ das emu Paket laden (emu-Paket muss vorher installiert worden sein) vowlax vowlax.fdat vowlax.l … vowlax.spkr Segmentliste Trackdatei F1-F4 Etikettierungen "E" "a" "I" "O" Sprecher-Etikettierungen "67" "68" vowlax vowlax.fdat vowlax.l … vowlax.spkr Segmentliste Trackdatei F1-F4 Etikettierungen "E" "a" "I" "O" Sprecher-Etikettierungen "67" "68" Formanten (F1-F4) zum zeitlichen Mittelpunkt mid = Nur F1 und F2 dcut(vowlax.fdat, .5, prop=T) mid = mid[,1:2] 1. Ellipse-Abbildungen vowlax vowlax.fdat vowlax.l vowlax.spkr Segmentliste Trackdatei F1-F4 Etikettierungen "E" "a" "I" "O" Sprecher-Etikettierungen "67" "68" mid = dcut(vowlax.fdat, .5, prop=T) mid = mid[,1:2] Logischer Vektor um Sprecher “67” zu identifizieren vowlax.spkr==“67” temp = Ellipsen Sprecher 67 Sprecherin 68 eplot(mid[temp,], vowlax.l[temp], dopoints=T, form=T) 600 400 III I II II III E III IIII I I I IIIIIIIIIIIIIIIIIE III I I II I II II II IIIE IIIE I O EE O II E I EIIE II E E E I EE E EE II I O O O O a E EE E E EE O OO aO O EE EE OO a EEE EE a a O a a a O E EE E a aaa O a a aaaaa aaaaa a E a a a a aaa aa aa a a a a a E aaaaaa a a a a aa a a aa a a a a a 800 I I I I I II I I I E III I I IIIIIIII I I I I I I II I IIIII I IIIII III I I I I I I I I II I E I III I I I III II O I II IE I a I E EEEE E O Ea a aO EE EEEEEE a a aaa E EEEE OOO OO EE EE E E a O E aE O O O O E Ea E aaaaaaaa O a E E E a aaa a a aa aaaa aa aa a a aaO a a aaa aa a a a a a aa a 1000 I I I I II F1 800 700 600 500 400 300 F1 I Mit !temp statt temp a 2000 1500 1000 3000 2500 2000 F2 F2 1500 1000 Mehrere Abbildungen gleichzeitig Eine Reihe, zwei Spalten par(mfrow=c(1,2)) eplot(mid[temp,], vowlax.l[temp], dopoints=T, form=T) eplot(mid[!temp,], vowlax.l[!temp], dopoints=T, form=T) wieder auf eine Reihe x eine Spalte setzen par(mfrow=c(1,1)) Info zu eplot() args(eplot) Eine Ellipse für alle Daten eplot(mid[temp,]) help(eplot) Eine Ellipse pro Kategorie eplot(mid[temp,], vowlax.l[temp]) Mit Mittelpunkt-Beschriftung eplot(mid[temp,], vowlax.l[temp], centroid=T) dopoints: eine entsprechende Etikettierung pro Wert eplot(mid[temp,], vowlax.l[temp], dopoints=T) Achsen drehen (nur für F1 x F2 Abbildungen) eplot(mid[temp,], vowlax.l[temp], centroid=T, form=T) Keine Ellipsen eplot(mid[temp,], vowlax.l[temp], centroid=T, doellipse=F) Farben variieren Keine Farben eplot(mid[temp,], vowlax.l[temp], centroid=T, col=F) eplot(mid[temp,1:2], vowlax.l[temp], centroid=T, col=c("pink", "red", "blue", "green")) Linientyp eplot(mid[temp,], vowlax.l[temp], centroid=T, linetype=T) Achsen Beschriftung eplot(mid[temp,], vowlax.l[temp], form=T, main="Vokale", xlab="F2 (Hz)", ylab="F1 (Hz)") Bereiche setzen x = c(500, 3000) y= c(0, 1000) eplot(mid[temp,], vowlax.l[temp],form=T, xlim=x, ylim=y) 2. Ausreißer identifizieren Vokale des weiblichen Sprechers Formanten zum zeitlichen Mittelpunkt 600 1000 800 F1 400 III I II II III E III IIII I I I IIIIIIIIIIIIIIIIIE II I II I II II II IIIE IIII II O E E O II I IIE IE IE E E E E I EE EE EE II I OO O EE E E EE OaOOO aO O EE E O E a EEE EE aa a OO O a E EE a E a aaa O a a aaaaa aaaaa a E aaaaa aa aa aa a a a a a E aaaaaa a a a a aa a a aa a a a a a 3000 2500 2000 1500 1000 Ein Spektrogramm dieses Vokales in Emulabel darstellen. vowlax vowlax.fdat vowlax.l vowlax.spkr Segmentliste Trackdatei F1-F4 Etikettierungen "E" "a" "I" "O" Sprecher-Etikettierungen "67" "68" F2 mid = dcut(vowlax.fdat, .5, prop=T) Logischer Vektor: F1 ist mehr als 800 und der Vokal ist “E” und die Sprecherin ist “68” temp = mid[,1] > 800 & vowlax.l == "E" & vowlax.spkr == "68" Äußerung identifizieren: vowlax[temp,] oder utt(vowlax[temp,]) 3. Sprechernormalisierung Frauen haben kürzere Vokaltrakte, daher eine Erhöhung der Formanten für den selben phonetischen Vokal. Bei Kindern ist der Vokaltrakt noch kürzer und daher sind die Formanten noch höher. Dies führt zu Vokalüberlappung. zB die Formanten eines männlichen [a] haben oft denselben Wert wie diejenigen eines [o] Vokals von einem Kind. Peterson & Barney (1952): Vokale von 76 Männern, Frauen, und Kindern. 1000 F1 600 400 I I III I E I I IIIII IIIIIIIIIIIIIIIIIIII IIII I I II IIIIIIIE IIIII IIIIO III I I IE a E E E E EE E a a aaO O E aO O EE E E E OO E EE a EE a O E a EE O E O E a E EE a O E a E a O a E a a EE aaa a a a aaa a a aa O a a aaaaaaa aa a 600 400 Sprecher 68 1000 1500 900 800 700 600 500 400 300 2500 F1 F1 Sprecher 67 III I I III E IIIIII I I IIIIIIIIIIIIIIIIIIIIE I II II IE IEIE O I II II E I I IE E E E E I II I I aO E E E E O O OO E EE EE O EEE a O O E E E OaO E E O E EE O a E EE E aa a O aa a a a O a a aaaaaa aaa aa E E a aa aa a aa a a aa aaaaaaa a aaaaa a a aa a a a a a 2500 F2 1500 F2 I I E E O O a a 2500 2000 1500 F2 1000 Vokalnormalisierung wie wird derselbe phonetische Vokal trotz dieser sprecherbedingten Unterschiede wahrgenommen? Wie können sprecherbedingte Merkmale im akustischen Signal entfernt werden? Normalisierung Die Trennung phonetischer und sprecherbedingter Eigenschaften intrinsisch Wird auf einzelne Vokale durchgeführt, ohne die anderen Vokale desselben Sprechers zu berücksichtigen extrinsisch Die Normalisierung eines Vokals braucht eine Stichprobe von Vokalen desselben Sprechers (zB [i a u]) Die extrinsische Normalisierung Joos (1948) Die Vokale eines Sprechers werden im Bezug zu seinem/ihrem [i u a] wahrgenommen. Daher ist die Entfernung von z.B. [E] zu den Eckvokalen ca. dieselbe für verschiedene Sprecher. Ladefoged & Broadbent (1957) Synthese von ‘Please say the word bVt’, in dem F1 variiert wurde. Je höher F1, umso mehr verschiebt sich die Wahrnehmung von ‘bet’ nach ‘bit’ Dagegen Verbrugge et al (1976, JASA). Hörer identifizieren Vokale genau, auch wenn sie den Sprecher zum ersten Mal hören. Extrinsische Normalisierung (Lobanov, 1971) (Standard-Normalisierung) Normalisierte Formantwerte = (Formantwerte – m)/s m und s sind der Durchschnitt und die Standardabweichung eines Formanten (zB F1) eines Sprechers F1 220 550 300 700 400 F1-m -214 116 -134 266 -34 (F1-m)/s -1.11 0.60 -0.69 1.38 -0.18 m= 434 Hz, s = 193.1 Hz f = c(220, 550, 300, 700, 400) R Befehl für (f-m)/s (f - mean(f))/sd(f) In eine Funktion packen – damit sie auf beliebiege Formant-Daten angewendet werden kann… Funktionen schreiben Mit default probe <- function(x, y) probe <- function(x=20, y=30) { { # summiert x und y x+y } # summiert x und y x+y } probe(20, 30) probe() Funktionen schreiben Das Ergebnis einer Funktion ist die letzte Zeile ohne = probe <- function(x=20, y=30) { # summiert x und y etwas = x + y etwas } probe() f = c(220, 550, 300, 700, 400) R Befehl für (f-m)/s (f - mean(f))/sd(f) In eine Funktion snorm(f) packen – damit sie auf beliebiege Formant-Daten angewendet werden kann… snorm <- function(f) { (f - mean(f))/sd(f) } mat = cbind(c(10, 20, 30), c(5, 8, 8)) mat Durchschnitt Spalte 1: [,1] [,2] [1,] 10 5 [2,] 20 8 [3,] 30 8 mean(mat[,1]) Durchschnitt Spalte 2: mean(mat[,2]) Durchschnitt beider Spalten gleichzeitig: apply(mat, 2, mean) [1] 20 7 Bedeutung von apply(mat, 1, mean) Durchschnitt der Reihenwerte apply(mat, 2, sd) Standardabweichung der Spaltenwerte Wie kann ich unsere snorm() Funktion auf beide Spalten von mat anwenden? apply(mat, 2,snorm) vowlax vowlax.fdat vowlax.l vowlax.spkr Segmentliste Trackdatei F1-F4 Etikettierungen "E" "a" "I" "O" Sprecher-Etikettierungen "67" "68" mid = dcut(vowlax.fdat, .5, prop=T) mid = mid[,1:2] Normalisierte F1 und F2 Werte zum zeitlichen Mittelpunkt, Sprecher 67? Logischer Vektor temp = vowlax.spkr=="67" Normalisierte Werte, Sprecher 67 fnorm.67 = apply(mid[temp,1:2], 2, snorm) Normalisierte Werte Sprecher 68 fnorm.68 = apply(mid[!temp,1:2], 2, snorm) Sprecher 67 (links), Sprecherin 68 (rechts) normalisierte F1 x F2 xlim = ylim = c(-2.5, 2.5) par(mfrow=c(1,2)) eplot(fnorm.67, vowlax.l[temp], dopoints=T, form=T, xlim=xlim, ylim=ylim) 2 1 0 F2 -1 -2 -2 1 0 -1 III IIII III E I IIIIIIIIIIIIIIIIIE IIIIIIII I I II II II IIEE II I II II O E IIE I IE E E E E I I O O I E E E E O I aOOO EE EE O EEE E a O O E E Oa EE E E O E EE E aa aO O a E E a a E a aaaO a aaaaaaaaaa a E aaaa a a aaa a aa aaa aaa E aaaa a aaa aa aa a a a a a 2 I I I I I I IIII I I E III I I I I I IIIIIIIII I I II I I I I I I I I I I II II II III I I I I I I III E I II I I I IIEI III II O I a I EEEEE a E aO O E EEEEE E aaaa E E E E EEE OOOO E a E a EEE EE E aEa O OO O O O a a E Ea aEa a a EE aaa aa aO aaaaaa aa a aaaO a a a a a a a a a a aa a aa a a F1 0 1 2 F1 -1 -2 eplot(fnorm.68, vowlax.l[!temp], dopoints=T, form=T, xlim=xlim, ylim=ylim) 2 1 0 F2 -1 -2 Extrinsische Normalisierung (Nearey, 1978) Normalisierte Formantwerte = Log. (Formantwerte) – k k ist ein sprechabhängiger Konstant Normalisierung laut Nearey f1 = c(220, 550, 300, 700, 400) f2 = c(2000, 1800, 1900, 1500, 600) 1. Sprecherbedingter konstant, k, berechnen (a) F1 und F2 in Logarithmen umwandeln logf1 = log(f1) logf2 = (b) Durchschnitt von log. F1 berechnen mlogf1 = mean(logf1) (c) Durchschnitt von Log F2 berechnen mean(logf2) mlogf2 = k ist der Durchschnitt von (a) und (b) k= mean(c(mlogf1, mlogf2)) log(f2) f1 = c(220, 550, 300, 700, 400) f2 = c(2000, 1800, 1900, 1500, 600) Normalisierter F1 ist der Logarithmus davon minus k normf1 = log(f1) - k Ebenfalls für den normalisierten F2 normf2 = log(f2) - k Funktion schreiben, nearey(x) um NeareyNormalisierung auf eine 2-spaltige Matrix, x, (von F1 und F2 Werten) anzuwenden. > form = cbind(f1, f2) > form f1 f2 [1,] 220 2000 [2,] 550 1800 [3,] 300 1900 [4,] 700 1500 [5,] 400 600 > nearey(form) f1 f2 [1,] -1.23698013 0.9702948 [2,] -0.32068940 0.8649343 [3,] -0.92682520 0.9190015 [4,] -0.07952734 0.6826127 [5,] -0.63914313 -0.2336780 nearey <- function(x) # x ist eine Matrix { # (a) Log-Werte der Matrix logmat = log(x) # Vektor der Durchschnitte deren Spaltenwerte logmat.m = apply(logmat, 2, mean) # (b) Sprecherabhängiger konstant k= # (a) – (b) logmat – k } mean(logmat.m) Abbildung F1 x F2, Nearey-normalisierte Daten, Sprecher 67 (links), Sprecherin 68 (rechts) temp = vowlax.spkr=="67" n67= nearey(vowlax.fdat.5[temp,1:2]) n68 = nearey(vowlax.fdat.5[!temp,1:2]) ylim = c(-1.5, 0.2) xlim = c(-.2, 1.2) eplot(n67, vowlax.l[temp], dopoints=T, form=T, xlim=xlim, ylim=ylim, main="67") eplot(n68, vowlax.l[!temp], dopoints=T, form=T, xlim=xlim, ylim=ylim, main="68") -1.5 68 -1.5 67 1.2 1 0.8 0.4 F2 0 -1 -0.5 0 I III I IIIIIIEII I I I I IIIIIIIIII II I I IIIIII IIII II II III I I I II I IIIIE I I I II IIIIO I IEIE I a I E E EE E E aa a OO O E E E E EE E aaaOaaa E EE OO EE O E O E EE E E E a E O O E a a E O aaaaaaaO aa EEEEaaa a a a a a a a aaa aaaa aaaaaaO aaa aaa a F1 -0.5 0 F1 -1 I III III I I I IIIII IIIIIIE I I IIIIIIIIIIIIIIE IIIIIII I I I II I IIIIE O IIII I I I E E O E I E IE II EIIE EE I I O I E E EE EEI aOO EE O OO EE O EEE a O O E E EE Oa E O E E EEE aa a O O a aa EEa aaaO aaa a a a a a aaa a aa E a a aaa a a aa a aaaaaaa a a Eaaa a a a a a a a a aa a 1.2 1 0.8 0.4 F2 0