Ho trovato una specie di modo traballante che risolve questo problema.
Ho notato che quando viene rilevato il silenzio, Sox naturalmente non aggiunge altro al file fino a quando non sente più suono. Quindi ho deciso di provare a trarre vantaggio da questo fatto.
Prima di tutto, avvio il registratore di suoni di Sox in background:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
Successivamente ottengo il PID del processo di registrazione con: p=$!
Quindi do un secondo al processo di registrazione per terminare l'avvio, quindi aspetto fino a quando il file inizia a crescere.
dormire 1
fino a ["$ var1"! = "$ var2"]; fare
var1 = `du" /tmp/recording.flac "`
dormire 1
var2 = `du" /tmp/recording.flac "`
fatto
Dopo che questo loop si interrompe, significa che il suono è stato rilevato. Quindi ora creo un altro loop per attendere fino a quando i dati non vengono aggiunti al file (ciò accadrà quando sox rileverà di nuovo il silenzio).
echo "Rilevato suono"
fino a ["$ var1" == "$ var2"]; fare
var1 = `du" /tmp/recording.flac "`
dormire 0,5
var2 = `du" /tmp/recording.flac "`
fatto
Ora ho solo bisogno di smettere rec
:
echo "Silence Detected"
uccidi $ p
E questo è tutto. Ecco lo script completo:
registr /tmp/recording.flac rate 32k silenzio 1 0,1 3% -1 3,0 3% e
p = $!
dormire 1
fino a ["$ var1"! = "$ var2"]; fare
var1 = `du" /tmp/recording.flac "`
dormire 1
var2 = `du" /tmp/recording.flac "`
fatto
echo "Rilevato suono"
fino a ["$ var1" == "$ var2"]; fare
var1 = `du" /tmp/recording.flac "`
dormire 0,5
var2 = `du" /tmp/recording.flac "`
fatto
echo "Silence Detected"
uccidi $ p
Ora preferirei un modo migliore e più stabile per farlo, ma per ora dovrà funzionare.