Peatükk 21 Foneetiliste andmete kogumine ja töötlemine R-is

Siin peatükis teeme lühikese ülevaate sellest, kuidas Praatiga kogutud andmeid edasi töödelda R-is või hoopis R-is ilma Praatita läbi ajada. Ülevaade on põgus ega kata terviklikku töövoogu, aga ehk leidub siit kasulikke näpunäiteid edasisteks otsinguteks.

Kuna käesolev raamat on koostatud ja küljendatud RStudios bookdown paketiga (Xie 2016), siis peagu kõike siin jutuks tulevat on tegelikult varasemates peatükkides rakendatud: Praati skriptide jooksutamiseks R-i koodis on kasutatud paketti speakr (Coretta 2024). Joonised, mis ei ole tehtud Praatis, on enamikus tehtud, kasutades pakette praatpicture (Puggaard-Rode 2024) või phonTools (Barreda 2023), rPraat (Bořil & Skarnitzl 2016) ja ggplot2 (Wickham jt 2025).

21.1 Joonised paketiga praatpicture

Praati stiilis helilaine, spektrogrammi, formantide ja põhitooniga jooniseid saab R-is teha paketiga praatpicture (Puggaard-Rode 2024). See on mugav alternatiiv Praatile, kus joonise kohendamiseks tuleb palju erinevaid samme teha. Joonisel 21.1 on kujutatud fail w320.wav käsu praatpicture() vaikeväärtustega, mille kohaselt lisatakse joonisele helilaine ning spektrogramm. Kui helifailiga samas kaustas on sama nimega TextGrid-fail, siis leitakse see ka automaatselt ja lisatakse joonisele.

library(praatpicture)
praatpicture(sound = "Failid/valted/w320.wav")
Näide praatpicture joonisest käsu vaikeväärtustega.

Joonis 21.1. Näide praatpicture joonisest käsu vaikeväärtustega.

Kui tahta sisse suumida osale failis olevast salvestisest, saab ajaakent täpsustada argumentidega start ja end, nagu on joonisel 21.2. Argumendiga frames määrame, et tahame joonisel kujutada helilainet, põhitoonikontuuri, spektrogrammi ja TextGrid’i, ning argumendiga proportion määrame vastavalt nende vertikaalse proportsiooni (protsentides). Argumendiga tg_tiers saame määrata, milliseid TextGrid’i kihte joonistatakse (juhul kui failis on neid rohkem ja kõiki ei soovi joonisele) ning argument tg_focusTier määrab selle kihi, mille piire märgitakse vertikaalsete punktiirjoontega üle kogu joonise. Näite viimane argument family määrab teksti fondi ja seda on hea täpsustada siis, kui joonis sisaldab IPA transkriptsiooni, mille kõiki sümboleid R-i vaikimisi kasutatavas fondis ei ole.

library(praatpicture)
praatpicture(sound = "Failid/valted/w320.wav", 
             start = 0.438,
             end = 0.946,
             frames = c("sound", "pitch", "spectrogram",
                        "TextGrid"),
             proportion = c(20, 20, 40, 20),
             pitch_axisLabel = "Sagedus (Hz)",
             spec_axisLabel = "Sagedus (Hz)",
             time_axisLabel = "Aeg (s)",
             tg_tiers = c("häälikud", "silbid"),
             tg_focusTier = "häälikud", 
             pitch_freqRange = c(50,200),
             formant_plotOnSpec = T, 
             formant_color = c("red","pink"),
             family = "Charis SIL")
Täiendatud praatpicture joonis helilaine, põhitoonikontuuri, spektrogrammi, formantide ja TextGrid’i annotatsiooniga.

Joonis 21.2. Täiendatud praatpicture joonis helilaine, põhitoonikontuuri, spektrogrammi, formantide ja TextGrid’i annotatsiooniga.

Kuigi paketi nimi on praatpicture ja see teeb Praati stiilis pilte, ei kasutata selleks vaikimisi Praati objekte või funktsioone ja paketi kasutamiseks ei pea Praat üldse arvutisse installitud olema. Küll aga on võimalik praatpicture joonisele lisada põhitoonianalüüs või formandid, mis on tehtud Praatis – Praati analüüsidel on mõningaid eeliseid, nt on nad kohati täpsemad (eriti kui analüüsiparameetreid täpsustada) ja neid on võimalik vajadusel käsitsi korrigeerida (vt ptk 12.4.1). Et lisada joonisele Praati analüüsil põhinevaid andmeid, mine Praati, tee Sound-objektist soovitud analüüs (nt Pitch-objekt) ning salvesta see helifailiga sama nimega, aga Praati pakutava laiendiga samasse kausta, kus on helifail. Siis valib praatpicture joonistamiseks selle analüüsi. Paketil praatpicture on ka väga kasutajasõbralik manuaal,85 mistõttu pikemalt selle kasutamist siin õpikus ei käsitleta.

