I am looking for a tool that will tell me, in less than half a second, if the microphone is picking up any sound above a certain threshold. (I plan to then mute the Master channel with another command line tool, like amixer.)


This solution will avoid writing repeatedly to disk, and even though it in worst case takes a second instead of the desired less than half a second, I found it to be fast enough after trying it. So, here are the two scripts I use:


while true; do
    arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>\
    &1 | grep "Maximum amplitude" | cut -d ':' -f 2 | ./check.py
    if [ $? -eq 0 ] ; then
         amixer set Master 0
         amixer set Master 80


#!/usr/bin/env python
import sys

number = 0.0

line = sys.stdin.readline()
thing = line.strip()
number = float(thing)

if number < 0.15:
    raise Exception,"Below threshold"

Hardly elegant, but it works.

Note: If you want a more gradual thing, add something like this:

   for i in `seq 0 80 | tac`; do
      amixer set Master $i

for muting and

   for i in `seq 0 80`; do
      amixer set Master $i

for unmuting.

  • 6
    A slightly more elegant solution, which supports half-second resolution and doesn't require a temporary file: while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done – nandhp Jun 29 '12 at 13:17
  • 1
    Python is a bit overkill, math-blog.com/2012/07/23/… result=$(AUDIODEV=hw:1 rec -n stat trim 0 .5 2>&1 | grep "Maximum amplitude" | grep -o "[0-9]\.[0-9]*$"); echo "$result > 0.01" | bc – kevinf Jun 15 '16 at 5:55
  • 1
    Just keep in mind that 'Maximum amplitude' isn't the only indicator of a loud sound. A sound with a high frequency (e.g. clinking of glasses) may be perceived as really loud by human ears but the sox' 'Maximum amplitude' won't be very different from the lowest one. So in some cases it would make sense to analyze 'Rough frequency' as well. – ka3ak May 19 '17 at 15:05

There is a tool called pavumeter that lets you see the microphone level, Open capture interface of pavumeter,

Then adjust the capture sound level using pavucontrol, In pavucontrol, go to input devices, and adjust microphone sensitivity.

  • 4
    "command line tool" – deltaray Oct 26 '16 at 21:38

Just version without python script and TALKING_PERIOD, that sets up how many seconds will sound be on DOWN_SOUND_PERC level, then goes to UP_SOUND_PERC level.


while true; do

echo "counter: " $counter

if [ "$counter" -eq 0 ]; then
    nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)

    echo "nmb: " $nmb

    if (( $(echo "$nmb > 0.3" |bc -l) )); then
        echo "ticho"
        amixer -D pulse sset Master 45%
        echo "hlasno"
        amixer -D pulse sset Master 65%

if [[ $counter -gt 0 ]]; then

sleep 1


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.