Monitore o microfone e salve os segmentos filtrados

2

Eu uso o seguinte script para monitorar meu microfone:

while true; do
    printf "$(AUDIODEV=hw:2,0 rec -n stat trim 0 1 2>&1 |
        awk 'BEGIN { ORS="" } /^Maximum amplitude/ { print "Max. amplitude: "$3} 
             /^Rough\s+frequency/ { print " Frequency: "$3} 
             /^Maximum\s+delta/ { print " Max. delta: "$3}')\r";
done

Ele grava um segmento com 1 segundo de duração, extrai valores de Maximum amplitude e Rough frequency da saída sox padrão e os imprime.

Posso salvar um segmento para o arquivo se o volume ou a frequência dele for maior que um limite específico? Eu sei que posso salvar cada segmento e analisá-lo, mas haverá muitas operações de gravação, o que eu quero evitar.

    
por ka3ak 14.01.2018 / 11:36

1 resposta

1

Eu encontrei uma solução nesse meio tempo. Ele é baseado em canalizar a saída de rec para base64 para que possa ser codificado em ASCII e armazenado em uma variável bash. Se é hora de analisar o volume e a frequência do segmento, corro base --decode no conteúdo da variável. No script abaixo, apenas o volume é analisado. Se exceder o limite (0,6) handleExcess é chamado e o segmento é salvo. Eu também aumentei o comprimento do segmento para 5 segundos.

handleExcess() {
    echo "$1" | base64 --decode > /tmp/"$2".wav
}

VOLUME="";

while true; do
    AUDIO_DATA="$(AUDIODEV=hw:0,0 rec -c 1 -t wav - trim 0 5 2> /dev/null | base64)";
    declare $(echo "$AUDIO_DATA" | base64 --decode | sox - -n stat 2>&1 | awk 'BEGIN { ORS="" } /^Maximum amplitude/ { print "VOLUME="$3 }');

    if [ $(echo "$VOLUME > 0.6" | bc) == 1 ]; then
        AUDIO_DATA_TMP="$AUDIO_DATA";
        handleExcess "$AUDIO_DATA_TMP" "$VOLUME""_""$(date +%s)" &
    fi
done
    
por 16.01.2018 / 08:50