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.