210 likes | 320 Views
Formant-Analysen von Vokalen. Jonathan Harrington. Ellipse-Darstellung von Vokalformanten. Ausreißer identifizieren. Vokal-Targets setzen. Literatur: http://www.phonetik.uni-muenchen.de/~jmh/research/emupapers/pasc.pdf Kap. 3 (S. 74-123). 1. Ellipse-Abbildungen. vowlax Segmentliste
E N D
Formant-Analysen von Vokalen Jonathan Harrington Ellipse-Darstellung von Vokalformanten Ausreißer identifizieren Vokal-Targets setzen Literatur: http://www.phonetik.uni-muenchen.de/~jmh/research/emupapers/pasc.pdf Kap. 3 (S. 74-123)
1. Ellipse-Abbildungen vowlax Segmentliste vowlax.fdat Trackdatei F1-F4 vowlax.rms Trackdatei dB-RMS vowlax.lEtikettierungen "E" "a" "I" "O" vowlax.spkr Sprecher-Etikettierungen "67" "68" Formanten (F1-F4) zum zeitlichen Mittelpunkt mid = dcut(vowlax.fdat, .5, prop=T) mid = mid[,1:2] Nur F1 und F2
1. Ellipse-Abbildungen I I I I I I I E I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I E I I I I I I I I I I I I I I I O I I I I I I I E a I E E E E E E E E a a O a E E E O a E E a E a E E E O E E E E E a E a O E E E E a E O E E E E a E a E a a a E a a a a O a a E a a E a a a a a a a a a a E a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a vowlax Segmentliste vowlax.fdat Trackdatei F1-F4 vowlax.l Etikettierungen "E" "a" "I" "O" vowlax.spkr Sprecher-Etikettierungen "67" "68" dcut(vowlax.fdat, .5, prop=T) mid = 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) Mit !temp statt temp 300 400 O 500 O O O F1 O O O O 600 O 700 800 2000 1500 1000 F2
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) help(eplot) Eine Ellipse für alle Daten Eine Ellipse pro Kategorie eplot(mid[temp,]) 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 und andere Linien, größere Liniendichte eplot(mid[temp,], vowlax.l[temp], centroid=T, col=F, line=T) eplot(mid[temp,1:2], vowlax.l[temp], centroid=T, col=c("pink", "red", "blue", "green"))
x = c(500, 3000) y= c(0, 1000) eplot(mid[temp,], vowlax.l[temp],form=T, xlim=x, ylim=y) Achsen Beschriftung eplot(mid[temp,], vowlax.l[temp], form=T, main="Vokale", xlab="F2 (Hz)", ylab="F1 (Hz)") Bereiche setzen
2. Ausreißer identifizieren vowlax Segmentliste vowlax.fdat Trackdatei F1-F4 vowlax.l Etikettierungen "E" "a" "I" "O" vowlax.spkr Sprecher-Etikettierungen "67" "68" F1 x F2 Abbildung zum Segment-Onset, "I" Vokale, Sprecher 67
vowlax Segmentliste vowlax.fdat Trackdatei F1-F4 vowlax.l Etikettierungen "E" "a" "I" "O" vowlax.spkr Sprecher-Etikettierungen "67" "68" A. Logischer Vektor um die "I" Vokale vom Sprecher 67 zu identifizieren vowlax.spkr=="67" & vowlax.l == "I" temp = B. Matrix, F1-F2 zum Segment-Onset der "I" Vokale vom Sprecher 67 on = dcut(vowlax.fdat[temp,1:2], 0, prop=T) C. Labels die dazu passen Oder labs = labs= rep("I", sum(temp)) vowlax.l[temp] D. Eine dazu passende Segmentliste seg = vowlax[temp,] seg segment list from database: kielread06 query was: Kanonic=a | E | I | O labels start end utts 4 I 1670.940 1710.690 K67MR001 5 I 2093.000 2144.190 K67MR001 7 I 538.687 595.187 K67MR003 ...
on Matrix. F1, F2 zum Segment-Onset labs Vektor von "I" Labels seg Dazu passende Segmentliste E. Abbildung (Achsen nicht drehen) eplot(on, labs, dopoints=T, xlab="F1-Onset", ylab="F2-Onset") F. Ausreißer identifizieren Logischer Vektor wenn F2 dieser "I" Vokale weniger als zB 100 Hz ist on[,2] < 100 temp =
temp = on[,2] < 100 G. Kann man diesen Befehl modifizieren, um den Ausreißer zu entfernen? eplot(on, labs, dopoints=T, xlab="F1-Onset", ylab="F2-Onset") eplot(on[!temp,], labs[!temp], dopoints=T, xlab="F1-Onset", ylab="F2-Onset")
on Matrix. F1, F2 zum Segment-Onset labs Vektor von "I" Labels seg Dazu passende Segmentliste temp = on[,2] < 100 Alternative Lösung: der Segment wird identifiziert, um den Formant-Fehler in EMU zu korrigieren. H. Der entsprechende Segment (also die Segmente, für die F2 weniger als 100 Hz ist) seg[temp,] segment list from database: kielread06 query was: Kanonic=a | E | I | O labels start end utts 194 I 911.563 964.625 K67MR096
on Matrix. F1, F2 zum Segment-Onset labs Vektor von "I" Labels seg Dazu passende Segmentliste I. (Nach der Korrektur) Formanten-Trackdatei aus seg form = emu.track(seg, "fm") J. Neue F1 und F2 zum Segment-Onset on2 = dcut(form[,1:2], 0, prop=T) K. Ellipse-Abbildung eplot(on2, labs, dopoints=T, xlab="F1-Onset", ylab="F2-Onset")
3. Vokalzielposition setzen wird oft zum 50% Zeitpunkt genommen, da hier der Vokal am wenigsten vom Kontext beeinflusst wird. Manchmal auch für offene und halb-offene Vokale: der Zeitpunkt, zu dem ein F1-Maximum erreicht wird (weil hier im Gegensatz zu Konsonanten der Vokaltrakt maximal offen ist).
vowlax Segmentliste vowlax.fdat Trackdatei F1-F4 vowlax.l Etikettierungen "E" "a" "I" "O" vowlax.spkr Sprecher-Etikettierungen "67" "68" Abbildung F1 vom ersten Segment von vowlax als Funktion der Zeit: plot(vowlax.fdat[1,1]) v = locator(1) Linke Maustaste klicken, um eine Vertikale Linie zu diesem Zeitpunkt zu überlagern abline(v=v) Der ms-Wert der Linie v$x
Die F1-Werte vom ersten Segment w = vowlax.fdat[1,1]$data w Die Zeiten, zu denen diese Werte vorkommen. T1 857.5 372 862.5 412 867.5 467 872.5 506 877.5 532 882.5 547 887.5 556 892.5 561 897.5 562 902.5 556 907.5 550 912.5 538 917.5 525 922.5 521 927.5 517 932.5 504 937.5 494 942.5 492 zeit = tracktimes(w) zeit Logischer Vektor: T wenn w ein Maximum erreicht temp = w == max(w) Die entsprechende Zeit dieses Maximums zeit[temp] [1] 897.5
In eine Funktion packen: mzeit <- function(werte) { zeit = tracktimes(werte) temp = werte == max(werte) # Sollte es 2 Maxima geben, nimm den ersten zeit[temp][1] } Der Zeitpunkt, zu dem zuerst w ein Maximum erreicht mzeit(w) Die mzeit() Funktion auf die Trackdatei andwenden: f1zeit = by(vowlax.fdat[,1], mzeit, simplify=T)
Überprüfen für die ersten 10 Segmente for(j in 1:10){ plot(vowlax.fdat[j,1]) abline(v=f1zeit[j]) # Linke Maustaste klicken locator(1) } Vielleicht modifizieren, sodass der F1-Maximum nur im zeitlich mittleren 30% des Vokals vorkommt: mittel30 = dcut(vowlax.fdat[,1], .35, .65, prop=T) f1zeit = by(mittel30, mzeit, simplify=T)
Die Zeiten können exportiert werden, um in Emulabel eingelesen zu werden. Ein Vezeichnis definieren, zu dem die Etikettierungen exportiert werden sollen pfad = "ein Verzeichnis" Label-Dateien erzeugen makelab(f1zeit, utt(vowlax), pfad) Parallel Vektor von Äußerungsnamen Vektor von Zeiten
Template-Datei modifizieren, neue Ebene definieren (zB Target), damit die Zeiten der Zielpositionen abgebildet werden können.