Use soxdo SoX para analisar uma pequena amostra de áudio:
sox -t .wav "|arecord -d 2" -n stat
Com -t .wavespecificamos nós processamos o tipo wav, "|arecord -d 2"executa o arecord programa por dois segundos, -nsaídas para o arquivo nulo e com statnós especificamos que queremos estatísticas.
A saída deste comando, no meu sistema com algum discurso em segundo plano, é:
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 através de:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Nós greppara a linha que queremos, usar trpara aparar os caracteres de espaço e, em seguida, cutpelo :caráter e tomar a segunda parte, que nos dá 0.068383neste exemplo. Conforme sugerido pelos comentários, o RMS é uma melhor medida de energia que a amplitude máxima.
Você pode finalmente usar bcno resultado para comparar valores de ponto flutuante na linha de comando:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Se você criar um loop (consulte os exemplos do Bash ) que chama suspensão por 1 minuto, testa o volume e depois repete, você pode deixá-lo em execução em segundo plano. O último passo é adicioná-lo aos scripts init ou aos arquivos de serviço (dependendo do sistema operacional / distribuição), de forma que você nem precise iniciá-lo manualmente.