Kilka tygodni eksperymentowałem, aby znaleźć sposób na dopasowanie / znalezienie podobnych utworów w bibliotece zawierającej różne gatunki muzyczne.
Moja pierwsza próba polegała na wykryciu funkcji takich jak Tempo lub ilości basów w utworach, aby utworzyć grupy, ale nie posunąłem się za daleko z tym podejściem (wykrywanie uderzeń oparte na zmianach głośności), ponieważ na około 20% utworów Beat nie trzeba liczyć zawsze czasami 1/2 lub 1/3 z nich i nie mogłem tego wdrożyć.
Po kilku tygodniach nieudanych prób dostałem nowy pomysł, który jest opisany w dalszej części tego postu. Po prostu działa, pobierając Próbki plików spektrum, tworząc coś w rodzaju „przeciętnego spektrum” plików, aby je porównać. Pomysł był taki, że na przykład Hardstyle ma znacznie więcej basu niż przeciętna muzyka rockowa, zweryfikowałem to również, patrząc na niektóre widma w Audacity.
- Plik 1: Pobierz pełne spektrum plików FFT (atm atm 2048, Log Amplitudes. Skalowane)
- Zsumuj wszystkie tablice widm, weź średnie z każdego pojemnika
- Zrób to samo z innymi plikami, zapisz wszystkie wyniki
- Zrób listę różnic wartości FFT między plikiem 1 a innymi plikami
- Zrób średnią różnic między plikiem 1 a plikiem X
- Sortuj rosnąco według tych średnich
- Piosenki o najniższej „wartości różnicy” są uważane za podobne.
Czy niektórzy z was, którzy mają dobrą wiedzę, mogą powiedzieć mi, czy byłby to właściwy / dobry sposób na wdrożenie mojego pomysłu?
Odpowiedzi:
To, co próbujesz zrobić, zostało wielokrotnie sprawdzone przez setki badaczy i jest na to sporo pracy. Sprawdź przebieg konferencji ISMIR. Nawet jeśli nie jest aktualne, przeczytaj tezę Eliasa Pampalka: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf
Aby szybko zorientować Cię na właściwej drodze:
Muzyka może być podobna do wielu wymiarów: a) barwa / tekstura / gatunek; b) wzór rytmiczny; c) progresja melodii / akordu ... i wiele więcej! Z wiadomości nie wynika jasno, co chcesz zmierzyć!
To dotyczy funkcji. Teraz musisz pomyśleć o lepszym sposobie porównywania swoich piosenek, gdy zostaną one przedstawione jako sekwencja tych funkcji. Obliczanie różnic między sekwencjami między parami nie jest zbyt mądre - np. Porównanie piosenki i tego samego utworu z pewną ciszą da różnicę, podczas gdy jest dokładnie taka sama! Wolisz porównać rozkład tych funkcji; na przykład obliczyć średnią / standardowe odchylenie cech nad piosenką A i średnią / standardową odchylenie cech nad piosenką B, a następnie przyjąć dystans probabilistyczny (KL, Bhattacharyya nad nimi).
Ostatni punkt, który jednak będzie miał znaczenie później: obliczenie odległości między utworem a resztą korpusu w celu znalezienia najbliższych dopasowań jest dość nieefektywne. W przypadku dużych kolekcji techniki takie jak drzewa LSH lub drzewa Ball umożliwiają wykonywanie zapytań od najbliższych sąsiadów bez wyraźnego porównania z całym ciałem.
Nawiasem mówiąc, wykrywanie tempa to zupełnie inna sprawa. Jeśli chcesz się temu przyjrzeć, najlepszym dokumentem dotyczącym wydajności / dostępności na ten temat jest Ellis Beat Tracking by Dynamic Programming. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Jest niezwykle prosty, ale zbliżony do najnowocześniejszych algorytmów.
źródło