filtr zakłóceń mowy ludzkiej

17

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:

  1. 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ć).

  2. 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!

Zetta Suro
źródło
Przypuszczam. Pozostawię to jednak otwarte, po prostu dlatego, że widziałem tutaj podobne pytania (filtry i przetwarzanie akustyczne), na które dobrze odpowiedziano.
Zetta Suro
Takich jak ten: stackoverflow.com/questions/6452926/...
Zetta Suro
Ogólna zasada: jeśli chcesz wiedzieć, jak zaimplementować dany algorytm DSP, np. W określonym języku lub na określonej platformie, to jest na temat SO. Jeśli chodzi o algorytmy / techniki DSP bez określonego kąta programowania, to prawie na pewno należy ono do DSP.SE (gdzie będzie również dążyć do uzyskania lepszej jakości odpowiedzi).
Paul R
Gotcha Czy migrowałeś tutaj? Jeśli tak, dziękuję. Nie mogłem wymyślić, jak go zmigrować, więc po prostu poprosiłem o to tutaj.
Zetta Suro
Nie ja - oflagowałem go i spytałem, czy moderator może go przenieść, więc chyba zrobił to jeden z TPTB (dzięki temu, kto to był!).
Paul R

Odpowiedzi:

8

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.

Paul R.
źródło
Dzięki! Mój przyjaciel faktycznie zasugerował kanał głosowy, ale podejrzewałem, że osłabiłoby to zbyt wiele energii w niektórych spółgłosek. Spróbuję od 50 Hz do 8 kHz i zobaczę, jak to działa!
Zetta Suro
2
Wybór tej odpowiedzi po prostu dlatego, że to „szybkie” rozwiązanie, którego szukałem. Reszta odpowiedzi będzie wymagała znacznie więcej badań, które z pewnością będę analizować, ponieważ będą pomocne na dłuższą metę, ale jest to proste rozwiązanie filtrujące, którego pierwotnie szukałem.
Zetta Suro,
5

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.

fenenety
źródło
1

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.

galamina
źródło
4
ICA wymaga tyle sygnałów wejściowych, ile jest źródeł do rozdzielenia. W odmawianiu mowy pozostaje nam tylko jeden sygnał, a zatem ICA nie pomaga.
pikenety