Encontrei uma espécie de instabilidade que resolve esse problema.
Notei que quando o silêncio é detectado, o Sox naturalmente não acrescenta mais nada ao arquivo até ouvir mais som. Então decidi que poderia tentar aproveitar esse fato.
Primeiro de tudo, eu começo o gravador de som do sox em segundo plano:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
Em seguida, recebo o PID do processo de gravação com: p=$!
Em seguida, dou um segundo ao processo de gravação para concluir a inicialização e aguardo até que o arquivo comece a crescer.
sleep 1
until [ "$var1" != "$var2" ]; do
var1='du "/tmp/recording.flac"'
sleep 1
var2='du "/tmp/recording.flac"'
done
Após esse loop quebrar, isso significa que o som foi detectado. Então, agora eu crio outro loop para esperar até que os dados parem de ser anexados ao arquivo (isso acontecerá quando o sox detectar o silêncio novamente).
echo "Sound Detected"
until [ "$var1" == "$var2" ]; do
var1='du "/tmp/recording.flac"'
sleep 0.5
var2='du "/tmp/recording.flac"'
done
Agora só preciso sair do rec
:
echo "Silence Detected"
kill $p
E é isso.
Aqui está o script completo:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
p=$!
sleep 1
until [ "$var1" != "$var2" ]; do
var1='du "/tmp/recording.flac"'
sleep 1
var2='du "/tmp/recording.flac"'
done
echo "Sound Detected"
until [ "$var1" == "$var2" ]; do
var1='du "/tmp/recording.flac"'
sleep 0.5
var2='du "/tmp/recording.flac"'
done
echo "Silence Detected"
kill $p
Agora eu preferiria uma maneira melhor e mais estável de fazer isso, mas isso terá que funcionar por enquanto.