Encontré una forma inestable que resuelve este problema.
Me di cuenta de que cuando se detecta el silencio, sox naturalmente no agregará nada más al archivo hasta que escuche más sonido. Entonces decidí que podía tratar de aprovechar este hecho.
En primer lugar, inicio la grabadora de sonido de sox en segundo plano:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
Luego obtengo el PID del proceso de grabación con: p=$!
Luego le doy al proceso de grabación un segundo para terminar de comenzar y luego espero hasta que el archivo comience a crecer.
dormir 1
hasta que ["$ var1"! = "$ var2"]; hacer
var1 = `du" /tmp/recording.flac "`
dormir 1
var2 = `du" /tmp/recording.flac "`
hecho
Después de que este bucle se rompe, eso significa que se ha detectado el sonido. Así que ahora creo otro ciclo para esperar hasta que los datos dejen de agregarse al archivo (esto sucederá una vez que Sox detecte el silencio nuevamente).
echo "Sonido detectado"
hasta ["$ var1" == "$ var2"]; hacer
var1 = `du" /tmp/recording.flac "`
dormir 0.5
var2 = `du" /tmp/recording.flac "`
hecho
Ahora solo necesito dejar de fumar rec
:
echo "Silencio detectado"
matar $ p
Y eso es. Aquí está el guión completo:
rec /tmp/recording.flac rate 32k silencio 1 0.1 3% -1 3.0 3% &
p = $!
dormir 1
hasta que ["$ var1"! = "$ var2"]; hacer
var1 = `du" /tmp/recording.flac "`
dormir 1
var2 = `du" /tmp/recording.flac "`
hecho
echo "Sonido detectado"
hasta ["$ var1" == "$ var2"]; hacer
var1 = `du" /tmp/recording.flac "`
dormir 0.5
var2 = `du" /tmp/recording.flac "`
hecho
echo "Silencio detectado"
matar $ p
Ahora preferiría una forma mejor y más estable de hacer esto, pero esto tendrá que funcionar por ahora.