Najprostszy sposób na wykrycie, gdzie zaczynają się i kończą koperty audio


43

Poniżej znajduje się sygnał reprezentujący nagranie osoby mówiącej. Na tej podstawie chciałbym stworzyć serię mniejszych sygnałów audio. Chodzi o to, aby wykryć, kiedy „ważny” dźwięk zaczyna się i kończy, i użyć ich do markerów do stworzenia nowego fragmentu dźwięku. Innymi słowy, chciałbym użyć ciszy jako wskaźników, kiedy „fragment” audio zaczął się lub zatrzymał i na tej podstawie tworzyć nowe bufory audio.

Na przykład, jeśli ktoś nagrywa siebie mówiącego

Hi [some silence] My name is Bob [some silence] How are you?

chciałbym z tego zrobić trzy klipy audio. Ten, który mówi Hi, ten, który mówi My name is Bobi ten, który mówi How are you?.

Moim początkowym pomysłem jest ciągłe sprawdzanie bufora audio, gdzie są obszary o niskiej amplitudzie. Może mógłbym to zrobić, pobierając pierwsze dziesięć próbek, uśredniając wartości, a jeśli wynik jest niski, oznacz to jako ciche. Przejdę do bufora, sprawdzając kolejne dziesięć próbek. Zwiększając w ten sposób mogłem wykryć, gdzie koperty zaczynają się i kończą.

Jeśli ktoś ma jakieś porady na temat dobrego, ale prostego sposobu na zrobienie tego, byłoby świetnie. Dla moich celów rozwiązanie może być dość szczątkowe.

Nie jestem profesjonalistą w DSP, ale rozumiem kilka podstawowych pojęć. Robiłbym to również programowo, więc najlepiej byłoby mówić o algorytmach i próbkach cyfrowych.

Dzięki za wszelką pomoc!

wprowadź opis zdjęcia tutaj


EDYCJA 1

Jak dotąd świetne odpowiedzi! Chciałem tylko wyjaśnić, że nie dotyczy to audio na żywo i sam będę pisał algorytmy w C lub Objective-C, więc wszelkie rozwiązania korzystające z bibliotek nie są tak naprawdę opcją.


1
Wygląda na to, że próbujesz to rozerwać, wykorzystując okresy ciszy jako punkty przerwania. Dlaczego po prostu nie zastosować progowania mocy do określenia „ciszy” i mieć czas progowy, aby ustalić, czy jest on wystarczająco długi, aby stanowić przerwę?
Jim Clay

@JimClay Tak, właśnie to staram się zrobić. Nigdy nie słyszałem o progach mocy, ale brzmi to jak coś, czego mógłbym użyć. Czy to skomplikowane? Czy mógłbyś to trochę rozwinąć?
Eric Brotto

@EricBrotto Być może powinieneś powiedzieć nam trochę o tym, jakie możliwości masz w swoich bibliotekach. To pozwoli nam lepiej wymasować rzeczywistą metodologię.
Spacey

ta metoda wykrywania ciszy jest lepsza? jaki powinien być poziom termostatu inny niż 0,05 x = wavread ('s1.wav'); i = 1; podczas gdy abs (x (i)) <0,05% Wykrywanie ciszy i = i + 1; koniec x (1: i) = []; x (6000: 10000) = 0;
zeee

Odpowiedzi:


26

Jest to klasyczny problem wykrywania mowy . Pierwszą rzeczą do zrobienia byłaby koncepcja Google. Jest szeroko stosowany w komunikacji cyfrowej, przeprowadzono wiele badań na ten temat i są tam dobre artykuły.

Zasadniczo, im więcej hałasu w tle musisz sobie poradzić, tym bardziej skomplikowana musi być Twoja metoda wykrywania mowy. Jeśli używasz nagrań wykonanych w cichym pokoju, możesz to zrobić bardzo łatwo (więcej później). Jeśli podczas rozmowy ktoś słyszy różnego rodzaju hałas (przejeżdżające ciężarówki, szczekające psy, roztrzaskane talerze, atakujący kosmici), będziesz musiał użyć czegoś sprytniejszego.

Patrząc na dołączony przebieg, szum jest minimalny, więc sugeruję następujące:

  1. Wyodrębnij obwiednię sygnału
  2. Wybierz dobry próg
  3. Wykryj miejsca, w których wielkość obwiedni przekracza próg

Co to wszystko znaczy? Obwiedni sygnału jest krzywą, która opisuje jej wielkości w czasie, niezależnie od sposobu jej treść sprawia, że częstotliwość oscylacji (patrz zdjęcie poniżej).

wprowadź opis zdjęcia tutaj

