Czy ktoś zna filtr tłumiący brak mowy? Piszę oprogramowanie do rozpoznawania mowy i chciałbym odfiltrować wszystko oprócz ludzkiej mowy. Obejmuje to hałas w tle, hałas wytwarzany przez kiepski mikrofon, a nawet muzykę w tle. Zaimplementowałem już filtr pierwszego rzędu, który kompensuje zsuwanie się widma mocy o 6 dB, ale nadal słyszę hałas (choć mowa brzmi znacznie wyraźniej). Myślałem o użyciu filtru dolnoprzepustowego, ale nie jestem w stanie tego zrobić z dwóch powodów:
Nie wiem, czy dolnoprzepustowy filtr wstępny zakłóci resztę przetwarzania mowy. Chociaż ludzkie ucho wykrywa tylko dźwięki o wartości niższej niż 20 kHz, nie chcę ryzykować eliminacji harmonicznych wyższego rzędu, które mogą być konieczne do przetworzenia mowy (choć nie wiem, czy tak jest, czy nie. Nie chcę ryzykować).
Rozumiem, że wzbudzenie niektórych spółgłosek (takich jak f, h i s) to prawie całkowicie biały szum. Nie chcę wdrożyć filtra szumu, który wyeliminuje dobry szum, że tak powiem.
Idealnie, chciałbym, aby pozostała mi tylko mowa osoby mówiącej do mikrofonu. Jeśli masz jakieś pomysły lub czegoś brakuje, daj mi znać. Bardzo mile widziane!
źródło
Odpowiedzi:
Kanał komunikacji głosowej stosowany w telefonii zazwyczaj ma charakterystykę częstotliwościową od 300 Hz do 3 kHz. Mimo że odrzuca to dużo energii w normalnej mowie, zrozumiałość jest wciąż całkiem dobra - głównym problemem wydaje się być to, że niektóre spółgłoski wybuchowe , np. „P” i „t”, mogą być nieco trudne do rozróżnienia bez składników o wyższej częstotliwości. .
Prawdopodobnie więc szukasz „słodkiego miejsca” pomiędzy wykorzystaniem pełnego pasma 20 Hz - 20 kHz zwykle występującego w audio konsumenckim a najbardziej agresywnym filtrowaniem używanym do komunikacji głosowej (patrz wyżej). Sugerowałbym zacząć od filtra pasmowego od powiedzmy 50 Hz do 8 kHz. Prawdopodobnie poprawi SNR o co najwyżej kilka dB, ale może to pomóc, szczególnie jeśli masz dużo szumu tła o wysokiej częstotliwości.
źródło
Pomoże w tym filtr pasmowy pasujący do przepustowości mowy.
Jeśli masz kilka mikrofonów (jak ma to miejsce obecnie w przypadku telefonów komórkowych), istnieje mnóstwo metod podobnych do ICA, które mogą z nich skorzystać - ale twoje pytanie podpowiada mi, że masz tylko jedno wejście.
To, co chcesz zrobić, to „separacja jednego mikrofonu od źródła” (nazwa zaczerpnięta z przełomowego papieru Roweisa), zwana również „pojedynczym czujnikiem”. Ostrzeżenie: jest to dalekie od rozwiązania problemu, a wszystkie badania w tej dziedzinie są bardzo niedawne, a żaden algorytm lub podejście nie jest „wyraźnym zwycięzcą” (w przeciwieństwie do modeli mieszania gaussowskiego + FST do rozpoznawania mowy).
Dobrym rozwiązaniem jest filtrowanie Wienera. Patrz Benaroya i in. „Separacja źródła pojedynczego czujnika na podstawie filtrowania Wienera i wielu okien STFT” (Przeczytaj sekcje 1 i 2, nie przejmuj się rozwiązaniem wielorozdzielczym, chyba że naprawdę go potrzebujesz). Krótko mówiąc, obliczasz STFT swojego sygnału i dla każdej ramki STFT próbujesz uzyskać oszacowania widma głosu i widma szumu, i używasz filtrowania Wienera, aby odzyskać najlepsze oszacowanie widma głosu z tego (to jest podobny do „miękkiego maskowania” widma).
Twój problem jest teraz następujący: biorąc pod uwagę ramkę STFT, oszacuj składową mowy i szumu z niej. Prostsze podejście opisane w artykule przez Benaroya polega na kwantyzacji wektorowej - poświęć kilka godzin na przemówienie wielu mówcom, oblicz STFT, uruchom na nim LBG, aby znaleźć słownik zawierający 512 lub 1024 typowych ramek mowy; zrób to samo dla hałasu. Teraz, biorąc pod uwagę ramkę sygnału wejściowego, rzutuj go nieujemnie (w artykule opisano procedurę multiplikatywnej aktualizacji gradientu) na podstawy mowy i szumu, a otrzymasz oszacowania mowy i szumu. Jeśli nie chcesz zajmować się projekcją nieujemną, po prostu użyj najbliższego sąsiada. To naprawdę najprostsza rzecz, która mogłaby ewentualnie działać w dziale „separacji źródła z jednym czujnikiem”.
Należy zauważyć, że system rozpoznawania mowy może rzeczywiście zapewnić pewne dane wejściowe dla systemu separacji. Wykonaj pierwsze przejście dekodowania za pomocą systemu rozpoznawania mowy. Dla każdej klatki pobierz średni wektor MFCC od gaussa, który uzyskał najlepszy wynik. Odwróć to z powrotem do widma. Bum, masz maskę podającą najbardziej prawdopodobną lokalizację spektralną bitów przypominających mowę i możesz jej użyć jako danych wejściowych do filtrowania Wienera. Brzmi to trochę jak machanie ręką, ale geistą jest to, że aby oddzielić źródło, potrzebujesz do tego dobrego modelu, a system rozpoznawania mowy cofnięty to piekielnie dobry model generatywny dla sygnałów mowy.
źródło
Prawdopodobnie powinieneś rozważyć wykonanie niezależnej analizy składników (ICA), ponieważ twój problem jest bardzo podobny do problemu „koktajlu”, który często jest używany do opisywania ICA. Krótko mówiąc, ICA znajduje niezależne od siebie komponenty sygnału. Zakłada się, że inne szumy w otoczeniu (zmywarka, biały szum, szum wentylatora) będą niezależne od źródła sygnału głosu i można je oddzielić.
ICA jest podobna do PCA (analiza składowej podstawowej), ale zamiast maksymalizować wariancję na osiach głównych, maksymalizuje niezależność. Istnieje wiele implementacji ICA, które należy podłączyć do dowolnego używanego środowiska kodowania.
źródło