21.2 Praati objektide lugemine paketiga rPraat

Pakett rPraat (Bořil & Skarnitzl 2016) loeb R-is Praati objekte ja pakub mingil määral neile Praati menüüdes saada olevaid käske. Eeskätt on see kasulik TextGrid-failide lugemiseks, mis selle paketiga R-i lugedes on listitüüpi objekt. Iga märgenduskiht on üks listi element, mille sees on vektoritena selle märgenduskihi segmentide algusajad, lõpuajad ja märgendid. Seda on väga lihtne näiteks tabeliks teisendada:

library(rPraat)
tg <- tg.read("Failid/valted/w320.TextGrid")
foneemid <- data.frame(tg$häälikud[c("t1","t2","label")])
foneemid
##          t1        t2 label
## 1 0.0000000 0.4384610      
## 2 0.4384610 0.5508040     k
## 3 0.5508040 0.6627962     A
## 4 0.6627962 0.7429755     l
## 5 0.7429755 0.8236667     l
## 6 0.8236667 0.9461806     A
## 7 0.9461806 1.7116243

Lisaks leiab paketist käsud Praati stiilis märgenduspunktide aja ja märgendite pärimiseks ja muutmiseks. rPraat paketiga saab ka teisi Praati objekte lugeda (nt Pitch, Formant), aga objektid peavad olema Praatis loodud ja salvestatud. Rohkem näiteid kasutuse kohta leiab paketi dokumentatsioonist.86

21.3 Akustilised analüüsid paketiga phonTools

Kui on soovi päris ilma Praatita akustilisi analüüse teha, siis seda saab R-is paketiga phonTools (Barreda 2023). Põhitooni või formante analüüsimiseks on esmalt vaja lugeda sisse helifail. Seda saab phonTools paketi käsuga loadsound() või ka rPraat käsuga snd.read(). Mõlemal juhul loetakse helifail listitüüpi objektiks, mis sisaldab vektorit heli valjuse väärtustega sämplite kaupa.

library(phonTools)
wav <- loadsound(filename = "Failid/valted/w320.wav")

Joonisel 21.3 on kujutatud 10 000 esimest sämplit faili w320.wav algusest. Faili sämplimissagedus on kirjas objekti elemendis fs: see on 48 000 hertsi, mis tähendab, et joonisel oleva lõigu kestus on 0,208333333333333 sekundit.

plot(wav$sound[0:10000], pch=20)
10 000 sämplit faili w320.wav algusest.

Joonis 21.3. 10 000 sämplit faili w320.wav algusest.

Põhitoonianalüüsiks on käsk pitchtrack(), mis vaikimisi ka joonistab põhitoonikontuuri (joonis 21.4). Käsuga tekitatud põhitooniandmete objekt on tabel, kus on kolm tulpa: aeg (millisekundites), põhitooni sagedus (hertsides) ning vastava ajaakna põhitooni väärtuseks loetud autokorrelatsiooni väärtus.87

f0 <- pitchtrack(sound = wav)
Fraasi pane kalla vaasi põhitoonikontuur phonTools paketiga.

Joonis 21.4. Fraasi pane kalla vaasi põhitoonikontuur phonTools paketiga.

head(f0)
##   time     f0    acf
## 1  111  60.08 0.9972
## 2  113 115.66 0.7472
## 3  147  89.89 0.5264
## 4  149  90.23 0.5967
## 5  151  90.40 0.6620
## 6  153  90.74 0.7185

Kui tahame mõõtmisvigade vältimiseks põhitoonianalüüsi piire täpsustada nii nagu peatükis 12.2.4, saame seda teha kahe sammuga: esimese sammuga seame argumendi f0range suure vahemikuga, siis leiame kvartiilide väärtused ning teeme uue põhitoonianalüüsi kitsamate väärtustega. Argumendiga show ütleme, et ei taha joonist.

