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?
źródło
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.Odpowiedzi:
Nie sądzę, aby to, co następuje, było najlepszym rozwiązaniem, ale @ eipi10 miał dobrą sugestię, aby sprawdzić tę odpowiedź na CrossValidated . Więc zrobiłem.
Pierwszym krokiem jest utworzenie
argmax
funkcji:Wprowadziłem niewielkie zmiany w
test
funkcji kreślenia: (a), aby wyraźnie zdefiniować xiy oraz (b), aby pokazać liczbę pików:Podobnie jak
fpeaks
podejście, o którym wspomniałem w moim pierwotnym pytaniu, to podejście wymaga również sporego dostrojenia. Nie będę znać odpowiedzi „właściwej” (tj. Liczby sylab / pików), więc nie jestem pewien, jak zdefiniować regułę decyzyjną.W tym momencie
fpeaks
wydaje mi się trochę mniej skomplikowane, ale wciąż niezadowalające.źródło
loess
nie widzę wyraźnie podanych argumentów za stopniem wygładzenia. W rzeczywistości nie ma sensu biegać za ruchomym oknem: robi to już wewnętrznie.w
był to argument podczas wygładzania. Oto jak autor oryginalnego rozwiązania opisał funkcję: „Istnieją dwa parametry, które należy dostosować do okoliczności: w to połowa szerokości okna używanego do obliczenia maksimum lokalnego ... Kolejny - nie jest to jednoznaczne code - jest argumentem span mniejszej wygładzenia. "w
jako jeden z parametrów, ponieważ miał na myśli bardzo ogólne podejście, w którym wygładzacz może nie być mniejszy, ale być może byłby medianą okienkową lub Hanningiem, lub czymkolwiek innym, co uznano by za odpowiednie dla statystycznego zachowania danych i cele analityka. Właściwości wielu z tych wygładzaczy zależałyby od szerokości okna.Miałem podobne problemy z analizą profili elektroforezy białek. Rozwiązałem je, stosując niektóre funkcje pakietu msprocess R do drugich pochodnych profili (patrz https://fr.wikipedia.org/wiki/D%C3%A9pouillement_d 'une_courbe # Position_et_hauteur_du_pic). Zostało to opublikowane tutaj: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract;jsessionid=8EE0B64238728C0979FF71C576884771.f02t03
Nie mam pojęcia, czy podobne rozwiązanie może Ci pomóc. Powodzenia
źródło
Oto biblioteka w Pythonie, z której korzystałem wcześniej, próbując oszacować okresowość przez znalezienie pików w funkcji autokorelacji.
Wykorzystuje różnice / dyskretne pochodne pierwszego rzędu do wykrywania pików i obsługuje strojenie według progów i minimalnych odległości (między kolejnymi pikami). Rozdzielczość pików można również poprawić za pomocą estymacji i interpolacji Gaussa (patrz link).
Działa całkiem dobrze po wyjęciu z pudełka, bez większych poprawek, nawet w przypadku głośnych danych. Spróbuj.
źródło
Chciałbym zaproponować rozwiązanie wykorzystujące
changepoint
pakiet. Poniższy uproszczony przykład próbuje zidentyfikować piki, zdefiniowane tutaj jako punkty zmiany , patrząc na jeden kanał z dostępnych danych.Przykład
Pozyskiwanie danych
Przygotowywanie danych
Wykres wygenerowany przez
plot.ts
połączenie:Analiza punktu zmiany
changepoint
Pakiet zawiera szereg opcji do identyfikacji zmian / piki w danych. Poniższy kod stanowi tylko prosty przykład znalezienia 3 pików przy użyciu metody BinSeg :Uzyskany wykres: Możliwe jest również uzyskanie wartości:
Notatki dodatkowe
Podany przykład dotyczy głównie zilustrowania, w jaki sposób można zastosować analizę punktu zmiany do dostarczonych danych; należy zachować ostrożność w odniesieniu do parametrów przekazywanych do
cp.var
funkcji. Szczegółowe wyjaśnienie pakietu i dostępnych funkcjonalności znajduje się w następującym artykule:Killick, Rebecca i Eckley, Idris (2014) changepoint: pakiet R do analizy zmian. Journal of Statistics Software, 58 (3). s. 1-19.
ecp
ecp
, jest kolejnym wartym uwagi pakietem R.ecp
Ułatwia przedsięwzięcie nieparametryczny wielowymiarowa analiza punkt zmiany, które mogą być przydatne, jeśli ktoś chciałby zidentyfikować punkty zmiany zachodzące w wielu kanałach.źródło