Estoy buscando una herramienta que me diga, en menos de medio segundo, si el micrófono está captando algún sonido por encima de un cierto umbral. (Planeo silenciar el canal maestro con otra herramienta de línea de comandos, como amixer).
Estoy buscando una herramienta que me diga, en menos de medio segundo, si el micrófono está captando algún sonido por encima de un cierto umbral. (Planeo silenciar el canal maestro con otra herramienta de línea de comandos, como amixer).
Respuestas:
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, descubrí 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
por no silenciar.
Solo versión sin script de python y TALKING_PERIOD, que configura cuántos segundos sonarán 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
Existe una herramienta llamada pavumeter que le permite ver el nivel del micrófono, la interfaz de captura abierta de pavumeter,
Luego ajuste el nivel de sonido de captura usando el control de pavu. En el control de pavu, vaya a los dispositivos de entrada y ajuste la sensibilidad del micrófono.
Editar: en el script bash de R4v0, hecho está dentro del código.
Edit2: quería subir el volumen cada vez que hay ruido, así que solo edité más que ser menor y cancelé el peroid hablando
if (( $(echo "$nmb < 0.3" |bc -l) )); then
Modifiqué el script bash para aumentar el volumen de acuerdo con el nivel de ruido circundante.
Puede cambiar el volumen mínimo, el volumen máximo [el valor está en porcentaje].
To_Do: incremento aún no probado. Sox y BC necesitan ser instalados.
#!/bin/bash
minimum_volume=20
maximum_volume=60
increment=10
counter=0
while true; do
# echo "counter: " $counter
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.1" |bc -l) )); then
amixer -D pulse sset Master $minimum_volume%
else
if (( $(echo "$nmb <= 0.2" |bc -l) )); then
amixer -D pulse sset Master $(($minimum_volume+ $increment))%
else
if (( $(echo "$nmb <= 0.3" |bc -l) )); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.4" |bc -l) & maximum_volume>=40)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.5" |bc -l) & maximum_volume>=50)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.6" |bc -l) & maximum_volume>=60)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.7" |bc -l) & maximum_volume>=70)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.8" |bc -l) & maximum_volume>=80)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.9" |bc -l) & maximum_volume>=90)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
amixer -D pulse sset Master $(($maximum_volume+ $minimum_volume))%
fi
fi
fi
fi
fi
fi
fi
fi
fi
sleep 1
done
while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done