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.

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.


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

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.


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

2
Bash tiene while truebucles
Michael Mrozek
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.