Jak przejść do wykrywania gwizdów, trzasków i innych dźwięków na wejściach audio na żywo?

9

Przeczytałem wiele pytań na temat SO i, szczerze mówiąc, każde z nich nie opisuje żadnej konkretnej drogi. Niektórzy mówią „zrób FFT”, a niektórzy mówią „przekroczenie zera” itd. Ale posunąłem się tylko do zrozumienia, że ​​cyfrowe wejście audio składa się z szeregu amplitud dla określonej częstotliwości i dobrze. Naprawdę nie wiem zbyt wiele poza tym.

Teraz znam twierdzenie Nyquista, częstotliwość, amplitudę, serie Fouriera itd., I to z 2-3 lat temu, kiedy robiłem to w moim programie uniwersyteckim w jakimś semestrze. Ale wtedy tak naprawdę nie uczono nas zbyt wiele na temat używania Fouriera w świecie rzeczywistym i nie zadałem sobie trudu, by wykopać więcej na ten temat poza nauką wystarczającą do zaliczenia przedmiotu. Ale teraz będę musiał użyć tego wszystkiego.

Oto migawka dźwięków, które próbuję wykryć:

unikalny wykres zatrzasków palców i włączania / wyłączania światła

Oczywiście dźwięki mają unikalne wykresy. Chcę tylko zrozumieć, jak wydobyć ich szczególne unikalne cechy dla ich unikalnych kolczastych linii na wykresie. Jak na przykład amplituda, częstotliwość itp. I na jak długo - choć to chyba banalne.

Chcę prosty krok po kroku, niejasną listę instrukcji - mogę wyszukiwać w terminologii, której nie rozumiem.

Może tak? -

  1. Uzyskaj wejściowe dane audio

  2. Spektrogram wykresu

  3. Pobierz wykres spektrogramu dźwięku, który chcesz wykryć w cichym otoczeniu

  4. Przestudiuj ten wykres - narysuj unikalne cechy tego dźwięku

  5. Wykonaj jakąś funkcję, która może wykryć te szczególne cechy w transmisji audio na żywo, wykorzystując właściwości dźwięku znalezionego w (4)

  6. Jeśli zostanie znalezione dopasowanie, cóż - zadanie zostało wykonane.

  7. Poleruj algorytm, aby wyeliminować fałszywe negatywy.

Jestem zdezorientowany - jak przejść około 3,4,5. W szczególności 3 i 4. Ponieważ tworzę oprogramowanie, w którym użytkownik mógłby nagrywać dowolny dźwięk jako gest wprowadzony później, chciałbym, aby mój system mógł nagrać dowolny dźwięk i dopasować go do dźwięku na żywo kanał, aby wykryć ten gest dźwiękowy. Jak powiedzmy, kaszel, pstrykanie palcami, gwizdanie lub klaskanie. Lub mówiąc spółgłoski -A lub B lub X lub Z. Prawie każdy dźwięk.

Myślałem o tym, aby użytkownik nagrał dźwięk, który chce przechowywać, jako gest w dość otoczeniu. A użytkownik wyda dźwięk tylko pomiędzy cichym wypełnieniem czasu ; 3 sekundy na początku i na końcu nagrania.

Powiedzmy, że przez pierwsze 3 sekundy mój system ustali, że prąd wejściowy to normalny cichy dźwięk tła. Nagła zmiana na wykresie oznaczałaby rozpoczęcie wprowadzania dźwięku. A kiedy to się skończy, nagrywanie będzie trwało kolejne 3 sekundy, a czas wypełniania będzie cichy . Zostanie to wykonane ręcznie przez użytkownika. Następnie automatycznie zapisuje charakterystykę tylko tej części, podczas której trwała nagła zmiana na wykresie - gdzieś pomiędzy czasami wypełnienia.

W ten sposób cechy tej części zostaną zapisane jako dane gestów tego dźwięku, które zostaną później wykorzystane do wykrycia tego konkretnego dźwięku w transmisji audio na żywo.

Problem w tym, że myślę o tym wszystkim w prostym języku angielskim. Muszę myśleć z matematyki i fizyki, aby móc efektywnie zaimplementować to w moim kodzie. Jestem tak cholernie nieświadomy tego, co napisać i gdzie napisać to w moim kodzie - nawet mając do dyspozycji tak wiele bibliotek i pytań dotyczących SO.

I przepraszam, jeśli to było długie.