f0_lai <- pitchtrack(sound = wav, f0range = c(50, 800), show = F)
kvart <- quantile(f0_lai$f0, probs = c(0.25,0.75))
f0_kitsas <- pitchtrack(wav,
                        f0range = c(kvart[1]*0.75, kvart[2]*2), 
                        show = F)

Kui nüüd edasi tahame leida näiteks sõna kalla esimese silbi keskmist kestust (mis on tähistatud kui „S1“ joonisel 21.1), siis häälikute ja silpide piiride ajad on olemas ptk 21.2 loetud TextGrid-objektis ja need tuleb põhitooniobjektiga kokku panna. Peab ainult arvestama, et objektis nimega tg on ajad sekundites, objektis pitchtrack millisekundites.

s1algus = tg$silbid$t1[tg$silbid$label == "S1"]
s1lopp = tg$silbid$t2[tg$silbid$label == "S1"]
f0_kitsas %>% 
  filter(time >= s1algus*1000 & time <= s1lopp*1000) %>% 
  summarise(f0keskmine = mean(f0),
            f0tipp = max(f0)) %>% 
  mutate(kestus = (s1lopp-s1algus)*1000)
##   f0keskmine f0tipp   kestus
## 1   110.7156 115.66 304.5144

Formantide leidmiseks on käsk formanttrack(). Selle sisendiks on jällegi heliobjekt (argumendina sound piisab vektorist, kus on sämplite kaupa helivaljuse väärtused ja argumendiga fs peaks täpsustama sämplimissageduse). Kui me ei lisa argumenti show=F, joonistab see käsk spektrogrammi ja selle peale erinevate värvidega formantväärtused, nagu näha jooniselt 21.5.

formandid <- formanttrack(wav)
Fraasi pane kalla vaasi spektrogrammi ja formantide joonis paketiga phonTools.

Joonis 21.5. Fraasi pane kalla vaasi spektrogrammi ja formantide joonis paketiga phonTools.

Tulemuseks on tabel analüüsiakna ajapunktide (millisekundites) ning formantide väärtustega (hertsides). Kui tahame formantanalüüsi seadeid täpsustada sarnaselt sellele nagu Praatis peatükis 8.2.3 ja 9.3.3, siis argument formants täpsustab, mitut formanti otsitakse (vaikimisi 5), cutoff määrab formantanalüüsi lae (vaikimisi 5000) ning minformant määrab minimaalse väärtuse, mida võib formantväärtuseks pidada (vaikimisi 200; et mitte põhitooni F1-ks pidada).

Kui tahame näiteks sõna kalla vokaalide esimese ja teise formandi väärtuseid mõõta keskmise väärtusena vokaali keskosast, siis seda saame jällegi TextGrid’il olevat märgendust appi võttes. Taas peab arvestama, et objektis tg on aeg sekundites ja tabelis formandid millisekundites.

data.frame(tg$häälikud[c("t1","t2","label")]) %>% 
  filter(label == "A") %>% 
  group_by(t1, t2) %>% 
  mutate(t1 = t1*1000, t2 = t2*1000, # millisekunditeks
     kestus = t2-t1,
     f1 = mean(formandid$f1[formandid$time > t1+0.25*kestus & 
                            formandid$time < t2-0.25*kestus]),
     f2 = mean(formandid$f2[formandid$time > t1+0.25*kestus & 
                            formandid$time < t2-0.25*kestus])) %>% 
  ungroup()
## # A tibble: 2 × 6
##      t1    t2 label kestus    f1    f2
##   <dbl> <dbl> <chr>  <dbl> <dbl> <dbl>
## 1  551.  663. A       112.  569.  976.
## 2  824.  946. A       123.  630. 1045.

Kui on tarvis hertsides mõõdetud väärtuseid teisendada mõnele muule skaalale, saab kasutada paketti hqmisc (Quene 2022). Põhitooni kõrgust on tavalisem teisendada pooltooniskaalale (käsk f2st()) ning formantväärtuseid bargiskaalale (käsk f2bark()).

Nagu peatükis 12.2.1 kirjeldatud, on pooltooniskaala intervallskaala ja teisendades võetakse nullpunktiks mingi kokkuleppeline väärtus, näiteks 50 Hz või 440 Hz, aga seda alusväärtust saab kasutada normaliseerimiseks. Kui tahame normaliseerida kõnelejatevahelist varieerumist, võib võtta aluseks kõneleja puhul keskmise väärtuse, või kui tahame normaliseerida lausungiintonatsiooni mõju, võime nullpunktiks võtta vaadeldava kõneüksuse alguspunkti (või keskmise väärtuse). Siin näites teisendame põhitooniväärtused lausungi keskmise88 suhtes.

