Moje dzieci (4 i 5) dużo krzyczą podczas grania w gry na komputerze. Znalazłem na to skuteczne lekarstwo. Kiedy słyszę głośne dźwięki, ssh do komputera gry i wykonuję:
chvt 3; sleep 15; chvt 7
Spowoduje to wyłączenie ekranu na 15 sekund w systemie Linux. Powiedziałem im, że komputer nie lubi głośnych dźwięków. Całkowicie w to wierzą i błagają komputer o wybaczenie. Stały się znacznie cichsze, ale nie do poziomu, w którym byłbym szczęśliwy, dlatego muszę kontynuować ten proces edukacyjny. Jednak nie zawsze jestem w pobliżu, aby to zrobić ręcznie.
Czy można to zautomatyzować? Mikrofon jest przymocowany do pudełka. Jeśli poziom głośności przekroczy pewien próg, chcę uruchomić polecenie.
linux
audio
shell
parental-controls
Leonid Wołyński
źródło
źródło
Odpowiedzi:
Skorzystaj
sox
z SoX analizować krótką próbkę dźwięku:Gdy
-t .wav
określamy, przetwarzamy typ wav,"|arecord -d 2"
uruchamiamyarecord
program przez dwie sekundy,-n
generujemy dane wyjściowe do pliku zerowego, a wraz z tymstat
określamy, że chcemy statystyki.Wynik tego polecenia, w moim systemie z pewną mową w tle, jest następujący:
Maksymalną amplitudę można następnie uzyskać:
W
grep
przypadku linii, którą chcemy, użyj,tr
aby odciąć znaki spacji, a następniecut
przez:
znak i weź drugą część, która daje nam0.068383
w tym przykładzie. Jak sugerują komentarze, RMS jest lepszą miarą energii niż maksymalna amplituda.Możesz wreszcie użyć
bc
wyniku, aby porównać wartości zmiennoprzecinkowe z wiersza polecenia:Jeśli zbudujesz pętlę (patrz przykłady Bash ), która wywołuje tryb uśpienia na 1 minutę, testuje wolumin, a następnie powtarza, możesz pozostawić go działający w tle. Ostatnim krokiem jest dodanie go do skryptów inicjujących lub plików serwisowych (w zależności od systemu operacyjnego / dystrybucji), dzięki czemu nie trzeba nawet uruchamiać go ręcznie.
źródło
sample[n]>sample[n-1]&&sample[n]>sample[n+1]
wykorzystałem go jako podstawowy mechanizm pomiaru energii piosenki i działa całkiem dobrze. Po prostu wyszukaj magiczną liczbę, przy której jesteś zadowolony z poziomu głośności.Oto, jak można to zrobić za pomocą Pure Data :
Metro to metronom, a „metro 100” nieustannie uderza w każde 100 ms.
Dźwięk pochodzi z adc ~, głośność jest obliczana przez env ~. „pd dsp 0” wyłącza DSP po uderzeniu, „pd dsp 1” włącza go. „shell” wykonuje przekazane polecenie w powłoce, używam Linux xrandr API do ustawienia jasności na X, musisz to dostosować do Waylanda.
Jak widać, okres karencji i blokowanie zajmuje znacznie więcej miejsca niż kod dźwiękowy.
Stworzenie rozwiązania z buforami pierścieniowymi i / lub średnimi ruchomymi powinno być znacznie łatwiejsze niż zrobienie tego
sox
. Nie sądzę więc, aby używanie do tego Pure Data było złym pomysłem. Ale sam ekran wygasa, a blokowanie nie pasuje do paradygmatu przepływu danych.Plik PD znajduje się na stronie gist.github.com: ysangkok - kidsyell.pd .
źródło
Sprawdź „Jak wykryć obecność dźwięku / dźwięku” Thomer M. Gil .
Zasadniczo rejestruje dźwięk co 5 sekund, a następnie sprawdza amplitudę dźwięku za pomocą
sox
i decyduje, czy uruchomić skrypt, czy nie. Myślę, że możesz łatwo dostosowaćruby
skrypt dla swoich dzieci! Możesz też zhakować skrypt Pythona (używając PyAudio), który on również dostarczył.źródło
Możesz uzyskać informacje z mikrofonu, wykonując coś takiego:
Być może będziesz musiał trochę pograć z ustawieniami, takimi jak:
Odtąd analizowanie wyników jest proste.
źródło
To jedno z ciekawszych pytań, jakie widziałem. Chciałbym podziękować tucuxi za tak dobrą odpowiedź; które ustawiłem jako skrypt bash
źródło
Moje 2 centy za rozwiązanie C lub C ++: może nie jest to najbardziej efektywne podejście, ale w systemie Linux możesz użyć interfejsu API ALSA (wbudowana biblioteka obsługi dźwięku w systemie Linux) i zastosować technikę numeryczną (na przykład obliczenie średniego dźwięku poziom co sekundę), aby uzyskać poziom hałasu.
Następnie możesz to sprawdzić w nieskończonej pętli, a jeśli jest większy niż wstępnie ustawiony próg, możesz użyć biblioteki X11, aby wyłączyć ekran na kilka sekund, lub alternatywnie (mniej elegancko, ale działa) wywołać
chvt
polecenie za pomocąsystem("chvt 3; sleep 15; chvt 7 ");
.źródło
chvt
. ArchWiki ma ładne przykłady.