Estoy escribiendo un guión que usa sox para grabarme hablando. Ahora necesito sox para esperar hasta que detecte el sonido antes de que comience a grabar, y lo tengo resuelto. Pero también necesito sox para salir una vez que haya habido silencio durante al menos 3 segundos. Tal como está ahora, tengo que matar manualmente a Sox una vez que termine de hablar, de lo contrario, Sox solo espera nuevamente hasta que hable un poco más, agregando al archivo de salida (Eso no es lo que quiero). Aquí está el comando para grabar que estoy usando ahora:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
Una vez más, para ser claros, Sox debería esperar hasta que empiece a hablar, y luego grabar hasta que deje de hablar, luego el programa de Sox debería salir.
Ajusté las ideas anteriores un poco más. Graba para siempre, graba todo el ruido hasta que (aproximadamente) se encuentra un segundo de silencio. Luego:
(Hace un pequeño repetidor de eco UHF / 2 metros muy práctico)
fuente
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:
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.
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).
Ahora solo necesito dejar de fumar
rec
:Y eso es. Aquí está el guión completo:
Ahora preferiría una forma mejor y más estable de hacer esto, pero esto tendrá que funcionar por ahora.
fuente
Esto escucha para siempre, graba solo los últimos sonidos hasta que escucha un segundo de silencio, luego escribe el archivo, lo marca de tiempo y se reinicia:
fuente
while true
bucles