bad_keypoints
źródło
1
Z ciekawości, czy ten spektrogram jest wykonany na telefonie lub tablecie? jeśli tak, czy możesz podać nazwę aplikacji. Wygląda naprawdę fajnie. Jeśli chodzi o twoje pytanie, myślę, że twoja aplikacja jest podobna do tematu / zadania polegającego na rozpoznawaniu pojedynczych słów. Prawdopodobnie możesz uzyskać wiele pomysłów i inspiracji z Google. Trudność polega na tym, aby nie rozpoznać gestów w ograniczonym, względnie małym zestawie gestów, trudność polega na odfiltrowaniu rzeczy, które nie są gestami.
niaren
To jest aplikacja: play.google.com/store/apps/… I dziękuję za opinie. Ale chcę, żebyś powiedział mi, jak wykrywać nie słowa, ale dźwięki (przynajmniej na razie), takie jak gwizdanie, pop, klaszczenie itp. Pracuję w Pythonie.
bad_keypoints
1
Niestety tego rodzaju rzeczy są nadal obszarem badań. Nie znam nikogo, kto rozwiązuje ten konkretny problem.
Bjorn Roche,

Odpowiedzi:

2

Chociaż zgadzam się z jednym z komentarzy, że stosowanie technik rozpoznawania mowy może być dobrym początkiem, dźwięki te są różne i nie jestem świadomy, że ktoś przeprowadził jakiekolwiek badania w celu ich kategoryzacji (artykuł przytoczony przez Nathana wydaje się jedynie rozróżniać mowę i hałas), więc jeśli ktoś nie przedstawi czegoś, co temu zaprzecza, będziesz musiał wymyślić własną technikę, a to zajmie dużo nauki i dużo pracy. Najlepsze, co mogę zrobić, to zacząć.

