Chapter 7 第七章 语音数据分析
7.4 课堂任务
# 数据处理函数大合集
library(tidyverse)
########################################
# ✔ dplyr 1.1.3 ✔ readr 2.1.4
# ✔ forcats 1.0.0 ✔ stringr 1.5.1
# ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
# ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
# ✔ purrr 1.0.2
#########################################
# 语音库管理
library(emuR)任务7.7:语音库构建与分析
构建语音库
# 设置语音库的位置
corpusPath = "data/ch7/speech_corp"
#
# # 设置已经标注的语音文件 .wav 和标注文件.TextGrid files的位置
# path2folder = "/Users/chenjuqiang/Desktop/AmE_Consonants/"
#
# # 基于语音文件和对应标注文件构建 emuDB 语音库
# # 注意:这一步只需要一次,语音库建设完成后不需要重复构建
# convert_TextGridCollection(dir = path2folder,
# dbName = "AmE_Consonants",
# targetDir = corpusPath)
#
# # 将语音库文件位置设置为一个变量
AMECpath = paste(corpusPath, "/AmE_Consonants_emuDB",sep = "")
# 将语音库载入R语言环境
# 注意这一步每次都需要先运行
AmeC.corp = load_emuDB(AMECpath, verbose = FALSE)
# 了解一下语音库
summary(AmeC.corp)时长提取
# 检索语音库中的鼻音和爆破音
nasals = query(AmeC.corp, query = "segment==n")%>%
mutate(type = "nasals")
plosives = query(AmeC.corp, "segment==b|p|t|d|k|g")%>%
mutate(type = "plosives")
#计算各自的时长
duration.df = rbind(nasals,plosives)%>%
mutate(duration = end-start)%>%
select(labels, type, duration, bundle)
duration.df 共振峰提取
# 元音ai在Praat中的标注是“a\\ic”,
vwl = query(AmeC.corp, query = "segment== a\\ic")
# 提取共振峰信息
# 所得表格中最后为共振峰信息,T1、T2、T3、T4
vwl.fm = get_trackdata(AmeC.corp, vwl,
onTheFlyFunctionName = "forest",
resultType = "emuRtrackdata")
# load package
library(ggplot2)
# 第一共振峰
ggplot(vwl.fm ) +
aes(x = times_rel, y = T1, col = labels, group = sl_rowIdx) +
geom_line() +
labs(x = "Duration (ms)", y = "F1 (Hz)")
# 将共振峰信息进行时长归一化
td_vowels_norm = normalize_length(vwl.fm)
ggplot(td_vowels_norm) +
aes(x = times_norm, y = T1, col = labels, group = labels) +
geom_smooth() +
labs(x = "Duration (normalized)", y = "F1 (Hz)")
# 下面我们提取共振峰中最稳定的部分,中间点
td_vowels_midpoint = td_vowels_norm %>%
filter(times_norm == 0.5)
# 计算元音在一、二共振峰的中心点
td_centroids = td_vowels_midpoint %>%
group_by(labels) %>%
summarise(T1 = mean(T1), T2 = mean(T2))
# 画元音的位置图
ggplot(td_vowels_midpoint, aes(x = T2, y = T1, colour = labels, label = labels)) +
geom_text(data = td_centroids) +
stat_ellipse() +
scale_y_reverse() + scale_x_reverse() +
labs(x = "F2 (Hz)", y = "F1 (Hz)") +
theme(legend.position="none")基频分析
基频是语音中音高的声学基础。所有响音(如元音和鼻音)都有基频。我们说话的语调也是由基频的变化体现的。此外,一些语言如汉语使用基频区分不同词的意思,又称声调。
vwl.f0 = get_trackdata(AmeC.corp, vwl,
onTheFlyFunctionName = "ksvF0",
resultType = "emuRtrackdata")
# 此时T1表示的是基频FO
ggplot(vwl.f0 ) +
aes(x = times_rel, y = T1, col = labels, group = sl_rowIdx) +
geom_line() +
labs(x = "Duration (ms)", y = "F0 (Hz)")
# 将基频信息进行时长归一化
f0_norm = normalize_length(vwl.f0)
ggplot(f0_norm) +
aes(x = times_norm, y = T1, col = labels, group = labels) +
geom_smooth() +
labs(x = "Duration (normalized)", y = "F0 (Hz)")