See on R-i kood, millega on analüüsitud kõnetempo ja soravuse andmeid Eesti Rakenduslingvistika Ühingu aastaraamatus ilmunud artikli tarvis.

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:

teke <- read.delim("teke_voorud.csv", encoding = "UTF-8") 
teke$sugu <- toupper(teke$sugu)
# 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

save(teke2, file = "teke_globaalne_konetempo.Rda")

Foneetika korpuse andmed

Salvestame globaalse kõnetempo andmed

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

load("teke_globaalne_konetempo.Rda")

Foneetika korpus

load("fonkorp_globaalne_konetempo.Rda")

Põhjatuule korpuse andmed

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,

Materjal: Eesti keele spontaanse kõne foneetiline korpus

EKSKFK (Lippus et al. 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;
  • 139 erinevat kõnelejat;
  • 67 meest ja 72 naist vanuses 20–69 aastat;
  • kokku 164 vestlust;
  • keskmine kestus 34 minutit (13–51 minutit);
  • kogukestus 46.2 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 268 salvestust;
  • 147 erinevat kõnelejat;
  • 64 meest ja 83 naist vanuses 20–81 aastat;
  • Keelejuhtidest 108 on samad, kes osalevad ka EKSKFK spontaansetes vestlustes.

Vestluspaaride sooline ja vanuseline jaotus TEKEs

Vestluspaaride sooline ja vanuseline jaotus EKSKFKs

Kõnelejate jaotus Põhjatuule ja päikese korpuses

Kõnetempo analüüs

Vanuse ja soo efekt

Teismeliste korpuses

Keskmiselt üle 5 silbi sekundis, poistel aeglasem.

teke2 %>% 
  group_by(sugu) %>% 
  summarise(tempo = mean(silpide_arv/kestus))
## # A tibble: 2 × 2
##   sugu  tempo
##   <fct> <dbl>
## 1 M      5.18
## 2 N      5.43
teke2 %>% summarise(tempo = (silpide_arv/kestus)) %>% summary()
##      tempo      
##  Min.   :3.004  
##  1st Qu.:4.697  
##  Median :5.348  
##  Mean   :5.355  
##  3rd Qu.:6.010  
##  Max.   :7.437

Testime vanuse & soo efekti GAM mudeliga

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)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## (silpide_arv/kestus) ~ vanus + sugu + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##             Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)  2.86847    0.48852   5.872 0.0000000519 ***
## vanus        0.16148    0.03342   4.833 0.0000046586 ***
## suguN        0.34985    0.16949   2.064       0.0415 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##              edf Ref.df     F             p-value    
## s(koneleja) 64.8     83 5.075 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.777   Deviance explained = 86.4%
## fREML =  162.4  Scale est. = 0.16489   n = 172
#concurvity(mod)
#qqnorm(resid(mod))
#qqline(resid(mod))


#par(mfrow = c(2,2))
#plot(mod, all.terms = T)

Kõnetempo täiskasvanutel

Meestel on keskmiselt madalam kõnetempo. Naistel püsib kõnetempo stabiilselt.

mod <- bam((silpide_arv/kestus) ~ sugu + s(vanus, by = sugu) + s(koneleja, bs = "re"), data = fonkorp2)
summary(mod)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## (silpide_arv/kestus) ~ sugu + s(vanus, by = sugu) + s(koneleja, 
##     bs = "re")
## 
## Parametric coefficients:
##             Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)  4.59834    0.08044  57.164 < 0.0000000000000002 ***
## suguN        0.34985    0.11130   3.143              0.00264 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                    edf  Ref.df     F             p-value    
## s(vanus):suguM   1.439   1.561 5.991              0.0221 *  
## s(vanus):suguN   1.000   1.000 0.191              0.6639    
## s(koneleja)    102.010 137.000 3.684 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.779   Deviance explained = 92.2%
## fREML = 158.21  Scale est. = 0.11219   n = 164
#plot(mod, select = 1)

