vokale_plotten_jmh

Werbung
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
Herunterladen