library(hqmisc)
f0_kitsas %>% 
  mutate(f0_pt = f2st(f0, median(f0))) %>% 
  ggplot()+
  geom_point(aes(x = time, y = f0_pt))+
  geom_hline(yintercept = 0, linetype="dashed")+
  labs(y = "Põhitoon (pooltoonid)", x = "Aeg (ms)")+
  theme_bw()+
  NULL
Põhitoonikontuur teisendatud pooltooniskaalale lausungi keskmise suhtes.

Joonis 21.6. Põhitoonikontuur teisendatud pooltooniskaalale lausungi keskmise suhtes.

Bargiskaala on suhteskaala ning selle teisendusalus ei ole kokkuleppeline ja seega teisendusel on vaid üks sisendväärtus. Kuna teisendus muudab skaala lineaarsemaks, on keskmise väärtuse arvutamisel tulemus veidi erinev sõltuvalt sellest, kas keskmine võtta enne või pärast teisendust. Siin näites kõigepealt teisendame ja siis keskmistame ning kasutame hqmisc paketist ka käsku is.inrange(), et leida formandipunktid, mis jäävad vokaali märgendi vahemikku.

data.frame(tg$häälikud[c("t1","t2","label")]) %>% 
  filter(label == "A") %>% 
 group_by(t1, t2) %>% 
  mutate(t1 = t1*1000, t2 = t2*1000, # teisendame millisekunditeks
         kestus = t2-t1,
         F1Hz = mean(formandid$f1[
           is.inrange(formandid$time,  
                      c(t1+0.25*kestus, t2-0.25*kestus))]),
         F1bark = mean(f2bark(formandid$f1[
           is.inrange(formandid$time, 
                      c(t1+0.25*kestus, t2-0.25*kestus))])),
         F2Hz = mean(formandid$f2[
           is.inrange(formandid$time,  
                      c(t1+0.25*kestus, t2-0.25*kestus))]),
         F2bark = mean(f2bark(formandid$f2[
           is.inrange(formandid$time,  
                      c(t1+0.25*kestus, t2-0.25*kestus))])))%>% 
  ungroup()
## # A tibble: 2 × 8
##      t1    t2 label kestus  F1Hz F1bark  F2Hz F2bark
##   <dbl> <dbl> <chr>  <dbl> <dbl>  <dbl> <dbl>  <dbl>
## 1  551.  663. A       112.  569.   5.50  976.   8.38
## 2  824.  946. A       123.  630.   5.99 1045.   8.79

21.4 Praati skriptid R-is paketiga speakr

Kui soovime siiski mingeid funktsioone oma töövoos kasutada Praatiga, mida eelpool kirjeldatud paketid ei asenda, on võimalik Praati skripte jooksutada R-i käsureal. Pisut ebamugav on siin see, et Praati skript peab olema eraldi failina salvestatud, aga seda on ka võimalik näiteks cat() või writeLines() käsuga R-i skripti sees teha.

Järgnevalt teeme läbi näite, kus teeme R-i kaudu põhitoonianalüüsi Praatis ja loeme analüüsi tulemuse otse R-i ilma vahepeal salvestamata. Kõigepealt kirjutame valmis Praati skripti. Käsk cat()89 lihtsalt salvestab selle tekstifailina. Selle asemel võiks ka selle skripti Praati skriptitoimetis valmis kirjutada ja salvestada.

cat("clearinfo
appendInfoLine: \"aeg\", tab$, \"f0\"
heli = Read from file: \"../valted/w320.wav\"
To Pitch (filtered autocorrelation): 0, 50, 800,
... 15, \"no\", 0.03, 0.09, 0.5, 0.055, 0.35, 0.14
nframe = Get number of frames
for n to nframe
  aeg = Get time from frame number: n
  f0 = Get value in frame: n, \"Hertz\"
  appendInfoLine: aeg, tab$, f0
endfor", 
file = "Failid/valted/pohitoonianalyys.praat")

