Określ, gdzie zaczyna się śpiewanie w nagraniu głosowym

14

Mam małą aplikację w stylu karaoke, w której użytkownik śpiewa 4 wiersze piosenki, z jedną sekundą przerwy między nimi. Nie ma podkładu muzycznego, więc jest to tylko głos, miejmy nadzieję, że problem będzie łatwiejszy do rozwiązania.

Szukam najbardziej niezawodnego sposobu na dokładne wykrycie, gdzie w moim nagraniu użytkownik rozpoczyna i kończy śpiewanie linii 1, zaczyna i kończy śpiewanie linii 2 itd.

Stworzyłem prosty algorytm, który działa, gdy w nagraniu jest bardzo mało szumu (np. Kiedy to się dzieje?), Ale rozpada się na kawałki w obecności najmniejszego szumu.

Czy ktoś może wskazać mi coś bardziej solidnego?

Mike Hogan
źródło
Moja odpowiedź może ci pomóc - dsp.stackexchange.com/a/1543/440
Dipan Mehta
W niektórych nagraniach głos jest jedynym instrumentem granym z tą samą amplitudą na obu kanałach. Możesz użyć tych informacji, aby wydobyć głos z nagrania stereo.
Jader Dias

Odpowiedzi:

4

Jeśli szum tła jest biały, można zmierzyć płaskość widmową i uznać ją za głos, gdy amplituda jest powyżej pewnego progu, a płaskość widma jest poniżej pewnego progu.

Zasadniczo wystarczy wziąć FFT fragmentu sygnału, a następnie podzielić średnią geometryczną wielkości widma przez średnią arytmetyczną.

Możesz także użyć filtra pasmowo-przepustowego, aby podkreślić tylko te obszary częstotliwości, w których zwykle siedzi ludzki głos (tak proste, jak ustawienie niepożądanych obszarów FFT na 0 przed pomiarem płaskości spektralnej)

endolit
źródło
Czy z twojego doświadczenia Endolith robi wielką różnicę, jeśli przed pomiarem płaskości spektralnej weźmiesz do kwadratu jasność VS tylko jasność?
Spacey
@Mohammad: Nie mam z tym żadnego doświadczenia. :) Zadałem poprzednie pytanie, ponieważ nie zrozumiałem specyfikacji i nadal nie jestem pewien, która droga jest poprawna. Nie sądzę jednak, by kwadratura miała jakikolwiek praktyczny wpływ. Jeśli uruchamiasz się po przekroczeniu progu, powinien on reagować identycznie, czy to kwadrat, czy nie (zakładając, że dostosujesz próg, aby dopasować), więc tylko wielkość jest obliczeniowo tańsza.
endolith
@Endolith, to trochę długa szansa: czy wiesz, jak wdrożyć to podejście w Matlabie? Chcę przetestować wszystkie podejścia wymienione tutaj w Matlabie (właściwie oktawę), aby zobaczyć, który jest najlepszy?
Mike Hogan
@MikeHogan: Nie, nie używałem Matlaba od dłuższego czasu. : / Również wymagałoby to prawdziwej pracy. :) Nie mam nic wcześniej napisanego. Podziel sygnał na małe fragmenty, wykonaj FFT każdego z nich, a dla każdego FFT podziel średnią geometryczną wielkości przez średnią arytmetyczną wielkości. wyższe liczby są głośne, niższe liczby są tonalne.
endolith
3

W przeszłości używałem strumienia spektralnego i wydaje się, że działa dobrze. Podstawową ideą jest stworzenie spektrogramu sygnału w pasmach, na których Ci zależy. Załóżmy, że twoja częstotliwość jest na osi y, a twój czas jest na osi x, podobnie .

Oznacza to, że twój spektrogram jest macierzą. Każda kolumna reprezentuje wartość bezwzględną FFT jednego ujęcia w czasie twojego sygnału, a każdy rząd przedstawia, jak zmienia się energia z jednego pasma w czasie.

