Я пытаюсь выяснить, как определить количество слогов в корпусе аудиозаписей. Я думаю, что хороший прокси может быть пиками в волновом файле.
Вот то, что я попробовал с файлом моего разговора на английском языке (мой фактический случай использования на кисуахили). Стенограмма записи этого примера: «Я пытаюсь использовать функцию таймера. Я смотрю на паузы, вокализации». Всего в этом отрывке 22 слога.
WAV-файл: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
seewave
Пакет в R велик, и есть несколько потенциальных функций. Перво-наперво, импортируйте файл волны.
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).
Я не уверен, что это лучший подход. Результат будет чувствителен к значению параметра threshold, и мне придется обрабатывать большой пакет файлов. Есть лучшие идеи о том, как кодировать это, чтобы обнаружить пики, которые представляют слоги?
changepoint
пакета. Проще говоря, анализ точек изменения фокусируется на обнаружении изменений, связанный пример касается торговых данных, но было бы интересно применить эту технику к звуковым данным.