Nüüd jooksutame seda skripti käsuga praat_run(). Kui skript Praatis kirjutab midagi infoaknasse, siis argumendiga capture = T püüab R selle kinni. Esmalt on see üks tekstistring, aga käsk read_delim() tükeldab tabulatsioonidega eristatud väärtused tulpadeks. Ka peab meeles pidama, et Praat tähistab teadmata väärtused „–undefined–“ ja R-is oleks vaja neist saada „NA“-d. Järgnevas näites on tulemuseks kahe tulbaga tabel, kus ühes tulbas on aeg (sekundites), teises põhitooni väärtused hertsides (faili päris alguses on vaikus, mistõttu f0 tulba väärtused on siin kuvatud esimestes ridades „NA“-d).

library(speakr)
praat_run("Failid/valted/pohitoonianalyys.praat", 
          capture = T) %>% 
  read_delim(na = "--undefined--") -> f0_praat
head(f0_praat)
## # A tibble: 6 × 2
##      aeg    f0
##    <dbl> <dbl>
## 1 0.0308    NA
## 2 0.0458    NA
## 3 0.0608    NA
## 4 0.0758    NA
## 5 0.0908    NA
## 6 0.106     NA

Joonisel 21.7 on kõrvutatud Praati vaikimisi väärtustega filtreeritud autokorrelatsiooni meetodil saadud põhitoonikontuur (punaste täppidega) ja phonTools paketi põhitoonianalüüs (mustade täppidena). On näha, et kuigi kontuurid üldjoontes kattuvad, on Praati kontuuris vähem üksikuid ekstreemseid punkte, mis tõenäoselt on mõõtmisvead.

ggplot()+
  geom_point(data = f0, aes(y = f0, x = time/1000))+
  geom_point(data = f0_praat, 
             aes(y = f0, x = aeg), col = "red")+
  theme_bw()+
  NULL
Praati põhitoonianalüüs (punasega) ja paketi phonTools põhitoonianalüüs (mustaga).

Joonis 21.7. Praati põhitoonianalüüs (punasega) ja paketi phonTools põhitoonianalüüs (mustaga).

21.5 Vokaalidiagrammid paketiga ggplot2

Nagu peatükis 16 nenditud, on Praati pildiaknas üldiselt head võimalused joonistada Praati analüüse: helilainet, spektrogrammi, põhitooni, formante jms. Kuigi joonistele on võimalik kanda ka punkte, jooni ja muid kujundeid, ei ole keskmiste väärtuste põhjal punkt-, tulp- või karpdiagrammide joonistamiseks Praati joonistusfuntsioonid kõige mugavamad ja oluliselt lihtsam on seda teha näiteks R-is.

Tulp- ja karpdiagrammid ei ole kuigi foneetikaspetsiifilised ja neid siin eraldi ei tutvustata, kuid teeme läbi mõned näited vokaalidiagrammidega formantruumis, kus y-teljel kujutatakse esimese ja x-teljel teise formandi väärtusi, kasutades paketti ggplot2.

Kui peatükis 9 kasutatud näidetes oli üks kõneleja hääldanud igat vokaali ühe korra, siis tavaliselt selleks, et kvantitatiivseid üldistusi vokaalikvaliteedi kohta teha, tuleks salvestada mitmelt kõnelejalt mitu hääldusjuhtumit. Selleks kasutame siin Lippuse jt (2013) artiklis analüüsitud andmeid, mis on avaldatud DataDOI repositooriumis.90 Laeme sealt repositooriumist tabulatsioonidega eraldatud tekstifaili Lippus_etal_JPhon2013_dataset.txt.

dat <- 
  read.delim("Failid/vokaalid/Lippus_etal_JPhon2013_dataset.txt")

# kodeerime välte faktorina
dat$Quantity = factor(dat$Quantity)
levels(dat$Quantity) = c("Q1", "Q2", "Q3")

# anname vokaalikategooriale kindla järjekorra
dat$V1.phon1 <- factor(dat$V1.phon1, 
                        levels = c("A", "{", "o", 
                                   "7", "2", "e", 
                                   "u", "y", "i"))

# teisendame SAMPA sümbolid IPA-sse, kasutades käsku paketist ipa
library(ipa)
dat$V1.IPA <- dat$V1.phon1
levels(dat$V1.IPA) <- xsampa(levels(dat$V1.IPA))

