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 Bob
i 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!
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ą.
źródło
Odpowiedzi:
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:
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).
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ę .
źródło
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.
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.
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
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
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.
Wprowadzenie: Jonathan Kola, Carol Espy-Wilson i Tarun Pruthi „Wykrywanie aktywności głosowej”
źródło
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.
źródło
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:
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ć.
źródło
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ć.
źródło
Napisałem klasę detektora aktywności w Javie. Jest to część mojej kolekcji Java DSP typu open source . Możesz użyć programu testowego WavSplitter.java, aby sprawdzić to za pomocą pliku WAV jako danych wejściowych.
źródło