我试图弄清楚如何检测录音语料库中的音节数量。我认为一个好的代理可能是波文件中的峰值。
这是我用英语说的文件尝试的(我的实际用例是斯瓦希里语)。此示例录音的文字记录是:“这是我尝试使用计时器功能。我正在查看暂停、发声。” 这段话共有22个音节。
wav 文件:https ://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
R 中的seewave
包很棒,并且有几个潜在的功能。首先,导入波形文件。
library(seewave)
library(tuneR)
w <- readWave("YOURPATHHERE/test.wav")
w
# Wave Object
# Number of Samples: 278528
# Duration (seconds): 6.32
# Samplingrate (Hertz): 44100
# Channels (Mono/Stereo): Stereo
# PCM (integer format): TRUE
# Bit (8/16/24/32/64): 16
我尝试的第一件事是timer()
功能。它返回的一件事是每次发声的持续时间。此功能识别 7 个发声,远远少于 22 个音节。快速浏览一下情节表明发声不等于音节。
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
我还尝试了 fpeaks 函数而不设置阈值。它返回了 54 个峰值。
ms <- meanspec(w)
peaks <- fpeaks(ms)
这会根据频率而不是时间绘制幅度。添加一个等于 0.005 的阈值参数会滤除噪声并将计数减少到 23 个峰值,这与实际的音节数 (22) 非常接近。
我不确定这是最好的方法。结果会对阈值参数的值敏感,我必须处理大量文件。关于如何编码以检测代表音节的峰值的任何更好的想法?