Teraz po prostu weź różnicę kolumn. To znaczy, weź kolumnę i odejmij od siebie kolumnę przed nią i zrób to dla wszystkich kolumn. (Oczywiście pozostawienie samych kolumn początkowych). Następnie zsumuj wszystkie pasma. Oznacza to, że po prostu zsumuj wszystkie wiersze razem.

Będziesz skończyć z sygnałem 1-D, który koduje sygnał początkami . Dzięki temu dowiesz się, gdzie zaczyna się Twój głos.

EDYTOWAĆ:

Teraz, gdy wykryłeś początek, jeśli chcesz wykryć coś przeciwnego (to znaczy, gdy sygnał przechodzi z braku aktywności do działania), strumień spektralny faktycznie daje ci tę informację. Gdziekolwiek masz początek, będziesz miał dodatni szczyt, a gdziekolwiek masz „deset” (z powodu braku lepszego słowa), będziesz miał ujemny szczyt.

Po prostu wziąłbym pierwszy dodatni pik i ostatni ujemny pik, aby oznaczyć całkowity czas rozpoczęcia i zatrzymania mojego sygnału.

Spacey
źródło
Mohammad, co rozumiesz przez „wiersz”?
Mike Hogan
@MikeHogan Proszę zobaczyć moje zmiany, ponownie napisałem odpowiedź.
Spacey
Czy nie znalazłoby to jednak niczego? Zostałyby również wykryte uderzenia bębna lub inny impulsywny hałas. Nie rozróżnia dźwięków tonalnych od głośnych.
endolith
@endolith Podnosisz dobrą rację - jednak uważam, że może nadal działać. Moje rozumowanie jest takie, że w tym scenariuszu jesteś w stanie głos + muzyka lub po prostu w stanie muzycznym. Tak więc, obliczając strumień spektralny, tak naprawdę obliczasz różnicę między głosem + muzyką a samą muzyką. (Oczywiście musiałbym przeanalizować to znacznie więcej, ale tak o tym teraz myślę) :-P
Spacey
1
@endolith Właśnie przeczytałem ponownie, a OP mówi, że jest tylko głos (najwyraźniej jest to prosta aplikacja), więc w tym przypadku byłby to głos VS nic.
Spacey
2

Z mojego doświadczenia starałbym się spojrzeć na Współczynniki Mel-Frequency-Cepstrum (MFCC) . MFCC są dość łatwe do wdrożenia, jeśli masz dostęp do FFT i są dość często używane w przetwarzaniu głosu.

Dzięki MFCC powinieneś być w stanie odróżnić rzeczywiste dane głosowe od szumu.

endolit
źródło
@endolith, ten link jest całkowicie poza mną! Czy znasz jakieś implementacje typu open source, na które mogę spojrzeć, lub bardziej szczegółowy przepis na to, jak to działa?
Mike Hogan
2

Strumień widmowy ” (zwany również „różnicą widmową”) jest powszechną metodą „wykrywania początku”. Zasadniczo bierzesz sekwencyjne FFT sygnału i sumujesz wielkości różnic między segmentami FFT od jednej próbki do drugiej. „Początek” będzie ogólnie reprezentowany przez znaczny „skok” tej wartości.

Google „wykrywanie początku” dla innych pomysłów.

Daniel R. Hicks
źródło
2

Używanie samego strumienia spektralnego może powodować fałszywe alarmy dla niektórych dźwięków, a także wykrywać śpiewający głos.

Śpiew zwykle implikuje zawartość sygnału zawierającą wysokość dźwięku, więc można użyć detektora wysokości lub estymatora (cepstrum itp.). Możesz poczytać, sprawdzając ułamek energii, który jest wykrywany jako tonowany, w porównaniu do całkowitej energii sygnału i czy szacowana wysokość dźwięku mieści się w zakresie ludzkiego głosu. Zmniejszyłoby to współczynnik fałszywie dodatnich szumów nieszydzonych, a także dźwięków muzycznych poza normalnym zakresem głosu.

hotpaw2
źródło