Use sox
desde SoX para analizar una muestra de audio corta:
sox -t .wav "|arecord -d 2" -n stat
Con -t .wav
especificamos que procesamos el tipo de wav, "|arecord -d 2"
ejecuta el arecord
programa durante dos segundos, da -n
salida al archivo nulo y con stat
que 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 grep
para la línea que queremos, usamos tr
para recortar los caracteres de espacio y luego cut
por el :
carácter y tomar la segunda parte que nos da 0.068383
en este ejemplo. Como sugieren los comentarios, RMS es una mejor medida de energía que la amplitud máxima.
Finalmente puede usar bc
el 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.