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