Jak wydobyć część wokalną z stereofonicznego sygnału audio?

15

Teraz przetwarzam plik MP3 i napotkałem ten problem. Moje MP3 jest zakodowane stereo. Chcę wyodrębnić partię wokalną do dalszego przetwarzania (niezależnie od trybu sygnałów wyjściowych, mono lub stereo).

O ile mi wiadomo, audio jest zakodowane w różnych pasmach sub-dis-joint w MP3. Myślę, że mogę ograniczyć sygnały do ​​zakresu głosu poprzez filtr górnoprzepustowy / dolnoprzepustowy z odpowiednią częstotliwością odcięcia. Jednak w takim przypadku wynik musi zawierać fragment czystego sygnału muzycznego. Albo po googlowaniu, myślę, że najpierw mogę obliczyć sygnały tła (odwracając dodawanie jednego kanału z sygnałami z drugiego kanału, zakładając, że część wokalna jest wyśrodkowana w dźwięku stereo zwanym eliminacją fazy). Po tej transformacji sygnał jest monofoniczny. Następnie powinienem połączyć oryginalne stereo z mono, z którego wydobywam sygnał tła.

Biorąc pod uwagę skuteczność, które z nich jest preferowane (lub inne rozwiązania :)? Jeśli drugi, niech dwa kanały A i B, czy (BA) lub (AB) zostaną użyte do obliczenia tła? Czy w przypadku łączenia dwóch kanałów arytmetyka oznacza wystarczająco dokładny? Czy mogę próbkować w dół każdy kanał dwa razy i przeplatać próbkowane w dół sygnały jako wynik monofoniczny?

Dziękuję i pozdrawiam.

Summer_More_More_Tea
źródło

Odpowiedzi:

21

Po pierwsze, sposób, w jaki dane są kodowane w pliku mp3, nie ma znaczenia dla pytania, chyba że dąży się do przetwarzania w domenie skompresowanej (co byłoby dość głupie). Możesz więc założyć, że Twój algorytm będzie działał z dekompresowanymi danymi w dziedzinie czasu.

Suma / różnica to bardzo, bardzo podstawowa sztuczka do tłumienia głosu (nie ekstrakcja). Opiera się na założeniu, że wokale są miksowane w środku pola stereo, podczas gdy inne instrumenty są przesuwane bocznie. To rzadko jest prawdą. LR i RL będą brzmiały tak samo (ludzkie ucho jest niewrażliwe na globalne przesunięcie fazowe) i da ci miks monofoniczny bez instrumentów miksowanych w środku. Problem polega na tym, że po odzyskaniu tła co z tym zrobisz? Próbujesz stłumić sygnał ze środkowego (średniego) sygnału? To nie zadziała, będziesz robić (L + R) / 2 - (L - R), to nie jest bardzo interesujące ... Możesz wypróbować dowolne kombinacje liniowe (uśrednione i „usunięte centrum”), nic wyjdzie z tego!

Jeśli chodzi o podejście do filtrowania: f0 głosu rzadko przekracza 1000 Hz, ale jego harmoniczne mogą przekraczać to. Usunięcie najwyższej częstotliwości spowoduje, że spółgłoski (zwłaszcza sss, chhh) będą nieprzyjemne. Niektóre głosy męskie spadają poniżej 100 Hz. Możesz jednak bezpiecznie przecinać wszystko, co jest poniżej 50 lub 60 Hz (bas, kopnięcie)

Warto zapoznać się z najnowszymi osiągnięciami w zakresie separacji głosu:

  • Tło filtra NMF + grzebień harmonicznych> Jean Louis Durrieu > . Kod Pythona tutaj .
  • Metoda ekstrakcji tła Rafii . Prosty w kodowaniu i działa dobrze w muzyce produkowanej komputerowo z bardzo powtarzalnymi wzorami, takimi jak Electro, Hip-hop ...
  • Podejście Hsu opiera się na wykrywaniu, śledzeniu i maskowaniu f0. „Algorytm tandemowy dla śpiewania wydobywania dźwięków i oddzielania głosu od akompaniamentu muzycznego” (nie można znaleźć dostępnego pliku PDF).
fenenety
źródło
4

