Próbuję wymyślić, jak wykryć liczbę sylab w korpusie nagrań audio. Myślę, że dobrym proxy może być szczyty w pliku wave.
Oto, co próbowałem z plikiem mówiącym po angielsku (mój faktyczny przypadek użycia to Kiswahili). Zapis tego przykładowego nagrania brzmi: „To ja próbuję użyć funkcji timera. Patrzę na pauzy, wokalizacje”. W tym fragmencie znajduje się łącznie 22 sylab.
plik wav: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
seewave
Pakiet w R jest wielki, i istnieje kilka możliwych funkcji. Najpierw zaimportuj plik wave.
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
Pierwszą rzeczą, której spróbowałem, była timer()
funkcja. Jedną z rzeczy, które zwraca, jest czas trwania każdej wokalizacji. Ta funkcja identyfikuje 7 wokalizacji, czyli znacznie mniej niż 22 sylaby. Szybkie spojrzenie na fabułę sugeruje, że wokalizacje nie są równe sylabom.
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
Próbowałem także funkcji fpeaks bez ustawiania progu. Zwróciło 54 szczyty.
ms <- meanspec(w)
peaks <- fpeaks(ms)
Wykreśla amplitudę raczej według częstotliwości niż czasu. Dodanie parametru progowego równego 0,005 odfiltrowuje szum i zmniejsza liczbę do 23 pików, co jest bardzo zbliżone do faktycznej liczby sylab (22).
Nie jestem pewien, czy to najlepsze podejście. Wynik będzie wrażliwy na wartość parametru progu i muszę przetworzyć dużą partię plików. Czy są jakieś lepsze pomysły na to, jak zakodować to w celu wykrycia pików reprezentujących sylaby?
changepoint
pakietu. Mówiąc najprościej, analiza punktu zmiany koncentruje się na wykrywaniu zmiany, powiązany przykład dotyczy danych handlowych, ale może być interesujące zastosowanie tej techniki do solidnych danych.