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?
audio
signal-detection
Mike Hogan
źródło
źródło
Odpowiedzi:
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)
źródło
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.
źródło
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.
źródło
„ 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.
źródło
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.
źródło