Use sox de SoX para analisar uma pequena amostra de áudio:
sox -t .wav "|arecord -d 2" -n stat
Com -t .wav especificamos que processamos o tipo de wav, "|arecord -d 2" executa o programa arecord por dois segundos, -n envia para o arquivo nulo e com stat especificamos que queremos estatísticas.
A saída deste comando, no meu sistema com algum discurso de fundo, é:
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
A amplitude máxima pode então ser extraída via:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Nós grep para a linha que queremos, use tr para aparar os caracteres de espaço e, em seguida, cut pelo caractere : e pegue a segunda parte que nos dá 0.068383 neste exemplo. Como sugerido pelos comentários, RMS é uma melhor medida de energia do que a amplitude máxima.
Finalmente, você pode usar bc no resultado para comparar os valores de ponto flutuante na linha de comando:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Se você criar um loop (consulte Exemplos de Bash ) que chama dormir por 1 minuto, testa o volume e repete, você pode deixá-lo rodando em segundo plano. O último passo é adicioná-lo aos scripts de inicialização ou arquivos de serviço (dependendo do sistema operacional / distribuição), de tal forma que você nem precise ativá-lo manualmente.