Kõnetempo täiskasvanutel loetud kõnes

Täiskasvanutel loetud kõnes kõnetempo spontaansest veidi aeglasem, vanusega aeglustub, meestel ja naistel olulist vahet pole.

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)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## sprate ~ vanus + s(ID, bs = "re")
## 
## Parametric coefficients:
##              Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)  5.029573   0.125517  40.071 < 0.0000000000000002 ***
## vanus       -0.015441   0.002965  -5.208          0.000000696 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##         edf Ref.df     F             p-value    
## s(ID) 127.9    145 8.379 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.842   Deviance explained = 91.9%
## fREML =  170.4  Scale est. = 0.059059  n = 265
# plot(mod, select = 1)
# library(itsadug)
# plot_smooth(mod, view = "vanus")

Vanuse ja soo efekti joonis artiklisse (Joonis 2)

Kolme paneeliga vanuse efekti joonis

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))
## # A tibble: 3 × 2
##   subkorp        `mean(kõnetempo)`
##   <fct>                      <dbl>
## 1 Teismelised                 5.35
## 2 Täisk. vestlus              4.74
## 3 Täisk. loetud               4.37
pdf(file = "konetempo_RLY2024_joonis2.pdf", width = 4.7, height = 2.6)
joonis2
dev.off()

Kõnetempo ja kaaskõneleja kõnetempo teismelistel

Tugev seos vestluspartnerite kõnetempo vahel.

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)
##             df      AIC
## mod   63.70681 198.1210
## mod01 69.53718 232.6078
## mod1  69.40605 230.6907
## mod3  72.70982 234.7822
summary(mod)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## konetempo ~ partneri_konetempo + vanus + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##                    Estimate Std. Error t value           Pr(>|t|)    
## (Intercept)         1.36687    0.41453   3.297            0.00131 ** 
## partneri_konetempo  0.53540    0.06024   8.888 0.0000000000000134 ***
## vanus               0.08011    0.02736   2.928            0.00415 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##               edf Ref.df     F             p-value    
## s(koneleja) 58.67     84 2.822 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.814   Deviance explained =   88%
## fREML =  134.4  Scale est. = 0.13769   n = 172
#plot(mod)

Kõnetempo ja kaaskõneleja kõnetempo täiskasvanutel

Üldiselt on kõnetempo seotud vestluspartneri kõnetempoga, huvitav on, et vastassoost paaridel on seos tugevam.

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)
##            df      AIC
## mod  111.1351 118.8358
## mod1 112.9233 117.8681
## mod2 109.5618 125.1140
## mod3 111.3403 121.0139
summary(mod2)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## konetempo ~ partneri_konetempo + vanus * sugu + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##                     Estimate Std. Error t value           Pr(>|t|)    
## (Intercept)         3.544140   0.340956  10.395 0.0000000000000068 ***
## partneri_konetempo  0.382420   0.060007   6.373 0.0000000321935634 ***
## vanus              -0.019430   0.005369  -3.619            0.00062 ***
## suguN              -0.269333   0.294835  -0.914            0.36474    
## vanus:suguN         0.014601   0.007258   2.012            0.04886 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##               edf Ref.df     F             p-value    
## s(koneleja) 100.7    137 3.401 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.817   Deviance explained = 93.5%
## fREML = 147.17  Scale est. = 0.092819  n = 164

Joonis artiklisse Kõnetempo seos vestlusparneri tempoga (Joonis 2)

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

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

Poistel on takerdumisi rohkem, aga vanusega langeb tüdrukutega samale tasemele.