Dzięki za referencje! Zapomniałeś wspomnieć o swojej pracy nad ulepszaniem perkusji , która może być również interesująca dla aplikacji Summer_More_More_Tea. Cóż, to wszystko naprawdę zależy od tego, co chcesz z tym zrobić. Czy masz na myśli konkretną „aplikację końcową”?

Całkowicie zgadzam się z powyższymi stwierdzeniami fenenet. Podsumowując, muszę jednak powiedzieć, że wspomniane ulepszenie głosu zostało również wykorzystane w niektórych utworach Matti Ryynänen, dotyczących generowania ścieżek karaoke, w celu poprawy wyników.

Aby odpowiedzieć na twoje pytania:

Biorąc pod uwagę skuteczność, które z nich jest preferowane (lub inne rozwiązania :)?

Jak powiedział pikenety, żadne nie wydaje się odpowiadać twoim potrzebom: filtrowanie dolnoprzepustowe / górnoprzepustowe z pewnością zawiedzie z powodu harmonicznej struktury ludzkiego głosu (i bardziej ogólnie dowolnego „interesującego” dźwięku - tj. Czegokolwiek poza sinusoidami ... ).

Jeśli drugi, niech dwa kanały A i B, czy (BA) lub (AB) zostaną użyte do obliczenia tła? Czy w przypadku łączenia dwóch kanałów arytmetyka oznacza wystarczająco dokładny?

Ponownie, druga metoda, o której wspominasz, nie zadziała, ponieważ możesz usunąć tylko sygnał znajdujący się w środku, a nie odzyskać go. Innymi słowy, nawet wokale znajdują się w „centrum”, nie ma prostej matematyki, aby uzyskać sygnał tylko dla wokalu.

Czy mogę próbkować w dół każdy kanał dwa razy i przeplatać próbkowane w dół sygnały jako wynik monofoniczny?

er ... uśrednianie kanałów w celu uzyskania sygnału jednokanałowego, jak zasugerowano powyżej, ma sens i nie psuje właściwości spektralnych twojego sygnału (zakładając, że sygnał stereo nie jest zdegenerowany). Otrzymujesz sygnał monofoniczny, w którym masz zasadniczo taką samą treść muzyczną jak poprzednio.

Prawidłowe próbkowanie w dół każdego kanału oznacza, że ​​najpierw zastosujesz filtr dolnoprzepustowy (z częstotliwością odcięcia próbkowania_rate / 4 w twoim przypadku), a następnie możesz bezpiecznie pobrać co 2 próbki. Nie ma jednak wiele do powiedzenia na temat przeplatania kanałów w ten sposób próbkowanych w dół: w większości ogólnych przypadków zaburza to charakterystykę spektralną twojego sygnału. Prawdopodobnie tego nie chcesz.

Rzeczywiście, operacja filtrowania dolnoprzepustowego, po której następuje ustawienie na 0 co 2 próbki i utrzymywanie tych odprowadzeń 0, w dziedzinie Fouriera, w celu „odbicia lustrzanego” komponentów o niskiej częstotliwości, które były trzymane na tych o wysokiej częstotliwości. Pamiętaj, że lekcje przetwarzania sygnałów dotyczące teorii próbkowania: pomnożenie przez sekwencję impulsów (lub diraków) powoduje splot z inną sekwencją diraków w dziedzinie Fouriera, tj. W takim przypadku widmo częstotliwości sygnału jest powtarzane (okresowo) wzdłuż osi częstotliwości, z okresem równym częstotliwości próbkowania.

Zwykle podczas próbkowania w dół usuwasz zera (ponieważ zakładasz nową częstotliwość próbkowania). Ale tutaj ich utrzymanie powoduje bardzo irytujące dodatkowe komponenty wysokiej częstotliwości. Przeplatanie tych sygnałów nie naprawi tego.

W sumie krótka odpowiedź: nie rób tego . :-)

W końcu mogę również zasugerować użycie GUI, które opracowałem na konferencję LVAICA 2012: istnieje git repo . Nadal debuguję i poprawiam, więc komentarze są mile widziane: D

Mam nadzieję, że to pomaga!

Jean-Louis Durrieu
źródło