{1,45,6,2,43,2}{1,45,6,2,43,2} można znaleźć eksperymentalnie i może zależeć od kilku czynników, takich jak częstotliwość próbkowania.

Na obrazie widać, że nie ma dużo szumów, obwiednia sygnału zawsze będzie przekraczać pewien próg (poziom głośności) i można uznać te regiony za regiony wykrywane przez mowę .


3
Zaimplementowałem to jako jedną z wtyczek w good'ol winamp. To, co opisujesz, jest dobre, ale niewystarczające. Zwykle są dźwięczne (samogłoski) i bezdźwięczne (spółgłoski). Gdyby był tylko dźwięczny dźwięk, to, co opisujesz, zadziałałoby - ale dźwięk bezdźwięczny ma bardzo niską energię i nie można go do końca odróżnić od ogólnego hałasu. A warunki bez hałasu są również bardzo rzadkie, nawet w studiach.
Dipan Mehta

jak to osiągnąć w python?
kRazzy R

26

To, co naprawdę chcesz zrobić, nazywa się zasadniczo wykrywaniem aktywności głosowej lub wykrywaniem mowy.

Zasadniczo każdy czysty sygnał mowy (który nie zawiera muzyki) składa się z trzech części.

  1. Dźwięczny dźwięk - który jest zasadniczo spowodowany przez Samogłoski
  2. Bezdźwięczny dźwięk - który zawiera spółgłosek.

Charakterystyczne dla ludzkiego dźwięku jest to, że podczas gdy w dźwięku dźwiękowym wykorzystuje się dużo energii, prawdziwa informacja jest zawarta w spółgłosek. Ponadto dźwięk dźwięczny ma zwykle niższą częstotliwość, ponieważ dźwięki bezdźwięczne to wyższe częstotliwości. [Mówiąc ściślej, wszystkie dźwięczne dźwięki rezonują mniej więcej ze stałą częstotliwością dla danej osoby, która jest jego wysokością].

Teraz, jak w każdym systemie, występuje hałas. Dźwięczny dźwięk jest zwykle wystarczająco silny, aby można go było odróżnić jako widoczny. Po zastosowaniu filtrowania o niższej częstotliwości możliwe jest zebranie dobrej wielkości dźwięcznych dźwięków, jednak dźwięk bezdźwięczny (z wszystkimi bogatymi informacjami) zostanie utracony.

Jeśli chodzi o pytanie, jak to rozwiązać:

Sztuka polega na tym, że dźwięk bezdźwięczny wciąż pochodzi ze źródła rezonującego; i z natury ograniczone na pewnej częstotliwości. Gdzie hałas jest raczej jednolity. Tak więc prostą miarą, która rozróżnia wszystkie trzy, jest „moc lokalna” lub alternatywnie, ale równoważne jest przyjęcie okienkowej autokorelacji.

Jeśli weźmiesz na przykład 100 próbek - i automatycznie skoreluje się, jeśli zawiera tylko szum, wyniki będą prawie zerowe (jest to właściwość białego szumu), gdzie jak w przypadku sygnału mowy, wielkość ta będzie obserwowalna, ponieważ sygnał wciąż ma lepszą strukturę. To działało dla mnie w przeszłości.

VAD jest aktywnym obszarem badań - ponieważ prawie cała komunikacja przez telefon komórkowy chce wykryć część niemową i usunąć ją z kodowania. Gdyby jednak usunęli mowę bezdźwięczną, uczyniłoby to telefon bezużytecznym.

Standard G.729 oblicza VAD w oparciu o takie cechy, jak: liniowe częstotliwości widmowe, energia pełnopasmowa, energia dolnopasmowa (<1 kHz) i szybkość przecięcia zera.

Standard GSM działa w następujący sposób: Opcja 1 oblicza SNR w dziewięciu pasmach i stosuje próg dla tych wartości. Opcja 2 oblicza różne parametry: moc kanału, mierniki głosu i moc szumów. Następnie proguje metryki głosu przy użyciu progu, który zmienia się w zależności od szacowanego SNR. (z wikipedii)

Dla bardziej zaawansowanych technik wymieniam kilka odniesień na ten temat.

  1. Najczęściej odwiedzane referencje: Jongseo Sohn; Nam Soo Kim; Wonyong Sung; „Wykrywanie aktywności głosu w oparciu o model statystyczny” Letters Processing Letters, IEEE, styczeń 1999, tom: 6 Wydanie: 1 pp: 1-3

  2. Najważniejsze dla Ciebie: Mark Marzinzik i Birger Kollmeier „Wykrywanie pauzy mowy w celu oszacowania spektrum hałasu poprzez śledzenie dynamiki kopert mocy” TRANSAKCJE IEEE NA PRZETWARZANIU MOWY I AUDIO, CZ. 10, NIE. 2, LUTY 2002 s. 109

  3. Ramírez, J .; JM Górriz, JC Segura (2007). „Wykrywanie aktywności głosowej. Podstawy i niezawodność systemu rozpoznawania mowy”. W M. Grimm i K. Kroschel. Solidne rozpoznawanie i rozumienie mowy. s. 1–22. ISBN 978-3-902613-08-0.

  4. Wprowadzenie: Jonathan Kola, Carol Espy-Wilson i Tarun Pruthi „Wykrywanie aktywności głosowej”


