--- title: "Kõnetempo ja -soravuse varieerumine eesti keeles" author: "Pärtel Lippus, Maarja-Liisa Pilvik, Kaidi Lõo, Liina Lindström" date: "22.12.2023" output: html_document: default word_document: default csl: "https://raw.githubusercontent.com/citation-style-language/styles/master/unified-style-sheet-for-linguistics.csl" link-citations: yes lang: et bibliography: viited.bib --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE, fig.width=4.6,fig.height=2.6) options(scipen = 99) ``` See on R-i kood, millega on analüüsitud kõnetempo ja soravuse andmeid Eesti Rakenduslingvistika Ühingu aastaraamatus ilmunud artikli tarvis. ```{r, echo = T, message=F} library(tidyverse) library(gridExtra) teema <- theme_bw() + theme(plot.title = element_text(hjust = 0.5, size = 12), axis.text = element_text(size = 8), axis.title = element_text(size = 8), strip.text = element_text(size = 10), legend.text = element_text(size = 10), legend.title = element_text(size = 10)) ``` ## Andmete ettevalmistus Teke ja foneetikakorpuse andmestikus on andmed kogutud kõnevoorude kaupa (lokaalne kõnetempo). Artiklis analüüsime globaalset kõnetempot, selleks teisendame andmed nii, et ühelt kõnelejalt oleks üks rida ühe faili kohta. Samuti siin artiklis analüüsime ainult dialooge, nii et filtreerime välja failid, kus on rohkem kui kaks vestlejat. Siin ### Teke andmed Koodiblokk mis, loeb teke andmed: ```{r, echo=T} teke <- read.delim("teke_voorud.csv", encoding = "UTF-8") teke$sugu <- toupper(teke$sugu) ``` ```{r, echo=T} # vastavalt faili kogukestusele teke %>% group_by(fail, koneleja) %>% reframe(faili_kogukestus = (faili_kogukestus_ms/1000), vanus = vanus, sugu = sugu, silpide_arv = sum(silpide_arv), sonade_arv = sum(sõnade_arv), poolikute_arv = sum(poolikute_arv), venituste_arv = sum(venituste_arv), korduste_arv =sum(korduste_arv), disf_arv = sum(poolikute_arv+korduste_arv+venituste_arv), kestus = sum((kestus_ms)/1000)) %>% distinct() %>% filter(!is.na(sugu), !is.na(vanus)) %>% group_by(fail) %>% mutate(prop = kestus/faili_kogukestus) %>% ungroup() -> tmp tmp <- data.frame(tmp, kaaskoneleja = character(nrow(tmp)), kaaskoneleja_sugu = character(nrow(tmp)), kaaskoneleja_vanus = numeric(nrow(tmp)), kaaskoneleja_kestus = numeric(nrow(tmp)), kaaskoneleja_silpide_arv = numeric(nrow(tmp)), kaaskoneleja_sonade_arv = numeric(nrow(tmp)), kaaskoneleja_disf_arv = numeric(nrow(tmp))) for(f in unique(tmp$fail)){ tmp2 <- tmp[tmp$fail==f,] for(k in tmp2$koneleja){ tmp2[tmp2$koneleja != k,]$koneleja %>% unique() %>% paste(., collapse = "_") -> tmp$kaaskoneleja[tmp$fail==f&tmp$koneleja==k] tmp2[tmp2$koneleja != k,]$sugu %>% unique() %>% ifelse(length(.) > 1, "mõlemad", .) -> tmp$kaaskoneleja_sugu[tmp$fail==f&tmp$koneleja==k] tmp2[tmp2$koneleja != k,]$vanus %>% mean() -> tmp$kaaskoneleja_vanus[tmp$fail==f&tmp$koneleja==k] tmp2[tmp2$koneleja != k,]$silpide_arv %>% mean() -> tmp$kaaskoneleja_silpide_arv[tmp$fail==f&tmp$koneleja==k] tmp2[tmp2$koneleja != k,]$sonade_arv %>% mean() -> tmp$kaaskoneleja_sonade_arv[tmp$fail==f&tmp$koneleja==k] tmp2[tmp2$koneleja != k,]$kestus %>% mean() -> tmp$kaaskoneleja_kestus[tmp$fail==f&tmp$koneleja==k] tmp2[tmp2$koneleja != k,]$disf_arv %>% mean() -> tmp$kaaskoneleja_disf_arv[tmp$fail==f&tmp$koneleja==k] } } tmp %>% filter(!nchar(kaaskoneleja)>3, vanus>9, kaaskoneleja_vanus>9) -> teke2 # faktoriseerime muutujad teke2$koneleja <- factor(teke2$koneleja) teke2$sugu <- factor(teke2$sugu) teke2$fail <- factor(teke2$fail) ``` Salvestame globaalse kõnetempo andmestiku ```{r, eval=F} save(teke2, file = "teke_globaalne_konetempo.Rda") ``` ### Foneetika korpuse andmed ```{r, echo=FALSE} # koodiblokk, mis loeb fonkorp load("fonkorp_voorud.Rda") fonkorp$fail <- substr(fonkorp$file, 1,6) fonkorp <- fonkorp[fonkorp$SP1_age<70|fonkorp$SP2_age<70,] ``` ```{r, echo=F} # vastavalt faili kogukestusele fonkorp %>% group_by(fail, koneleja = SP1_ID) %>% filter(vooru_tyyp=="voor", SP1_age<70, SP2_age<70) %>% summarise(faili_kogukestus = (faili_kogukestus), vanus = SP1_age, sugu = SP1_sugu, silpide_arv = sum(silpide_arv), sonade_arv = sum(sonade_arv), poolikute_arv = sum(poolikute_arv), venituste_arv = sum(venituste_arv), korduste_arv =sum(korduste_arv), üneemide_arv = sum(yneemide_arv), disf_arv = sum(poolikute_arv + korduste_arv + venituste_arv), kestus = sum(vooru_kestus), art_kestus = sum(artikul_kestus), põhitoon = mean(f0Mean, na.rm=T), kaaskoneleja = SP2_ID, kaaskoneleja_sugu = SP2_sugu, kaaskoneleja_vanus = SP2_age, vanusevahe = mean(agedif), ) %>% distinct() %>% group_by(fail) -> fonkorp2 fonkorp2 <- data.frame(fonkorp2, kaaskoneleja_kestus = numeric(nrow(fonkorp2)), kaaskoneleja_silpide_arv = numeric(nrow(fonkorp2)), kaaskoneleja_sonade_arv = numeric(nrow(fonkorp2)), kaaskoneleja_disf_arv = numeric(nrow(fonkorp2)), kaaskoneleja_põhitoon = numeric(nrow(fonkorp2))) for(i in 1:nrow(fonkorp2)){ fonkorp2$kaaskoneleja_kestus[i] <- fonkorp2$kestus[fonkorp2$fail==fonkorp2$fail[i] & fonkorp2$kaaskoneleja==fonkorp2$koneleja[i]] fonkorp2$kaaskoneleja_silpide_arv[i] <- fonkorp2$silpide_arv[fonkorp2$fail==fonkorp2$fail[i] & fonkorp2$kaaskoneleja==fonkorp2$koneleja[i]] fonkorp2$kaaskoneleja_sonade_arv[i] <- fonkorp2$sonade_arv[fonkorp2$fail==fonkorp2$fail[i] & fonkorp2$kaaskoneleja==fonkorp2$koneleja[i]] fonkorp2$kaaskoneleja_disf_arv[i] <- fonkorp2$disf_arv[fonkorp2$fail==fonkorp2$fail[i] & fonkorp2$kaaskoneleja==fonkorp2$koneleja[i]] fonkorp2$kaaskoneleja_põhitoon[i] <- fonkorp2$põhitoon[fonkorp2$fail==fonkorp2$fail[i] & fonkorp2$kaaskoneleja==fonkorp2$koneleja[i]] } ``` Salvestame globaalse kõnetempo andmed ```{r, eval=F} save(fonkorp2, file = "fonkorp_globaalne_konetempo.Rda") ``` ## Loeme andmestikud Kui eelnevat mitte jookustada, siis võib alustada siit ja lugeda sisse kolm globaalse kõnetempo andmestikku. Teke ```{r} load("teke_globaalne_konetempo.Rda") ``` Foneetika korpus ```{r} load("fonkorp_globaalne_konetempo.Rda") ``` Põhjatuule korpuse andmed ```{r, echo=F} # loeme põhjatuule load("pohja_konetempo_andmed.Rda") ``` ## Materjali kirjeldus ###Teismeliste korpus **TeKE** koosneb teismeliste omavahelistest vestlustest, mis on salvestatud diktofoniga (enamasti keelejuhtide kodudes). Korpus on käsitsi transkribeeritud, märgitud on kõnevooru piirid, sõnad üldiselt tavaortograafias mõningate täpsustavate lisamärkidega. Siin ettekandes kasutame seda osa TeKE-st, - kus osaleb kaks kõnelejat; - `r length(unique(teke2$koneleja))` erinevat kõnelejat; - `r paste(table(teke2$sugu[!duplicated(teke2$koneleja)]), c("poissi ja", "tüdrukut"), collapse=" ")` vanuses `r paste(range(teke2$vanus), collapse ="–")` aastat; - kokku `r length(unique(teke2$fail))` vestlust; - keskmine kestus `r round(mean(teke2$faili_kogukestus/60))` minutit (`r paste(round(range(teke2$faili_kogukestus/60)), collapse="–")` minutit); - kogukestus `r round(sum(teke2$faili_kogukestus[!duplicated(teke2$fail)])/3600,1)` tundi. ### Materjal: Eesti keele spontaanse kõne foneetiline korpus **EKSKFK** [@lippus_phonetic_2021] koosneb mono-, dia- ja trialoogidest, mis on käsitsi märgendatud erinevatel lingvistilistel tasanditel: märgitud on sõnade, silpide ja häälikute piirid, häälelaadi, venitusi, üneeme jpm. Salvestused on suures osas läbi viidud foneetika labori vaikses salvestusruumis. Siin ettekandes kasutame seda osa foneetika korpusest, - kus osaleb kaks kõnelejat; - `r length(unique(fonkorp2$koneleja))` erinevat kõnelejat; - `r paste(table(fonkorp2$sugu[!duplicated(fonkorp2$koneleja)]), c("meest ja", "naist"), collapse=" ")` vanuses `r paste(range(fonkorp2$vanus), collapse ="–")` aastat; - kokku `r nrow(fonkorp2)` vestlust; - keskmine kestus `r round(mean(fonkorp2$faili_kogukestus/60))` minutit (`r paste(round(range(fonkorp2$faili_kogukestus/60)), collapse="–")` minutit); - kogukestus `r round(sum(fonkorp2$faili_kogukestus[!duplicated(fonkorp2$fail)])/3600,1)` tundi. ### Materjal: Põhjatuule ja päikese korpus Korpus koosneb **Põhjatuule ja päikese** loetud tekstist. Suuresti samad keelejuhid, kes osalevad EKSKFK, aga oleme seda teksti palunud lugeda ka muudes katsetes osalejatel. Korpus on osaliselt märgendatud (umbes 90 salvestust), märgitud on sõnade ja häälikute piirid. Salvestused on suures osas läbi viidud foneetika labori vaikses salvestusruumis. - kokku `r nrow(pohja)` salvestust; - `r length(unique(pohja$ID))` erinevat kõnelejat; - `r paste(table(pohja$sugu[!duplicated(pohja$ID)]), c("meest ja", "naist"), collapse=" ")` vanuses `r paste(range(pohja$vanus, na.rm=T), collapse ="–")` aastat; - Keelejuhtidest `r length(which(unique(fonkorp2$koneleja) %in% pohja$ID))` on samad, kes osalevad ka EKSKFK spontaansetes vestlustes. ### Vestluspaaride sooline ja vanuseline jaotus TEKEs ```{r, echo=F, message=F, fig.align = "center"} teke2 %>% summarise(vanus, sugu, `partneri sugu` = kaaskoneleja_sugu, `partneri vanus`= kaaskoneleja_vanus) %>% ggplot(aes(x = vanus, y=`partneri vanus`)) + geom_point(aes(col=`partneri sugu`), alpha = 0.3, size = 3) + facet_wrap("sugu") + #labs(title = "Vestluspartnerid TeKEs") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` ### Vestluspaaride sooline ja vanuseline jaotus EKSKFKs ```{r, echo=F, message=F, fig.align = "center"} fonkorp2 %>% summarise(vanus, sugu, `partneri sugu` = kaaskoneleja_sugu, `partneri vanus`= kaaskoneleja_vanus) %>% ggplot(aes(x = vanus, y=`partneri vanus`)) + geom_point(aes(col=`partneri sugu`), alpha = 0.3, size = 3) + facet_wrap("sugu") + #labs(title = "Vestluspartnerid EKSKFKs") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` ### Kõnelejate jaotus Põhjatuule ja päikese korpuses ```{r, echo=F, message=F, fig.align = "center"} pohja %>% select(ID, sugu, vanus) %>% distinct() %>% ggplot(aes(x=vanus)) + geom_histogram(binwidth = 10)+ facet_wrap("sugu") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81"))+ labs(y="Kõnelejate arv") ``` ## Kõnetempo analüüs ### Vanuse ja soo efekt #### Teismeliste korpuses ```{r, echo=F, message=F, fig.align = "center"} teke2 %>% #filter(!(sugu == "M" & vanus == 13)) %>% ggplot(aes(x = vanus, y = silpide_arv/(kestus), color = sugu, pch = sugu)) + geom_point(alpha = 0.3, size = 3) + #geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 3)) + geom_smooth(method = "lm") + #facet_wrap("sugu") + labs(y = "Kõnetempo (silpi/sek)") + ylim(2,8)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Keskmiselt üle 5 silbi sekundis, poistel aeglasem. ```{r} teke2 %>% group_by(sugu) %>% summarise(tempo = mean(silpide_arv/kestus)) teke2 %>% summarise(tempo = (silpide_arv/kestus)) %>% summary() ``` Testime vanuse & soo efekti GAM mudeliga ```{r, message=F} library(mgcv) #mod <- bam((silpide_arv/kestus) ~ sugu + s(vanus, by = sugu, k=5) + s(koneleja, bs = "re"), data = teke2, subset = !(sugu == "M" & vanus == 13)) mod <- bam((silpide_arv/kestus) ~ vanus + sugu + s(koneleja, bs = "re"), data = teke2) #mod <- bam((silpide_arv/kestus) ~ vanus + s(koneleja, bs = "re"), data = teke2, subset = sugu == "M" & vanus != 13) summary(mod) #concurvity(mod) #qqnorm(resid(mod)) #qqline(resid(mod)) #par(mfrow = c(2,2)) #plot(mod, all.terms = T) ``` #### Kõnetempo täiskasvanutel ```{r, echo=F, message=F, fig.align = "center"} fonkorp2 %>% ggplot(aes(x = vanus, y = silpide_arv/(kestus), color = sugu)) + geom_point(alpha = 0.3, size = 3) + geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8)) + #facet_wrap("sugu") + labs(y = "Kõnetempo (silpi/sek)") + ylim(2,8)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Meestel on keskmiselt madalam kõnetempo. Naistel püsib kõnetempo stabiilselt. ```{r} mod <- bam((silpide_arv/kestus) ~ sugu + s(vanus, by = sugu) + s(koneleja, bs = "re"), data = fonkorp2) summary(mod) #plot(mod, select = 1) ``` #### Kõnetempo täiskasvanutel loetud kõnes ```{r, echo=F, message=F, fig.align = "center"} pohja %>% ggplot(aes(x = vanus, y = sprate, color = sugu)) + geom_point(alpha = 0.3, size = 3) + geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8)) + #facet_wrap("sugu") + labs(y = "Kõnetempo (silpi/sek)") + ylim(2,8)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Täiskasvanutel loetud kõnes kõnetempo spontaansest veidi aeglasem, vanusega aeglustub, meestel ja naistel olulist vahet pole. ```{r} pohja$sugu <- factor(pohja$sugu) pohja$ID <- factor(pohja$ID) #mod <- bam(sprate ~ sugu + s(vanus, by = sugu, k=5) + s(ID, bs = "re"), data = pohja) mod <- bam(sprate ~ vanus + s(ID, bs = "re"), data = pohja) summary(mod) # plot(mod, select = 1) # library(itsadug) # plot_smooth(mod, view = "vanus") ``` ### Vanuse ja soo efekti joonis artiklisse (Joonis 2) Kolme paneeliga vanuse efekti joonis ```{r} teke2 %>% mutate(kõnetempo = (silpide_arv/kestus), subkorp = "Teismelised") %>% select(subkorp, kõneleja = koneleja, vanus, sugu, kõnetempo) -> tmp1 fonkorp2 %>% mutate(kõnetempo = (silpide_arv/kestus), subkorp = "Täisk. vestlus") %>% select(subkorp, kõneleja = koneleja, vanus, sugu, kõnetempo) -> tmp2 pohja %>% mutate(subkorp = "Täisk. loetud") %>% select(subkorp, kõneleja = ID, vanus, sugu, kõnetempo = sprate) -> tmp3 koond1 <- rbind(tmp1,tmp2,tmp3) koond1$subkorp <- factor(koond1$subkorp, levels=c( "Teismelised", "Täisk. vestlus", "Täisk. loetud")) joonis2 <- koond1 %>% ggplot(aes(x = vanus, y = kõnetempo, color = sugu, pch = sugu)) + geom_point(alpha = 0.6, size = 2) + #geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 3)) + geom_smooth(method = "lm") + facet_grid(cols=vars(subkorp), scales = "free_x") + #space="free" labs(y = "Kõnetempo (silpi/sek)") + ylim(2,8)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81"))+ # scale_shape_manual(values = c(25,2))+ NULL joonis2 koond1 %>% group_by(subkorp) %>% summarise(mean(kõnetempo)) ``` ```{r, eval=FALSE} pdf(file = "konetempo_RLY2024_joonis2.pdf", width = 4.7, height = 2.6) joonis2 dev.off() ``` ### Kõnetempo ja kaaskõneleja kõnetempo teismelistel ```{r, echo=F, message=F, fig.align = "center"} teke2 %>% summarise(sugu, vanus, `partneri sugu` = kaaskoneleja_sugu, `partneri vanus` = kaaskoneleja_vanus, `kõneleja konetempo` = silpide_arv/kestus, `partneri kõnetempo` = kaaskoneleja_silpide_arv/kaaskoneleja_kestus) %>% ggplot(aes(x = `kõneleja konetempo`, y = `partneri kõnetempo`, color = `partneri sugu`)) + geom_point(alpha = 0.3, size = 3) + #geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 3)) + geom_smooth(method = "lm", formula = y ~ x) + # facet_wrap("sugu") + #labs(title = "Kõnetempo vastavalt kaaskõneleja kõnetempole ja kõneleja soole TeKEs") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Tugev seos vestluspartnerite kõnetempo vahel. ```{r} teke2 %>% mutate(subkorp = "Teismelised", konetempo = silpide_arv/kestus, soravus = disf_arv/kestus, soravus2 = disf_arv/sonade_arv*100, vanusevahe = kaaskoneleja_vanus - vanus, partneri_konetempo = kaaskoneleja_silpide_arv/kaaskoneleja_kestus, partneri_soravus = kaaskoneleja_disf_arv/kaaskoneleja_kestus, partneri_soravus2 = kaaskoneleja_disf_arv/kaaskoneleja_sonade_arv*100) %>% select(subkorp, koneleja, sugu, vanus, partneri_sugu = kaaskoneleja_sugu, partneri_vanus = kaaskoneleja_vanus, konetempo, soravus, soravus2, partneri_konetempo, partneri_soravus, partneri_soravus2, vanusevahe) -> teke3 teke3$sugu <- factor(teke3$sugu) teke3$partneri_sugu <- factor(teke3$partneri_sugu) mod01<- bam( konetempo ~ vanus + s(koneleja, bs = "re"), data = teke3) mod02<- bam( konetempo ~ partneri_konetempo + s(koneleja, bs = "re"), data = teke3) mod <- bam( konetempo ~ partneri_konetempo +vanus + s(koneleja, bs = "re"), data = teke3) mod1 <- bam( konetempo ~ sugu +vanus + s(koneleja, bs = "re"), data = teke3) mod2 <- bam( konetempo ~ partneri_konetempo +vanusevahe+ s(koneleja, bs = "re"), data = teke3) mod3 <- bam( konetempo ~ sugu +vanusevahe+ s(koneleja, bs = "re"), data = teke3) AIC(mod,mod01, mod1, mod3) summary(mod) #plot(mod) ``` ### Kõnetempo ja kaaskõneleja kõnetempo täiskasvanutel ```{r, echo=F, message=F, fig.align = "center"} fonkorp2 %>% reframe(sugu, vanus, `partneri sugu` = kaaskoneleja_sugu, `partneri vanus` = kaaskoneleja_vanus, `kõneleja kõnetempo` = silpide_arv/kestus, `partneri kõnetempo` = kaaskoneleja_silpide_arv/kaaskoneleja_kestus) %>% #filter(`kõneleja kõnetempo`<6.5, `partneri kõnetempo`<6.5)%>% ggplot(aes(x = `kõneleja kõnetempo`, y = `partneri kõnetempo`, color = `partneri sugu`)) + geom_point(alpha = 0.3, size = 3) + # geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8)) + geom_smooth(method = "lm", formula = y ~x) + # facet_wrap("sugu") + #labs(title = "Kõnetempo vastavalt kaaskõneleja kõnetempole ja soole EKSKFKs") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Üldiselt on kõnetempo seotud vestluspartneri kõnetempoga, huvitav on, et vastassoost paaridel on seos tugevam. ```{r} fonkorp2 %>% mutate(subkorp = "Täiskasvanud", partneri_konetempo = kaaskoneleja_silpide_arv/kaaskoneleja_kestus, partneri_soravus = kaaskoneleja_disf_arv/kaaskoneleja_kestus, partneri_soravus2 = kaaskoneleja_disf_arv/kaaskoneleja_sonade_arv*100, vanusevahe = kaaskoneleja_vanus - vanus, konetempo = silpide_arv/kestus, soravus = disf_arv/kestus, soravus2 = disf_arv/sonade_arv*100) %>% select(subkorp, koneleja, sugu, vanus, partneri_sugu = kaaskoneleja_sugu, partneri_vanus = kaaskoneleja_vanus, konetempo, soravus, soravus2, partneri_konetempo, partneri_soravus, partneri_soravus2, vanusevahe) -> fonkorp3 mod <- bam( konetempo ~ partneri_konetempo+ vanus+sugu+ s(koneleja, bs = "re"), data = fonkorp3) mod1 <- bam( konetempo ~ partneri_konetempo* vanus*sugu+ s(koneleja, bs = "re"), data = fonkorp3) mod2 <- bam( konetempo ~ partneri_konetempo+ vanus*sugu+ s(koneleja, bs = "re"), data = fonkorp3) mod3 <- bam( konetempo ~ partneri_konetempo* vanus+sugu+ s(koneleja, bs = "re"), data = fonkorp3) AIC(mod,mod1,mod2,mod3) summary(mod2) ``` ### Joonis artiklisse Kõnetempo seos vestlusparneri tempoga (Joonis 2) ```{r} koond2 <- rbind (teke3, fonkorp3) koond2$subkorp <- factor(koond2$subkorp, levels=c("Teismelised", "Täiskasvanud")) joonis3 <- koond2 %>% ggplot(aes(x = partneri_konetempo, y = konetempo, color = sugu, pch = sugu)) + geom_point(alpha = 0.6, size = 2) + #geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 3)) + geom_smooth(method = "lm") + facet_grid(cols=vars(subkorp)) + #space="free", scales = "free_x" labs(y = "Kõnetempo (silpi/sek)", x="Vestluspartneri kõnetempo (silpi/sek)") + #ylim(2,8)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81"))+ # scale_shape_manual(values = c(25,2))+ NULL joonis3 ``` ```{r, eval=FALSE} pdf(file = "konetempo_RLY2024_joonis3.pdf", width = 4.7, height = 2.6) joonis3 dev.off() ``` ## Soravus Soravuse hindamiseks lugesime kokku takerdumisetele viitavad märgendid, mida mõlemas korpuses on märgendatud: - pooleli jäänud sõnad, - sõnakordused, - venitused. Arvutame soravuse mõõdiku 2 erineval viisil: - soravus = takerduste arv / kõneleja kõnevoorude kestus - soravus2 = takerduste arv / sõnade arv \* 100 ### Soravus teismelistel ```{r, echo=F, message=F, fig.align = "center"} teke2 %>% ggplot(aes(x = vanus, y = disf_arv/kestus, color = sugu)) + #geom_boxplot(aes(x=(vanus), y = disf_arv/kestus), inherit.aes = F, alpha = 0.3) + geom_point(alpha = 0.3, size = 3) + geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8)) + facet_wrap("sugu") + labs(y = "Takerdumisi sekundis") + ylim(0, 0.5)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Poistel on takerdumisi rohkem, aga vanusega langeb tüdrukutega samale tasemele. Testime ka alternatiivselt arvutatud soravust ```{r, echo=F, message=F, fig.align = "center"} teke3 %>% ggplot(aes(x = vanus, y = soravus2, color = sugu)) + #geom_boxplot(aes(x=(vanus), y = disf_arv/kestus), inherit.aes = F, alpha = 0.3) + geom_point(alpha = 0.3, size = 3) + geom_smooth(method="lm")+ #geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8)) + facet_wrap("sugu") + #labs(y = "Takerdumisi sekundis") + #ylim(0, 0.5)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` ```{r} mod1 <- bam(soravus ~ vanus + s(koneleja, bs = "re"), data = teke3) mod2 <- bam(soravus ~ vanus+sugu + s(koneleja, bs = "re"), data = teke3) mod3 <- bam(soravus ~ vanus*sugu + s(koneleja, bs = "re"), data = teke3) summary(mod3) AIC(mod1,mod2,mod3) ``` Soravus2 ```{r} mod <- bam(soravus2 ~ vanus + s(koneleja, bs = "re"), data = teke3) mod1 <- bam(soravus2 ~ vanus+sugu + s(koneleja, bs = "re"), data = teke3) mod2 <- bam(soravus2 ~ vanus*sugu + s(koneleja, bs = "re"), data = teke3) AIC(mod, mod1, mod2) summary(mod1) ``` Tulemused näitavad, et kaks soravuse arvutamise viisi annavad väga sarnased tulemused, aga soravus ajaühiku kohta seostub mudelis paremini kirjeldavate tunnustega. ### Soravus täiskasvanutel (Joonis 5) ```{r, echo=F, message=F, fig.align = "center"} joonis5 <- fonkorp3 %>% ggplot(aes(x = partneri_soravus, y = soravus, color = sugu, pch = sugu)) + geom_point(alpha = 0.6, size = 2) + geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs")) + labs(y = "Kõneleja soravus (takerdumisi/sek)", x="Partneri soravus (takerdumisi/sek)") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) joonis5 ``` ```{r, eval=FALSE} pdf(file = "konetempo_RLY2024_joonis5.pdf", width = 3.7, height = 2.6) joonis5 dev.off() ``` ```{r, echo=F, message=F, fig.align = "center"} fonkorp3 %>% #filter(soravus < 0.4 & partneri_soravus < 0.4) %>% ggplot(aes(x = partneri_soravus2, y = soravus2, color = sugu, pch = sugu)) + #geom_boxplot(aes(x=(vanus), y = disf_arv/kestus), inherit.aes = F, alpha = 0.3) + geom_point(alpha = 0.6, size = 2) + geom_smooth(method = "lm") + #geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs")) + #facet_wrap("sugu") + labs(y = "Kõneleja soravus (takerdumisi/sek)", x="Partneri soravus (takerdumisi/sek)") + #ylim(0, 0.4)+ xlim(0, 0.5)+ teema + scale_color_manual(values = c("#CB8F0D", "#198D81")) ``` Täiskasvanutel vanusega muutusi pole, meestel takerdumisi rohkem. ```{r} mod0 <- bam( soravus ~ s(koneleja, bs = "re"), data = fonkorp3) mod1a <- bam( soravus ~ sugu+ s(koneleja, bs = "re"), data = fonkorp3) mod1b <- bam( soravus ~ partneri_soravus+ s(koneleja, bs = "re"), data = fonkorp3) mod2 <- bam( soravus ~ sugu+partneri_soravus+ s(koneleja, bs = "re"), data = fonkorp3) mod3 <- bam( soravus ~ sugu*partneri_soravus+ s(koneleja, bs = "re"), data = fonkorp3) mod4 <- bam( soravus ~ s(partneri_soravus)+ s(koneleja, bs = "re"), data = fonkorp3) mod5 <- bam( soravus ~ s(partneri_soravus, by=sugu)+ s(koneleja, bs = "re"), data = fonkorp3) AIC(mod0, mod1a, mod1b, mod2, mod3, mod4, mod5) summary(mod5) #qqnorm(resid(mod5)) #qqline(resid(mod5)) # plot(mod5, select=1) # library(itsadug) # plot_diff(mod5, view = "partneri_soravus", comp = list(sugu= c("M", "N"))) # plot_smooth(mod5, view = "partneri_soravus", cond = list(sugu="M"), col="blue") # plot_smooth(mod5, view = "partneri_soravus", cond = list(sugu="N"), add=T, col=2) ``` ```{r} mod0 <- bam( soravus2 ~ s(koneleja, bs = "re"), data = fonkorp3) mod1a <- bam( soravus2 ~ sugu+ s(koneleja, bs = "re"), data = fonkorp3) mod1b <- bam( soravus2 ~ partneri_soravus2+ s(koneleja, bs = "re"), data = fonkorp3) mod2 <- bam( soravus2 ~ sugu+partneri_soravus2+ s(koneleja, bs = "re"), data = fonkorp3) mod3 <- bam( soravus2 ~ sugu*partneri_soravus2+ s(koneleja, bs = "re"), data = fonkorp3) mod4 <- bam( soravus2 ~ s(partneri_soravus2)+ s(koneleja, bs = "re"), data = fonkorp3) mod5 <- bam( soravus2 ~ s(partneri_soravus2, by=sugu)+ s(koneleja, bs = "re"), data = fonkorp3) AIC(mod0, mod1a, mod1b, mod2, mod3, mod4, mod5) summary(mod2) ``` Ka täiskasvanutel käituvad soravuse mõõdikud väga sarnaselt, aga seosed seletavate tunnustega on ajaühiku kohta arvestades tugevamad. ### Soravuse joonis artiklisse (Joonis 4) ```{r} joonis4 <- koond2 %>% ggplot(aes(x = vanus, y = soravus, color = sugu, pch = sugu)) + geom_point(alpha = 0.6, size = 2) + geom_smooth(method = "lm") + facet_grid(cols=vars(subkorp), scales = "free_x") + #space="free" labs(y = "Kõneleja soravus (takerdumisi/sek)", x="Vanus (aastad)") + teema + scale_color_manual(values = c("#CB8F0D", "#198D81"))+ NULL joonis4 koond2 %>% group_by(subkorp) %>% summarise(mean(soravus2)) ``` ```{r, eval=FALSE} pdf(file = "konetempo_RLY2024_joonis4.pdf", width = 4.7, height = 2.6) joonis4 dev.off() ``` ### Soravuse seos kõnetempoga teismelistel EI OLE OLULINE ```{r, echo=F, message=F, fig.align = "center"} teke2 %>% ggplot(aes(x = silpide_arv/kestus, y = disf_arv/kestus)) + #geom_boxplot(aes(x=(vanus), y = disf_arv/kestus), inherit.aes = F, alpha = 0.3) + geom_point(alpha = 0.3, size = 3, color = "#7F5C82") + geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8), color = "#7F5C82") + #facet_wrap("sugu") + labs(y = "Takerdumisi sekundis") + ylim(0,0.6)+ teema ``` ### Soravuse seos kõnetempoga täiskasvanutel EI OLE OLULINE ```{r, echo=F, message=F, fig.align = "center"} fonkorp2 %>% ggplot(aes(x = silpide_arv/kestus, y = disf_arv/kestus)) + #geom_boxplot(aes(x=(vanus), y = disf_arv/kestus), inherit.aes = F, alpha = 0.3) + geom_point(alpha = 0.3, size = 3, color = "#7F5C82") + geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 8), color = "#7F5C82") + #facet_wrap("sugu") + labs(y = "Takerdumisi sekundis") + ylim(0,0.6)+ teema ``` ## Näited foneetikakorpuse märgendusest (Joonis 1) ```{r} # heli ja spektrogrammi näite plottimiseks library(rPraat) library(phonTools) naited <- data.frame(file=c("SKK004-003_M", "SKK004-003_M", "SKK007-003_M", "SKK007-003_M", "SKK007-003_M"), alg = c(114.24961977135679, 1534.32751409178, 1075.2475339625817, 1528.4117838178388, 2258.1593359601507), lop = c(115.89897865844941, 1537.1660475406088, 1079.2431638835158, 1530.756380617994, 2263.914321834238)) naited <- naited[4,] # võtame ainult 4. näite for(f in unique(naited$file)) { snd <- snd.read(paste0("/Users/partel/ownCloud/EKSKFK/SKK0_WAV/", f, ".wav")) tg <- tg.read(paste0("/Users/partel/ownCloud/EKSKFK/SKK0_TG/", f, ".TextGrid")) for(nd in which(naited$file==f)){ #lõika jupp start = naited$alg[nd] stop = naited$lop[nd] snd2 <- snd.cut0(snd, Start = start, End = stop) tg2 <- tg.cut0(tg, start, stop) tg2 <- tg2[c("sõnad", "häälikud", "silbid")] # skaleerime heli 0-1 vahemikku snd3 <- (snd2$sig+max(abs(snd2$sig))) / (2*max(abs(snd2$sig))) # spektrogramm; # spec objektis on maatriks read = aeg, tulbad = sagedus, väärtus=intensiivsus spec <- spectrogram(as.vector(snd2$sig), fs = snd2$fs, colors = F,show = F)$spectrogram spec2 <- spec[,which(as.numeric(colnames(spec))<=5000)] # põhitoon # f0 <- pitchtrack(as.vector(snd2$sig), f0range = c(60,600), fs = snd2$fs, show = F) # f0 <- pitchtrack(as.vector(snd2$sig), f0range = quantile(f0$f0, probs = c(0.25,0.75)) * c(0.75,2), fs = snd2$fs, show = F,minacf = 0.85) # joonistab ploti, kus esimesel real on skaleeritud helilaine, siis on spektrogramm ning selle all textgridi kihid #pdf(file = paste0("naited_",f, nd, ".pdf"), width = 10, height = 5) #png(filename = paste0("naited_",f, nd, ".png"), width = 1400, height = 800) par(mar=c(0.1,4.5,0.1,0.1)) plot(1, type="n", xaxs="i", ylim=c(-length(names(tg2)),4), xlim=c(0, max(snd2$t)), axes=F, ylab="", xlab="") lines((snd3+3)~snd2$t) # plotib spektrogrammi for (i in 1:ncol(spec2)){ tmp <- spec2[,i]; tmp[tmp<(-60)] <- -60 värv = gray(level = (tmp/-60), alpha = 0.6) points(x= as.numeric(rownames(spec2))/1000, y = rep(i/100+0.03, nrow(spec2)), col=värv, pch=20, cex=0.1) } # joonistab f0 spektrogrammi peale sinisega # points(y=(f0$f0/100), x=(f0$time/1000), pch=20, cex=0.2, col="blue") # plotib textgridi for(k in names(tg2)){ kiht <- tg2[[k]] jrk <- which(names(tg2) == k) mtext(side = 2, at = -jrk+0.5, text = k, las=1, line=0.5) for(i in 1:length(kiht$t1)){ #segm_col = if(kiht$label[i]=="" | substr(kiht$label[i],1,1) %in% c(".","#")) {"white"} else {"light blue"} xt = c(kiht$t1[i], kiht$t2[i], kiht$t2[i], kiht$t1[i], kiht$t1[i]) polygon(x=xt, y= -c(jrk-1,jrk-1,jrk,jrk,jrk-1), border =1) text(x= (kiht$t1[i]+(kiht$t2[i]-kiht$t1[i])/2), y=-jrk+0.5, labels = gsub("//_","\n//_",kiht$label[i]), cex=1) }} #dev.off() } } ``` ## Viited