Utilizzare sox
da SoX per analizzare un breve campione audio:
sox -t .wav "|arecord -d 2" -n stat
Con -t .wav
specifichiamo elaboriamo il tipo wav, "|arecord -d 2"
eseguiamo il arecord
programma per due secondi, eseguiamo l' -n
output nel file null e con stat
specifichiamo che vogliamo statistiche.
L'output di questo comando, sul mio sistema con alcuni discorsi di sottofondo, è:
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
L'ampiezza massima può quindi essere estratta tramite:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Noi grep
per la linea che vogliamo, usiamo tr
per tagliare i caratteri dello spazio e poi cut
per il :
personaggio e prendere la seconda parte che ci dà 0.068383
in questo esempio. Come suggerito dai commenti, RMS è una misura di energia migliore della massima ampiezza.
Puoi infine utilizzare bc
il risultato per confrontare i valori in virgola mobile dalla riga di comando:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Se crei un loop (vedi esempi Bash ) che chiama sleep per 1 minuto, verifica il volume e quindi si ripete, puoi lasciarlo in esecuzione in background. L'ultimo passaggio è aggiungerlo agli script di init o ai file di servizio (a seconda del sistema operativo / della distribuzione), in modo tale da non dover nemmeno avviarlo manualmente.