Eu encontrei um tipo de maneira instável que meio que resolve esse problema.
Percebi que quando o silêncio é detectado, o sox naturalmente não acrescenta mais nada ao arquivo até ouvir mais som. Então eu decidi que poderia tentar tirar proveito desse fato.
Primeiro, inicio 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=$!
Depois, dou um segundo ao processo de gravação para concluir a inicialização e espero até o arquivo começar a crescer.
dormir 1
até ["$ var1"! = "$ var2"]; Faz
var1 = `du" /tmp/recording.flac "`
dormir 1
var2 = `du" /tmp/recording.flac "`
feito
Após a quebra desse loop, 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).
eco "Som detectado"
até ["$ var1" == "$ var2"]; Faz
var1 = `du" /tmp/recording.flac "`
sono 0.5
var2 = `du" /tmp/recording.flac "`
feito
Agora só preciso sair rec
:
eco "Silêncio detectado"
mate $ p
E é isso. Aqui está o script completo:
taxa rec /tmp/recording.flac 32k silêncio 1 0,1 3% -1 3,0 3% &
p = $!
dormir 1
até ["$ var1"! = "$ var2"]; Faz
var1 = `du" /tmp/recording.flac "`
dormir 1
var2 = `du" /tmp/recording.flac "`
feito
eco "Som detectado"
até ["$ var1" == "$ var2"]; Faz
var1 = `du" /tmp/recording.flac "`
sono 0.5
var2 = `du" /tmp/recording.flac "`
feito
eco "Silêncio detectado"
mate $ p
Agora, eu preferiria uma maneira melhor e mais estável de fazer isso, mas isso terá que funcionar por enquanto.