Utilizzare soxda SoX per analizzare un breve campione audio:
sox -t .wav "|arecord -d 2" -n stat
Con -t .wavspecifichiamo elaboriamo il tipo wav, "|arecord -d 2"eseguiamo il arecord programma per due secondi, eseguiamo l' -noutput nel file null e con statspecifichiamo 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 grepper la linea che vogliamo, usiamo trper tagliare i caratteri dello spazio e poi cutper il :personaggio e prendere la seconda parte che ci dà 0.068383in questo esempio. Come suggerito dai commenti, RMS è una misura di energia migliore della massima ampiezza.
Puoi infine utilizzare bcil 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.