Esta solución evitará escribir repetidamente en el disco, y aunque en el peor de los casos toma un segundo en lugar del deseado menos de medio segundo, encontré que es lo suficientemente rápido después de probarlo. Entonces, aquí están los dos scripts que uso:
./detectar:
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
./check.py:
#!/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"
Apenas elegante, pero funciona.
Nota:si quieres algo más gradual, agrega algo como esto:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
para silenciar y
for i in `seq 0 80`; do
amixer set Master $i
done
para desactivar el silencio.
Solo la versión sin script de python y TALKING_PERIOD, que configura cuántos segundos sonará en el nivel DOWN_SOUND_PERC, luego pasa al nivel UP_SOUND_PERC.
#!/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
hecho