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 else amixer set Master 80 fi done
#!/usr/bin/env python import sys number = 0.0 thing="NO" 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 done
for muting and
for i in `seq 0 80`; do amixer set Master $i done
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.
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.
#!/bin/bash TALKING_PERIOD=16 UP_SOUND_PERC=65 DOWN_SOUND_PERC=45 counter=0 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% counter=$TALKING_PERIOD else echo "hlasno" amixer -D pulse sset Master 65% fi fi if [[ $counter -gt 0 ]]; then ((counter--)) fi sleep 1