Use sox
do SoX para analisar uma pequena amostra de áudio:
sox -t .wav "|arecord -d 2" -n stat
Com -t .wav
especificamos nós processamos o tipo wav, "|arecord -d 2"
executa o arecord
programa por dois segundos, -n
saídas para o arquivo nulo e com stat
nó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 grep
para a linha que queremos, usar tr
para aparar os caracteres de espaço e, em seguida, cut
pelo :
caráter e tomar a segunda parte, que nos dá 0.068383
neste exemplo. Conforme sugerido pelos comentários, o RMS é uma melhor medida de energia que a amplitude máxima.
Você pode finalmente usar bc
no 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.