Vokaalikategooria võiks faktoriseerida, siis on alati joonistel sama järjekord ja sellest tulenevalt samadel vokaalidel samad värvid ka siis, kui mõnes andmestiku alamjaotuses ei ole kõik vokaalikategooriad esindatud. Kui tahad ise sättida, siis anna argumendiga levels õige järjekord. Järjestame näiteks /ɑ/-st /i/-ni, alt > tagant > ette > üles. Kui kasutada joonisel IPA transkriptsiooni, siis PDF-i salvestamisel kasutab R vaikimisi fonti, kus kõiki IPA sümboleid pole ja puuduvate sümbolite asemel tekivad joonisele tühjad kastikesed. Siin õpikus on kasutatud Charis SIL fonti, mis esmalt tuleks alla laadida:

library(showtext)
font_add_google('Charis SIL', db_cache = F)
showtext_auto()

Järgmine koodiblokk teeb joonise 21.8.

  • Andmestikus on CVCV-struktuuriga (lahtiste silpidega) ja CVCCV-struktuuriga (kinnise esisilbiga) sõnad. CVCCV-struktuuri filtreerime välja, et varieerumist vähendada.
  • geom_text() joonistab iga punkti, tähistades tulba V1.IPA sümboliga. Kuna tegemist on IPA sümbolitega, tuleb täpsustada family argumendiga font, kus kõik vajalikud sümbolid olemas on.
  • stat_ellipse() joonistab iga kategooria punktidele ümber ellipsi usaldusvahemiku piiridega.
  • scale_xy_reverse keerab skaalad kahanevaks, sest siis on see sama pidi nagu kõnetrakti sagitaalne läbilõige (kui suu avaneb vasakule), nii nagu seda kujutatakse nt IPA tabelis.
  • facet_grid() jagab joonise paneelideks. Jagame siin kolmeks reaks vastavalt vältekategooriale ja kaheks tulbaks vastavalt kõneleja soole.
dat %>%
  filter(Struct == "cvcv") %>% # ainult lahtiste silpidega sõnad
  ggplot(aes(y=V1F1, x = V1F2,  
             shape = V1.phon1, col = V1.phon1))+
  geom_text(aes(label = V1.IPA), 
            alpha = 0.6, family = "Charis SIL")+
  stat_ellipse() +
  scale_x_reverse()+
  scale_y_reverse()+
  labs(y = "F1 (Hz)", x="F2 (Hz)") +
  guides(color = "none") +
  facet_grid(Quantity ~ Gender)+
  theme_bw()+
  NULL
Rõhulise silbi vokaalid F1-F2 ruumis rühmitatud kõneleja soo ja sõna välte kaupa.

Joonis 21.8. Rõhulise silbi vokaalid F1-F2 ruumis rühmitatud kõneleja soo ja sõna välte kaupa.

21.5.1 Vokaalidiagramm keskmiste väärtustega

Kui joonisel 21.8 on näha kõik üksikud mõõtmispunktid, siis suurema andmestiku puhul võib joonis olla tihedalt täidetud ja infoga ülekoormatud. Arvutame (dplyr paketiga) formantväärtuste keskmised soo, välte ja vokaalikategooria kaupa. Keskmistatud vokaalide väärtused on kujutatud joonisel 21.9.

dat %>%
  filter(Struct == "cvcv") %>% 
  group_by(Gender, Quantity, V1.IPA) %>% 
  summarise(V1F1 = mean(V1F1), V1F2 = mean(V1F2)) %>% 
  ggplot(aes(y=V1F1, x = V1F2,  shape = V1.IPA, col = Quantity))+
  geom_label(aes(label = V1.IPA), family = "Charis SIL")+
  scale_x_reverse()+
  scale_y_reverse()+
  labs(y = "F1 (Hz)", x="F2 (Hz)") +
  facet_grid(. ~ Gender)+
  theme_bw()+
  NULL  
Rõhulise silbi vokaalide keskmised väärtused F1-F2 ruumis rühmitatud kõneleja soo ja sõna välte kaupa.

Joonis 21.9. Rõhulise silbi vokaalide keskmised väärtused F1-F2 ruumis rühmitatud kõneleja soo ja sõna välte kaupa.

21.5.2 Kõnelejatevaheline normaliseerimine

Et näidata ühel joonisel võrdlevalt erinevate kõnelejate vokaale, võime formantväärtuseid normaliseerida, nagu seda on pikemalt kirjeldatud peatükis 9.4. Esmalt sisestame funktsiooni z-skoorimiseks – selle leiaks valmis kujul ka mõnest R-i paketist, aga et see on oma olemuselt äärmiselt lihtne, on sellest arusaamiseks hea seda siin vaadata.