jak to osiągnąć w python?
kRazzy R

9

Całkowicie poparłbym Jima Claya w jego podejściu, ale nieznacznie zmieniłem smak za pomocą koperty:

Wiemy, że mowa występuje głównie w okolicach 1-2 kHz. Próbkowanie danych może wynosić 44 kHz (zależy to od urządzenia nagrywającego). Tak więc najpierw chciałbym zrobić średnią ruchomą kwadratowego sygnału w czasie rzeczywistym w 10 punktach, aby uzyskać obwiednię mocy sygnału. Spowoduje to opóźnienie w wykrywaniu, więc chcesz utrzymać to na niskim poziomie.

Następnie dodam fazę kalibracji do twojego systemu: poproś użytkownika, aby milczał, naciśnij przycisk i rejestruj hałas tła przez powiedzmy 10 sekund. Weź średnią lub średnią amplitudę obwiedni, pomnóż przez 2, aby mieć bezpieczeństwo, a to da ci próg, o którym mówił Jim automatycznie.

Jeśli nie jest to nagrywanie w czasie rzeczywistym, przydatne może okazać się zastosowanie średniej ruchomej 0-fazowej, aby zmniejszyć irytację spowodowaną opóźnieniem. Powiedz nam, czy to działa tak, jak jest.


9

Eric

Jeśli naprawdę szukasz czegoś szybkiego i brudnego, pierwszą rzeczą, którą musisz zdobyć, jest koperta, a ja zrobiłbym to po prostu (w MATLAB) przez:

 envelope = abs(hilbert(yourSignal));

W tym momencie po prostu przekroczyłbym próg, a „głos istnieje”, jeśli przekroczysz określony próg.

Jest to bardzo proste rozwiązanie, ale może się przydać.


1
+1. Być może mógłbyś rozwinąć metodę dotyczącą tego wiersza kodu? Jestem pewien, że OP nie jest zaznajomiony z wydobywaniem kopert za pomocą transformacji Hilberta.
Phonon

@Mohammad Thanks! Ale proszę zobaczyć moją EDYCJĘ 1. Zdecydowanie chciałbym szybko i obrzydliwie, ale muszę też samemu wykonać algorytmy :)
Eric Brotto

@EricBrotto Ach, dobrze, mogę powiedzieć, jak zaimplementować transformator Hilberta, ale zakładam, że masz możliwość wykonywania FFT w swoich bibliotekach C / Obj-C? Jeśli nie, to będzie problem ... :-)
Spacey

jak to osiągnąć w python?
kRazzy R

Szanowni Państwo, czy mógłbyś mi wskazać, jak zaimplementować tego hilberta w Pythonie?
kRazzy R

6

Zakładam, że masz do czynienia z prawdziwymi, nieskomplikowanymi sygnałami - jeśli tak nie jest, daj mi znać, a mogę zmienić odpowiedź.

Moc jest definiowana jako kwadrat sygnału (tj. Próbki sygnału pomnożone przez siebie). Możesz porównać moc z pewnym progiem, aby ustalić, czy mowa jest obecna, czy nie. Prawdopodobnie będziesz musiał wykonać kilka pomiarów na swoich nagraniach, aby empirycznie znaleźć dobry próg.

Jeśli twoje nagrania są „czyste” (tzn. Nie ma dużo hałasu), prawdopodobnie wybrałbym tak proste, jak to możliwe, poprzez porównanie mocy chwilowej (tj. Pojedynczej próbki) z progiem. Oznacza to, że nawet nie musisz go wyrównywać, jeśli nie chcesz, potrzebujesz jedynie wartości bezwzględnej i porównaj ją z pierwiastkiem kwadratowym z progu mocy, który można wstępnie obliczyć. Po wykryciu mowy złap ją i nagraj przed nią, aby mieć pewność, że usłyszysz całą mowę (może 1/10 sekundy?). Kontynuuj, dopóki nie znajdziesz przedłużonego okresu braku próbek przekraczających próg. Ponownie, długość tego okresu musiałaby zostać ustalona empirycznie.

Wypłukać i powtórzyć.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.