Pracuję nad projektem w Pythonie, aby wykryć i sklasyfikować jakąś piosenkę ptasią, i znalazłem się w sytuacji, w której muszę przekonwertować plik fali na dane częstotliwości w funkcji czasu. Nie stanowiło to większego problemu, ale aby móc sklasyfikować różne sylaby w grupy, muszę napisać coś, co wykryje, gdy dane skupią się w określonym kształcie. Aby dać wyobrażenie o tym, jak wyglądają dane, oto obraz tego, jak wyglądają dane po wydrukowaniu:
Potrzebuję jakiegoś sposobu, aby uzyskać każdą sylabę (każdy kształt z separacją po obu stronach) i zapisać je w zmiennej lub we własnych plikach, abym mógł uruchomić korelację Pearsona między nimi za pomocą SciPy.
Ponadto wolę Python, ale jestem otwarty na kodowanie w innych językach, jeśli masz inny sposób.
Dzięki!
źródło
Odpowiedzi:
Dwa pytania:
1 / Blisko 8s, możemy zaobserwować stabilną wysokość dźwięku przez około 100 ms, a następnie nagły wzrost spada do 8,5 sekundy. Czy cała ta sekwencja (8s do 8,5s) tworzy jeden byt, czy też uważasz, że dwa etapy (stabilny, a następnie malejący) są dwoma bytami?
2 / Czy chcesz pracować z lub bez nadzoru. Czy wiesz z góry, jakich „wzorów” szukać?
Jeśli chcesz pracować bez nadzoru (powiedz, że zebrałeś nagrania i dążysz do wyodrębnienia z nich „ustrukturyzowanej reprezentacji”), twoim pierwszym problemem jest wykrywanie aktywności głosowej. Wystarczy użyć intensywności sygnału, być może w połączeniu z metryką „pitchiness” (powiedzmy stosunek maksymalnej autokorelacji w zakresie pomostu, tutaj 1kHz - 5kHz), aby wykryć segmenty, w których występuje aktywny silny ton tonalny. Filtruj medianę wynikowej sekwencji, aby ją wygładzić, a następnie ustaw wartość progową, aby uzyskać różne segmenty. Po podzieleniu sygnału na segmenty możesz robić z nimi ciekawe rzeczy. Na przykład, możesz wyodrębnić dla każdego z nich trajektorię wysokości tonu (sekwencja z najsilniejszym pikiem częstotliwości dla każdej ramki FFT lub coś bardziej niezawodnego wyodrębnionego za pomocą prawdziwego estymatora wysokości tonu), użyj DTW do obliczenia macierzy odległości parami między każdym blokiem i użyj algorytmu grupowania (k-średnie, skupienie aglomeracyjne) w celu zidentyfikowania grup o podobnych wzorach podziałów (segmenty 8: 8,5 i 10: 10,5). Jest prawdopodobne, że podejście bez nadzoru będzie nadmiernie segmentowało - na przykład 7.6: 8.5 i 9.6: 10.5 zostaną rozpoznane jako powtórzenie dwóch tych samych bloków, podczas gdy dla ciebie mogą one zasadniczo być jednym wzorem, ale możesz użyć czegoś takiegoSequitur, aby mieć jeden poziom struktury wyższy.
Jeśli masz predefiniowany słownik „wzorców”, którym chcesz oznaczyć swój sygnał, lepiej postępuj zgodnie z metodami stosowanymi do rozpoznawania mowy, z tą jedyną znaczącą różnicą, że rozpoznawanie mowy nie uwzględnia wysokości głosu podczas wielkość liter jest jedyną informacją, którą należy wziąć pod uwagę! System rozpoznawania mowy rozwiązuje zarówno zadania segmentacji, jak i rozpoznawania w jednej operacji dekodowania FST.
źródło