Use soxdesde SoX para analizar una muestra de audio corta:
sox -t .wav "|arecord -d 2" -n stat
Con -t .wavespecificamos que procesamos el tipo de wav, "|arecord -d 2"ejecuta el arecord programa durante dos segundos, da -nsalida al archivo nulo y con statque especificamos queremos estadísticas.
El resultado de este comando, en mi sistema con algunas palabras de fondo, es:
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
La amplitud máxima se puede extraer a través de:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Nosotros greppara la línea que queremos, usamos trpara recortar los caracteres de espacio y luego cutpor el :carácter y tomar la segunda parte que nos da 0.068383en este ejemplo. Como sugieren los comentarios, RMS es una mejor medida de energía que la amplitud máxima.
Finalmente puede usar bcel resultado para comparar valores de punto flotante desde la línea de comandos:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Si crea un bucle (vea los ejemplos de Bash ) que llama a dormir durante 1 minuto, prueba el volumen y luego se repite, puede dejarlo ejecutándose en segundo plano. El último paso es agregarlo a los scripts de inicio o archivos de servicio (dependiendo de su sistema operativo / distribución), de modo que ni siquiera tenga que iniciarlo manualmente.