Comments:"linux - Automate running a program when input volume loudness crosses a threshold - Super User"
URL:http://superuser.com/questions/545329/my-kids-yell-too-much
Use sox
from SoX to analyze a short audio sample:
sox -t .wav "|arecord -d 2" -n stat
With -t .wav
we specify we process the wav type, "|arecord -d 2"
executes the arecord
program for two seconds, -n
outputs to the null file and with stat
we specify we want statistics.
The output of this command, on my system with some background speech, is:
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
The maximum amplitude can then be extracted via:
grep "Maximum amplitude" | tr -d ' ' | cut -d ':' -f 2
We grep
for the line we want, use tr
to trim away the space characters and then cut
it by the :
character and take the second part which gives us 0.312500
in this example.
You can finally use bc
on the result to compare floating-point values from the command-line:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
If you build a loop (see Bash examples) that calls sleep for 1 minute, tests the volume, and then repeats, you can leave it running in the background. The last step is to add it to the init scripts or service files (depending on your OS / distro), such that you do not even have to launch it manually.