Подключаем библиотеки:
library(dplyr)
library(ggplot2)
library(phonR)
library(vowels)
library(readr)
library(lingtypology)
Рутульский язык (Нахско-дагестанские > Лезгинские > Западно-лезгинские)
Кининский диалект рутульского:
(простите, я не научился центрировать карту в нужном месте)
map.feature(languages = vcol$language,
features = vcol$language,
color = vcol$color,
latitude = vcol$lat,
longitude = vcol$lon,
label = vcol$eng
)
Узнать что-то про рутульскую редукцию гласных!
Подходы к ударению и редукции:
долгота гласного (duration)
если редукция качественная, то разница в F1 и F2
интенсивность (intensity)
спектральный скос (spectral tilt)
На самом деле cловами “spectral tilt” называют примерно тысячу вещей:
H1-H2
H1-A1
H1-A2
Нам потенциально подходит мера A1-A2:
Спойлер: мне не удалось нормально вытащить A1-A2, так что в этот раз обойдемся без него.
Итак, у нас осталось 3 меры.
Записаны 30 июня и 1 июля сего года
5 информант_ок 1971-1982 г. р.
Параметры: Моно, .wav 24-bit, ЧД 44100 Гц.
На данный момент размечено 4 записи (одна оказалась с проблемами, поэтому было решено её отложить до выяснения)
Скрипт для вытаскивания данных из данных взят отсюда: [Washington 2018]
Я немного его модифицировал
Ударение выделено акутом, желтой подсветкой – интересующий нас гласный.
Проблемы со стимулами:
! Повсюду плавные (в правом контексте)
сложная морфология (причастия, рефактив) вводила в замешательство, люди старались избавиться от нее, несмотря на мои уговоры
Чудовищная вариативность косвенных форм (но тут уж ничего не поделать)
В одном случае пришлось взять клитизованную связку, потому что другой заударный контекст для ки* мне отказались придумывать
Иней – плохая идея ленивого человека.
Разное количество рядов стимулов на группу – столько осталось после выбраковки
Про сегментацию есть умная книжка: [Machač, Skarnitzl 2009].
Плохая новость №1 - она есть в интернете только кусками.
Плохая новость №2 - там в основном только про интервокальные штуки, хотя нечто общетеоретическое там тоже есть.
Для меня было важным, что они предлагают ставить границы между формантными колонками (formant columns) (сразу перед или после)
Итак:
Что кодировалось?
Гласный
Позиция относительно ударения (ударный, предударный, заударный)
Тип произнесения (1, 2, 3, контекстное произнесение)
Слово
Спикер
Понятное дело, на этом месте возникли проблемы с нашими любимыми плавными.
Их я размечал скорее импрессионистически, ориентируясь на степень зачернения колонок и на гомогенность колонок по всему спектру
Данные:
data
Скрипт позволяет доставать форманты в более “sophisticated” формате, но я пока не додумался как это можно использовать.
Но он очень тяжелый, поэтому пруфов не будет.
Разделим данные на изолированные и контекстные произнесения:
iso = filter(data, type %in% c("1","2","3"))
ctxt = filter(data, type == "CP")
Посмотрим, что у нас с длительностью:
ggplot2::ggplot(iso, aes(x = vowel, y = duration, color = position)) +
geom_boxplot() +
theme_classic()
stpu = filter(iso, position != "ZU")
t.test(stpu$duration~stpu$position)
Welch Two Sample t-test
data: stpu$duration by stpu$position
t = -18.419, df = 286.34, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.07695864 -0.06209903
sample estimates:
mean in group PU mean in group ST
0.07016941 0.13969825
stzu = filter(iso, position != "PU")
t.test(stzu$duration~stzu$position)
Welch Two Sample t-test
data: stzu$duration by stzu$position
t = 12.374, df = 285.45, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.03918263 0.05400535
sample estimates:
mean in group ST mean in group ZU
0.13969825 0.09310426
puzu = filter(iso, position != "ST")
t.test(puzu$duration~puzu$position)
Welch Two Sample t-test
data: puzu$duration by puzu$position
t = -7.1763, df = 297.99, p-value = 5.717e-12
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.02922430 -0.01664538
sample estimates:
mean in group PU mean in group ZU
0.07016941 0.09310426
ggplot2::ggplot(ctxt, aes(x = vowel, y = duration, color = position)) +
geom_boxplot() +
theme_classic()
stpuc = filter(ctxt, position != "ZU")
t.test(stpuc$duration~stpuc$position)
Welch Two Sample t-test
data: stpuc$duration by stpuc$position
t = -5.1745, df = 87.398, p-value = 1.44e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.04947632 -0.02201636
sample estimates:
mean in group PU mean in group ST
0.05405204 0.08979837
stzuc = filter(ctxt, position != "PU")
t.test(stzuc$duration~stzuc$position)
Welch Two Sample t-test
data: stzuc$duration by stzuc$position
t = 3.7782, df = 83.362, p-value = 0.0002955
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.01207073 0.03890313
sample estimates:
mean in group ST mean in group ZU
0.08979837 0.06431144
puzuc = filter(ctxt, position != "ST")
t.test(puzuc$duration~puzuc$position)
Welch Two Sample t-test
data: puzuc$duration by puzuc$position
t = -2.0041, df = 100.11, p-value = 0.04776
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.0204157157 -0.0001030983
sample estimates:
mean in group PU mean in group ZU
0.05405204 0.06431144
Пробуем провернуть тот же трюк:
Интенсивность определилась не для всего, так что:
intens_flt = filter(iso, intensity != "NA")
intens_flt_ctxt = filter(ctxt, intensity != "NA")
ggplot2::ggplot(intens_flt, aes(x = vowel, y = intensity, color = position)) +
geom_boxplot() +
theme_classic()
stpu_intens = filter(intens_flt, position != "ZU")
t.test(stpu_intens$intensity~stpu_intens$position)
Welch Two Sample t-test
data: stpu_intens$intensity by stpu_intens$position
t = -4.7999, df = 304.43, p-value = 2.492e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-2.566735 -1.074107
sample estimates:
mean in group PU mean in group ST
60.58536 62.40578
stzu_intens = filter(intens_flt, position != "PU")
t.test(stzu_intens$intensity~stzu_intens$position)
Welch Two Sample t-test
data: stzu_intens$intensity by stzu_intens$position
t = 6.3512, df = 216.69, p-value = 1.238e-09
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
2.179721 4.141339
sample estimates:
mean in group ST mean in group ZU
62.53475 59.37422
puzu_intens = filter(intens_flt, position != "ST")
t.test(puzu_intens$intensity~puzu_intens$position)
Welch Two Sample t-test
data: puzu_intens$intensity by puzu_intens$position
t = 5.0551, df = 272.79, p-value = 7.896e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
1.417276 3.225305
sample estimates:
mean in group PU mean in group ZU
60.58536 58.26407
С контекстными слишком мало данных, подозреваю, что там слишком короткие сегменты были.
Форманты от четверти и от половины длительности:
with(iso, plotVowels(sf1, sf2, vowel, pretty = TRUE, alpha.tokens = 0.2, col = "red",
col.axis = "red", xlim = c(3500, 500), ylim = c(1200, 200)))
par(new = TRUE)
with(iso, plotVowels(qf1, qf2, vowel, pretty = TRUE, alpha.tokens = 0.2, xlim = c(3500,
500), ylim = c(1200, 200)))
Для начала просто нарисуем:
with(iso, plotVowels(sf1, sf2, vowel, plot.tokens = TRUE, pch.tokens = vowel,
cex.tokens = 1.2, alpha.tokens = 0.4, plot.means = TRUE, pch.means = vowel,
cex.means = 4, var.col.by = vowel, family = "Brill", pretty = TRUE))
Нормализация:
fornorm = subset(iso, select = c(speaker, vowel, word, sf1, sf2, sf3))
fornorm[,"gl.F1"] <- NA
fornorm[,"gl.F2"] <- NA
fornorm[,"gl.F3"] <- NA
names(fornorm)[names(fornorm) == "vowel"] <- "vowel.frame"
names(fornorm)[names(fornorm) == "word"] <- "context"
fornorm <- as.data.frame(fornorm)
normed = vowels::norm.lobanov(fornorm)
normedn = vowels::norm.nearey(fornorm)
names(normed)[names(normed) == "F*1"] <- "sf1"
names(normed)[names(normed) == "F*2"] <- "sf2"
names(normed)[names(normed) == "Vowel"] <- "vowel"
with(normed, plotVowels(sf1, sf2, vowel, plot.tokens = TRUE, pch.tokens = vowel,
cex.tokens = 1.2, alpha.tokens = 0.4, plot.means = TRUE, pch.means = vowel,
cex.means = 4, var.col.by = vowel, family = "Brill", pretty = TRUE))
names(normedn)[names(normedn) == "F*1"] <- "sf1"
names(normedn)[names(normedn) == "F*2"] <- "sf2"
names(normedn)[names(normedn) == "Vowel"] <- "vowel"
with(normedn, plotVowels(sf1, sf2, vowel, plot.tokens = TRUE, pch.tokens = vowel,
cex.tokens = 1.2, alpha.tokens = 0.4, plot.means = TRUE, pch.means = vowel,
cex.means = 4, var.col.by = vowel, family = "Brill", pretty = TRUE))
with(iso, plotVowels(sf1, sf2, vowel, plot.tokens = TRUE, pch.tokens = vowel,
cex.tokens = 1.2, alpha.tokens = 1, plot.means = FALSE, pch.means = vowel,
cex.means = 4, var.col.by = position, pretty = TRUE, family = "Brill", legend.kwd = "bottomright"))
#pos = select(iso, position)
#normedn = mutate(normedn, position = iso$position)
with(iso, plotVowels(sf1, sf2, vowel, group = position, plot.tokens = FALSE, plot.means = TRUE,
pch.means = vowel, cex.means = 2, var.col.by = position, var.sty.by = position, ellipse.fill = TRUE,
poly.line = TRUE, poly.order = c("i", "e", "a", "u", "ɨ"), pretty = TRUE))
nnred = mutate(iso, nred = ifelse(position == "ST", "ST", "NST"))
with(nnred, plotVowels(sf1, sf2, vowel, group = nred, plot.tokens = FALSE, plot.means = TRUE,
pch.means = vowel, cex.means = 2, var.col.by = nred, var.sty.by = nred, ellipse.fill = TRUE,
poly.line = TRUE, poly.order = c("i", "e", "a", "u", "ɨ"), pretty = TRUE, legend.kwd = "bottomright"))