Finalice la grabación de sox una vez que se detecte el silencio

16

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.

Isaac
fuente

Respuestas:

13

Elimine el signo negativo de su comando original:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%

Cuando el "recuento inferior" es negativo, el comando de silencio recortará todos los silencios desde la mitad del archivo. Cuando es positivo, recorta el silencio desde el final del archivo.

meetar
fuente
1
Esa es una solución mucho más simple que la que se me ocurrió, ¡LOL!
Isaac
3

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:

  • Garantiza la creación de dos subdirectorios.
  • Calcula dos espectrógrafos de la grabación: uno antes de la normalización y otro después, y escribe en carpetas con sello de fecha.
  • Escribe el normalizado en un archivo en una carpeta con fecha.
  • Reproduce el archivo normalizado de nuevo, con dos archivos chirp .ogg (de nuevo a través de la radio CB operada por voz)

(Hace un pequeño repetidor de eco UHF / 2 metros muy práctico)

#! / bin / bash
si bien es cierto; hacer
  rec buffer.ogg silencio 1 0.1 5% 1 1.0 5%
  FECHA = `fecha +% Y% m% d% H% M% S`
  DPATH = `fecha +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Cambiar el nombre del archivo de búfer a $ DATE
  sox buffer.ogg -n espectrograma -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg normbuffer.ogg ganancia -n -2
  sox normbuffer.ogg -n espectrograma -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  jugar pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
hecho
Nigel Weeks
fuente
2

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.

Isaac
fuente
1

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:

#!/bin/bash
/usr/bin/sox -t alsa default /home/default/working/recording.wav silence 1 0.1 5% 1 1.0 5%
DATE=$(date +%Y%m%d%H%M%S)
mv /home/default/working/recording.wav /home/default/waiting/$DATE.recording.wav
/home/default/startrecord.sh
Jared Terrell
fuente
2
Bash tiene while truebucles
Michael Mrozek