Testime ka alternatiivselt arvutatud soravust

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)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## soravus ~ vanus * sugu + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##              Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)  0.371850   0.060857   6.110 0.0000000117 ***
## vanus       -0.014846   0.004322  -3.435     0.000806 ***
## suguN       -0.201271   0.071927  -2.798     0.005954 ** 
## vanus:suguN  0.010835   0.005086   2.130     0.035096 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##               edf Ref.df     F             p-value    
## s(koneleja) 43.34     82 1.554 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.592   Deviance explained = 70.3%
## fREML = -246.25  Scale est. = 0.0018717  n = 172
AIC(mod1,mod2,mod3)
##            df       AIC
## mod1 55.42182 -545.7742
## mod2 50.56607 -548.7531
## mod3 49.33413 -548.8901

Soravus2

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)
##            df      AIC
## mod  53.20513 636.7725
## mod1 47.18383 630.2558
## mod2 46.66142 630.4613
summary(mod1)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## soravus2 ~ vanus + sugu + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##             Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)  9.91933    0.99655   9.954 < 0.0000000000000002 ***
## vanus       -0.33224    0.06847  -4.852           0.00000351 ***
## suguN       -1.66413    0.35343  -4.708           0.00000644 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##               edf Ref.df    F             p-value    
## s(koneleja) 42.14     83 1.42 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.605   Deviance explained = 70.7%
## fREML =  327.8  Scale est. = 1.7898    n = 172

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)

pdf(file = "konetempo_RLY2024_joonis5.pdf", width = 3.7, height = 2.6)
joonis5
dev.off()

Täiskasvanutel vanusega muutusi pole, meestel takerdumisi rohkem.

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)
##             df       AIC
## mod0  65.13931 -357.8396
## mod1a 63.92609 -357.0657
## mod1b 63.47528 -417.9727
## mod2  61.46934 -417.2943
## mod3  63.36678 -420.4588
## mod4  63.44335 -412.4818
## mod5  62.99913 -425.4324
summary(mod5)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## soravus ~ s(partneri_soravus, by = sugu) + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept) 0.222344   0.005775    38.5 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                              edf  Ref.df      F              p-value    
## s(partneri_soravus):suguM  2.919   3.427 16.588 < 0.0000000000000002 ***
## s(partneri_soravus):suguN  1.000   1.000 27.965          0.000000776 ***
## s(koneleja)               52.270 138.000  0.694             0.000602 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.579   Deviance explained = 72.4%
## fREML = -193.33  Scale est. = 0.0031152  n = 164
#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)
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)
##             df      AIC
## mod0  64.76198 872.5641
## mod1a 62.61601 870.2245
## mod1b 61.78111 847.2545
## mod2  59.31575 845.2620
## mod3  60.85073 844.5049
## mod4  61.78111 847.2545
## mod5  66.85364 847.1106
summary(mod2)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## soravus2 ~ sugu + partneri_soravus2 + s(koneleja, bs = "re")
## 
## Parametric coefficients:
##                   Estimate Std. Error t value         Pr(>|t|)    
## (Intercept)        5.92246    0.69626   8.506 0.00000000000011 ***
## suguN             -1.53274    0.56387  -2.718          0.00764 ** 
## partneri_soravus2  0.37584    0.06606   5.689 0.00000010984987 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##               edf Ref.df    F  p-value    
## s(koneleja) 52.68    137 0.78 0.000089 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.519   Deviance explained =   68%
## fREML = 432.33  Scale est. = 7.4451    n = 164

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)

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))
## # A tibble: 2 × 2
##   subkorp      `mean(soravus2)`
##   <fct>                   <dbl>
## 1 Teismelised              4.27
## 2 Täiskasvanud             8.36
pdf(file = "konetempo_RLY2024_joonis4.pdf", width = 4.7, height = 2.6)
joonis4
dev.off()

Soravuse seos kõnetempoga teismelistel EI OLE OLULINE

Soravuse seos kõnetempoga täiskasvanutel EI OLE OLULINE

Näited foneetikakorpuse märgendusest (Joonis 1)

# 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

Lippus, Pärtel, Kätlin Aare, Anton Malmi, Tuuli Tuisk & Pire Teras. 2021. Phonetic Corpus of Estonian Spontaneous Speech v1.2. https://doi.org/10.23673/RE-293.