Skorzystaj sox
z SoX analizować krótką próbkę dźwięku:
sox -t .wav "|arecord -d 2" -n stat
Gdy -t .wav
określamy, przetwarzamy typ wav, "|arecord -d 2"
uruchamiamy arecord
program przez dwie sekundy, -n
generujemy dane wyjściowe do pliku zerowego, a wraz z tym stat
określamy, że chcemy statystyki.
Wynik tego polecenia, w moim systemie z pewną mową w tle, jest następujący:
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read: 16000
Length (seconds): 2.000000
Scaled by: 2147483647.0
Maximum amplitude: 0.312500
Minimum amplitude: -0.421875
Midline amplitude: -0.054688
Mean norm: 0.046831
Mean amplitude: -0.000044
RMS amplitude: 0.068383
Maximum delta: 0.414063
Minimum delta: 0.000000
Mean delta: 0.021912
RMS delta: 0.036752
Rough frequency: 684
Volume adjustment: 2.370
Maksymalną amplitudę można następnie uzyskać:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
W grep
przypadku linii, którą chcemy, użyj, tr
aby odciąć znaki spacji, a następnie cut
przez :
znak i weź drugą część, która daje nam 0.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:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
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.