zskoor <- function(x){
  (x-mean(x))/sd(x)
}

Teisendame formantväärtused keelejuhtide kaupa z-skoorideks.

for(i in unique(dat$SP)){
  dat$V1F1norm[dat$SP==i] <- zskoor(dat$V1F1[dat$SP==i])
  dat$V1F2norm[dat$SP==i] <- zskoor(dat$V1F2[dat$SP==i])
}

Nüüd kanname joonisele iga kõneleja vokaalide keskmised normaliseeritud formantväärtused. Joonisel 21.10 tähistab iga punkt ühe kõneleja selle vokaalikategooria keskmist.

dat %>%
  filter(Struct == "cvcv") %>% 
  group_by(SP, V1.IPA) %>% 
  summarise(V1F1 = mean(V1F1norm), V1F2 = mean(V1F2norm)) %>% 
  ggplot(aes(y=V1F1, x = V1F2,  shape = V1.IPA, col = V1.IPA))+
  geom_text(aes(label = V1.IPA), family = "Charis SIL")+
  scale_x_reverse()+
  scale_y_reverse()+
  labs(y = "F1 (z-skoor)", x="F2 (z-skoor)") +
  guides(color = "none") +
  theme_bw()+
  NULL
Normaliseeritud rõhulise silbi vokaalid F1-F2 ruumis.

Joonis 21.10. Normaliseeritud rõhulise silbi vokaalid F1-F2 ruumis.

Sellega lõpetame käesolevas õpikus R-ile pühendatud peatüki. Kindlasti on foneetiliste andmete analüüsiks ja visualiseerimiseks ka muid pakette, mida siin ei ole mainitud, ning neid tuleb pidevalt ka juurde.

Kirjandus

Barreda, Santiago. 2023. phonTools: Tools for Phonetic and Acoustic Analyses. https://doi.org/10.32614/CRAN.package.phonTools.
Bořil, Tomáš & Radek Skarnitzl. 2016. Tools rPraat and mPraat. Petr Sojka, Aleš Horák, Ivan Kopeček & Karel Pala (toim), Text, Speech, and Dialogue: 19th International Conference, TSD 2016, Brno, Czech Republic, September 12-16, 2016, Proceedings, 367–374. Cham: Springer International Publishing. https://doi.org/10.1007/978-3-319-45510-5_42.
Coretta, Stefano. 2024. speakr: A Wrapper for the Phonetic Software Praat. https://github.com/stefanocoretta/speakr.
Lippus, Pärtel, Eva Liina Asu, Pire Teras & Tuuli Tuisk. 2013. Quantity-related variation of duration, pitch and vowel quality in spontaneous Estonian. Journal of Phonetics 41(1). 17–28. https://doi.org/10.1016/j.wocn.2012.09.005.
Puggaard-Rode, Rasmus. 2024. praatpicture. A library for making flexible Praat Picture-style figures in R. Proceedings of the International Seminar on Speech Production 13. 145–148.
Quene, Hugo. 2022. hqmisc: Miscellaneous Convenience Functions and Dataset. https://doi.org/10.32614/CRAN.package.hqmisc.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, Dewey Dunnington & Teun van den Brand. 2025. ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://ggplot2.tidyverse.org.
Xie, Yihui. 2016. bookdown: Authoring Books and Technical Documents with R Markdown. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/bookdown.

  1. https://rpuggaardrode.github.io/praatpicture_manual/↩︎

  2. https://fu.ff.cuni.cz/praat/rDemo.html↩︎

  3. Seda saab vajadusel kasutada põhitooni kõrguse kindluse hindamiseks ning heliliseks lugeda ainult need punktid, mille autokorrelatsiooni väärtus on kõrge.↩︎

  4. Täpsemini siin on aritmeetilise keskmise asemel võetud mediaanväärtus, mis on vähem tundlik hälbivate väärtuste suhtes.↩︎

  5. Kuna käsu sees tähistavad jutumärgid tekstistringi algust ja lõppu, tuleb skriptis sisalduvad jutumärgid tähistada längkriipsuga \", et R loeks neid lihtsalt tähemärkidena.↩︎

  6. https://doi.org/10.15155/repo-16↩︎