Po pierwsze, nie oczekuj, że ktokolwiek będzie w stanie wyprodukować magiczną formułę. Nie ma równania, aby przejść od dźwięku do tego, czym jest dźwięk. Ludzie i komputery muszą się uczyć, wprowadzając dane, aby odgadnąć, jakie są dźwięki. Powodem, dla którego ludzie mówią w swoich odpowiedziach „użyj FFT” lub „użyj przejścia przez zero” jest to, że są to niektóre z podstawowych elementów składowych DSP używanych w rozpoznawaniu mowy i powiązanych algorytmach. Ale FFT i zerowa szybkość przekraczania są zwykle tylko pierwszymi krokami w tworzeniu zestawu parametrów opisujących dźwięk. Parametry te są następnie analizowane statystycznie (nie poprzez jakąś funkcję magiczną), aby określić, do której kategorii najprawdopodobniej należą. Zauważ, że powiedziałem „najprawdopodobniej”: nawet najlepsze wykrywanie mowy (i ludzki mózg!

Oto niektóre parametry, których możesz szukać:

  • wskaźnik przekroczenia zera
  • częstotliwość środkowa
  • koperta (jest to właściwie zestaw parametrów, w tym np. czas ataku)
  • obwiednia widmowa
  • równowaga parzystych / nieparzystych harmonicznych
  • głośność
  • skok podstawowy

Gdy będziesz mieć zestaw parametrów, które Twoim zdaniem pozwolą ci rozróżnić swoje dźwięki, będziesz musiał użyć metody statystycznej, aby je skategoryzować. Ukryty model Markowa jest często używany w mowie. Możesz także zajrzeć do regresji logistycznej, K-średnich, i jestem pewien, że istnieją inne możliwości, ale myślę, że HMM jest wypróbowany i prawdziwy.

Bjorn Roche
źródło
Twoja odpowiedź jest dobra, ale w zasadzie proszę o dopasowanie własnych dźwięków użytkownika do dźwięków, które wydaje później za pomocą mojego oprogramowania. Na przykład podobieństwa. Powiedzmy, że użytkownik wydaje różne typy dźwięków A, B i C. I te cechy dźwięków są przechowywane odpowiednio jako C_A, C_B i C_C.
bad_keypoints
Technika jest nadal taka sama: 1. dowiedzieć się, jakie parametry zamierzasz zmierzyć, 2. zmierzyć je, 3. użyć statystyk, aby dowiedzieć się, co wyróżnia każdy dźwięk, 4. użyć tych danych do kategoryzacji.
Bjorn Roche,
więc w zasadzie tak myślałem. ale myślę, że będę musiał sprawdzić, które parametry z dobrej długiej listy, którą dostarczyłeś, musiałbym zaznaczyć wyróżniającymi się dźwiękami.
bad_keypoints
1
Szczerze mówiąc, jestem bardzo pesymistyczny, jeśli chodzi o to, że potrafię rozróżnić takie rzeczy, jak trzask palca i włącznik światła w różnych środowiskach bez dużej ilości przykładowych danych i być może większej liczby parametrów niż podałem, ale mam nadzieję, że się mylę. Zgłoś swoje wyniki, nawet jeśli zajmuje to trochę czasu.
Bjorn Roche,
Ponadto niektórzy ludzie z listy mailingowej music-dsp ( music.columbia.edu/cmc/music-dsp ) mogą mieć inne sugestie.
Bjorn Roche,
0

Użyłem tego artykułu na końcu opartym na entropii, wskazując, kiedy próbowałem zignorować tego rodzaju dźwięki w rozmowach telefonicznych, używane do komputerowego rozpoznawania mowy, jeśli dźwięki, które próbujesz uchwycić, to mowa, to entropia może działać naprawdę dobrze, w przypadku muzyki może nie być użyteczne.

Dzień Nathana
źródło
0

Myślę, że rekomendacje Bjorna są bardzo dobre, ale chcę podać dodatkowe informacje. Z twojego opisu brzmi to jak problem z identyfikacją barwy. Istnieją pewne badania w tym obszarze w kontekście muzyki komputerowej (identyfikacja różnych instrumentów jest przydatna, a można powiedzieć, że różnica między snapem a klaśnięciem wynika z barwy dźwięku). William Brentprzeprowadził badania w tej dziedzinie (poszukaj timbreID na swojej stronie) i stworzył oprogramowanie do wykorzystania w Pure Data. W każdej sytuacji, w której szukasz określonych zdarzeń, dobrym pomysłem byłoby wykonanie automatycznej segmentacji przez wykrycie początku. Ponieważ już bierzesz STFT, określenie początku nie wymagałoby zbyt wiele pracy dodatkowej (spójrz na wykrywanie początku strumienia spektralnego). Zarys systemu może być taki:

Trening

  • Określ odpowiednie cechy (np. Szybkość przekraczania zera, centroid widmowy, MFCC)
  • Wykryj początek
  • Oblicz te funkcje na wejściowym dźwięku (nagrania gestów)
  • Prowadź bazę danych obliczeń funkcji. Będziesz musiał ustalić, czy jest to sytuacja szkoleniowa nadzorowana, czy bez nadzoru. Na przykład, czy użytkownicy określają wcześniej, że snap jest „dźwiękiem 1”, a klaśnięcie „dźwiękiem 2”, czy też system próbuje je klastrować po treningu.

Klasyfikacja

  • Wykryj wystąpienie w czasie rzeczywistym i oblicz funkcje przychodzącego dźwięku
  • Użyj metryki odległości (odległość euklidesowa lub inna odległość Lp), aby dokonać klasyfikacji najbliższego sąsiada lub K-najbliższego sąsiada, aby określić „najbliższy” dźwięk z bazy danych

Ten artykuł na temat perkusyjnej identyfikacji barwy może się przydać. Przedstawia definicje potencjalnych funkcji do obliczenia na podstawie przychodzącego dźwięku oraz metodę klasyfikacji autora. Będzie to działać dość dobrze w przypadku dźwięków perkusyjnych, ale może nie działać tak dobrze w przypadku mowy (wielu sylab), w takim przypadku bardziej odpowiednia byłaby metoda HMM. Podobnie dokładność wykrywania początku będzie się różnić w zależności od rodzaju poszukiwanych dźwięków.

Jeśli szczególnie martwisz się zatrzaskami i włącznikami światła, poświęć trochę czasu na zastanowienie się, które funkcje mogą dokładnie rozróżnić te dwa dźwięki.

greatscott
źródło
Wykryłbym początek, wykrywając nagłe zmiany w przychodzących danych audio. To powinno działać. Wykrywanie początku i zakończenia gestów, które mają zostać zapisane.
bad_keypoints
Tak, to powinno działać. Jedynym powodem, dla którego zasugerowałem strumień spektralny, jest to, że i tak będziesz brać STFT. Jeśli spodziewasz się dość cichego środowiska, podstawowe próg amplitudy powinien działać wystarczająco dobrze.
greatscott,