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)
vowlax Segmentlistevowlax.fdat Trackdatei F1-F4vowlax.rms Trackdatei dB-RMSvowlax.l Etikettierungen "E" "a" "I" "O"vowlax.spkr Sprecher-Etikettierungen "67" "68"
mid =
Formanten (F1-F4) zum zeitlichen Mittelpunkt
dcut(vowlax.fdat, .5, prop=T)
Nur F1 und F2 mid = mid[,1:2]
1. Ellipse-Abbildungen
1. Ellipse-Abbildungen
EEE
EE E
EE
EE
EE
EE
E
E
EE
EE
E
EEE
EE
EEEE
E
E
EE
EE
EE
E
E
Ea
a
a
a
aa
a
aa a
a
aa a
a
aa
a
aa
aa
a
aa
a
a
a
a
a
aaa
a
aa
a
a
a
a
aa
a
a
a
a
aaa
a
a
a
a
aa
a
a
aa
a
a
a
a
I
II
I
III
I II
III
III
II
III
I
II
I
I
II I
I II
II
II II
II
II
III
II II I
III III
I
III
I
I IIII
I
I
II
I
I
II
II
II I
I
I
II
II
OO
O OO
O
OOO
O
OO
OO OO
3000 2500 2000 1500 1000
1000
800
600
400
F2
F1
eplot(mid[temp,], vowlax.l[temp], dopoints=T, form=T)
temp =
Logischer Vektor um Sprecher “67” zu identifizieren
vowlax.spkr==“67”
Ellipsen Sprecher 67 Sprecherin 68
E EEEE
EE
EE
EEEE
EE
E
E
E
E
E
EE
EEE
EE
E
E
E
EEE EE
EE
EE
E
E
aa
a
a
a
aaa
a
a
aa
a
a
aa
a
a
aa
a a
aa a
a
a
a
a aa
a
a
a
a
aa
a
aa aa
a
a
a aa
a
a
a
a
a
a
a
a
a
a
aaaaa a
II
I
I
II
II
I
III
I
II I II
I
II I
II
I
I I
II
I
I
II
I
I
I
I
II
I
II
II
I
I
II
II
I
II
I
I
III
I
II
I
I
I
III
I
I
II
I
I
II
I
I
I
II
I
I
I
II
O
O
O
O OO
OOO
OO
O
OOO O
2000 1500 1000
80
07
00
60
05
00
40
03
00
F2
F1
Mit !temp statt temp
vowlax Segmentlistevowlax.fdat Trackdatei F1-F4vowlax.l Etikettierungen "E" "a" "I" "O"vowlax.spkr Sprecher-Etikettierungen "67" "68"
mid = dcut(vowlax.fdat, .5, prop=T)
mid = mid[,1:2]
Mehrere Abbildungen gleichzeitig
par(mfrow=c(1,2))
Eine Reihe, zwei Spalten
eplot(mid[temp,], vowlax.l[temp], dopoints=T, form=T)
eplot(mid[!temp,], vowlax.l[!temp], dopoints=T, form=T)
par(mfrow=c(1,1))
wieder auf eine Reihe x eine Spalte setzen
help(eplot)
Eine Ellipse für alle Daten Eine Ellipse pro Kategorie
eplot(mid[temp,], vowlax.l[temp], centroid=T)
args(eplot)
eplot(mid[temp,]) eplot(mid[temp,], vowlax.l[temp])
Mit Mittelpunkt-Beschriftung
dopoints: eine entsprechende Etikettierung pro Wert
Achsen drehen (nur für F1 x F2 Abbildungen)
eplot(mid[temp,], vowlax.l[temp], dopoints=T)
eplot(mid[temp,], vowlax.l[temp], centroid=T, form=T)
Info zu eplot()
eplot(mid[temp,], vowlax.l[temp], centroid=T, doellipse=F)
Keine Ellipsen
Farben variieren
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"))
Keine Farben und andere Linien, größere Liniendichte
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 identifizierenvowlax Segmentlistevowlax.fdat Trackdatei F1-F4vowlax.l Etikettierungen "E" "a" "I" "O"vowlax.spkr Sprecher-Etikettierungen "67" "68"
F1 x F2 Abbildung zum Segment-Onset,"I" Vokale, Sprecher 67
III
III
II
I
II
I
II
I
II
II
III
III
I III I
III
II
III I
I
II
I
III
I
II
I
II
III I
I
I
I
II
II
III I
I
I I
II
II
I
I
I I I I
I
I
I
II
200 300 400
050
015
00
F1-Onset
F2-
Ons
et
on =
B. Matrix, F1-F2 zum Segment-Onset der "I" Vokale vom Sprecher 67
dcut(vowlax.fdat[temp,1:2], 0, prop=T)
A. Logischer Vektor um die "I" Vokale vom Sprecher 67 zu identifizierentemp = vowlax.spkr=="67" & vowlax.l == "I"
vowlax Segmentlistevowlax.fdat Trackdatei F1-F4vowlax.l Etikettierungen "E" "a" "I" "O"vowlax.spkr Sprecher-Etikettierungen "67" "68"
C. Labels die dazu passenlabs = vowlax.l[temp]
Oderlabs = rep("I", sum(temp))
D. Eine dazu passende Segmentliste
seg = vowlax[temp,]
segsegment list from database: kielread06 query was: Kanonic=a | E | I | O labels start end utts4 I 1670.940 1710.690 K67MR0015 I 2093.000 2144.190 K67MR0017 I 538.687 595.187 K67MR003...
eplot(on, labs, dopoints=T, xlab="F1-Onset", ylab="F2-Onset")
E. Abbildung (Achsen nicht drehen)
F. Ausreißer identifizieren
Logischer Vektor wenn F2 dieser "I" Vokale weniger als zB 100 Hz ist
temp = I
II
III
II
I
II
I
II
I
II
II
III
III
I III I
III
II
III I
I
II
I
III
I
II
I
II
III I
I
I
I
II
II
III I
I
I I
II
II
I
I
I I I I
I
I
I
II
200 300 400
050
015
00
F1-Onset
F2-
Ons
et on[,2] < 100
on Matrix. F1, F2 zum Segment-Onset
labs Vektor von "I" Labels
seg Dazu passende Segmentliste
eplot(on[!temp,], labs[!temp], dopoints=T, xlab="F1-Onset", ylab="F2-Onset")
temp = on[,2] < 100
G. Kann man diesen Befehl modifizieren, um den Ausreißer zu entfernen?
I
II
I
I
I
I
I
I
II
I
II
I
I
I
I
I
II
I
II
I
I II
II
I
II
II
III I
I
II
I
I
I
I
I
I
I
I
I
I
III
I
I
I
I
I
I
II
II
I I
I
II
I
I
II
I
I
II
II
I
I
I
I
200 250 300 350 400 450
1200
1600
2000
F1-Onset
F2-
Ons
et
eplot(on, labs, dopoints=T, xlab="F1-Onset", ylab="F2-Onset")
H. Der entsprechende Segment (also die Segmente, für die F2 weniger als 100 Hz ist)
segment list from database: kielread06 query was: Kanonic=a | E | I | O labels start end utts194 I 911.563 964.625 K67MR096
seg[temp,]
Alternative Lösung: der Segment wird identifiziert, um den Formant-Fehler in EMU zu korrigieren.
temp = on[,2] < 100
on Matrix. F1, F2 zum Segment-Onset
labs Vektor von "I" Labels
seg Dazu passende Segmentliste
Formantfehler in EMU korrigieren
I. (Nach der Korrektur) Formanten-Trackdatei aus segform = emu.track(seg, "fm")
J. Neue F1 und F2 zum Segment-Onset
on2 = dcut(form[,1:2], 0, prop=T)
on Matrix. F1, F2 zum Segment-Onset
labs Vektor von "I" Labels
seg Dazu passende Segmentliste
K. Ellipse-Abbildungeplot(on2, labs, dopoints=T, xlab="F1-Onset", ylab="F2-Onset")
I
II
I
I
I
I
I
I
II
I
II
I
I
II
I
II
I
II
I
I II
I I
I
II
II
III I
I
II
I
I
I
I
I
I
I
I
I
I
IIII
I
I
I
I
I
II
II
I I
I
II
II
II
I
I
II
II
II
I
I
I
200 300 400
1200
1600
2000
F1-Onset
F2-
Ons
et
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 Segmentlistevowlax.fdat Trackdatei F1-F4vowlax.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 eineVertikale Linie zu diesem Zeitpunkt zu überlagernabline(v=v)Der ms-Wert der Liniev$x
860 880 900 920 940
400
450
500
550
times
data
[, k
]
Die F1-Werte vom ersten Segment
w = vowlax.fdat[1,1]$data
T1857.5 372862.5 412867.5 467872.5 506877.5 532882.5 547887.5 556892.5 561897.5 562902.5 556907.5 550912.5 538917.5 525922.5 521927.5 517932.5 504937.5 494942.5 492
Die Zeiten, zu denen diese Werte vorkommen.
zeit = tracktimes(w)zeit
Logischer Vektor: T wenn w ein Maximum erreicht
temp =
Die entsprechende Zeit dieses Maximums
zeit[temp]
w
w == max(w)
[1] 897.5
In eine Funktion packen:
mzeit <- function(werte){zeit = tracktimes(werte)temp = werte == max(werte)# Sollte es 2 Maxima geben, nimm den erstenzeit[temp][1]}
mzeit(w)
f1zeit = by(vowlax.fdat[,1], mzeit, simplify=T)
Die mzeit() Funktion auf die Trackdatei andwenden:
Der Zeitpunkt, zu dem zuerst w ein Maximum erreicht
Überprüfen für die ersten 10 Segmente
for(j in 1:10){plot(vowlax.fdat[j,1])abline(v=f1zeit[j])# Linke Maustaste klickenlocator(1)}
Vielleicht modifizieren, sodass der F1-Maximum nur im zeitlich mittleren 30% des Vokals vorkommt:
f1zeit = by(mittel30, mzeit, simplify=T)
mittel30 = dcut(vowlax.fdat[,1], .35, .65, prop=T)
Die Zeiten können exportiert werden, um in Emulabel eingelesen zu werden.
makelab(f1zeit, utt(vowlax), pfad)
pfad = "ein Verzeichnis"
Ein Vezeichnis definieren, zu dem die Etikettierungen exportiert werden sollen
Vektor von Zeiten
Parallel Vektor von Äußerungsnamen
Label-Dateien erzeugen
Template-Datei modifizieren, neue Ebene definieren (zB Target), damit die Zeiten der Zielpositionen abgebildet werden können.
Top Related