Mis hijos (4 y 5) gritan mucho cuando juegan en la computadora. Encontré una cura efectiva para esto. Cuando escucho ruidos fuertes, me meto en la computadora del juego y hago:
chvt 3; sleep 15; chvt 7
Esto apagará la pantalla durante 15 segundos en Linux. Les dije que a la computadora no le gustan los ruidos fuertes. Creen totalmente en esto y le piden perdón a la computadora. Se volvieron mucho más silenciosos, pero no al nivel en que sería feliz, por lo que necesito continuar este proceso educativo. Sin embargo, no siempre estoy cerca para hacer esto manualmente.
¿Es posible automatizar esto? Se adjunta un micrófono a la caja. Si el nivel de volumen pasa algún umbral, entonces quiero ejecutar un comando.
linux
audio
shell
parental-controls
Leonid Volnitsky
fuente
fuente
Respuestas:
Use
sox
desde SoX para analizar una muestra de audio corta:Con
-t .wav
especificamos que procesamos el tipo de wav,"|arecord -d 2"
ejecuta elarecord
programa durante dos segundos, da-n
salida al archivo nulo y constat
que especificamos queremos estadísticas.El resultado de este comando, en mi sistema con algunas palabras de fondo, es:
La amplitud máxima se puede extraer a través de:
Nosotros
grep
para la línea que queremos, usamostr
para recortar los caracteres de espacio y luegocut
por el:
carácter y tomar la segunda parte que nos da0.068383
en este ejemplo. Como sugieren los comentarios, RMS es una mejor medida de energía que la amplitud máxima.Finalmente puede usar
bc
el resultado para comparar valores de punto flotante desde la línea de comandos:Si crea un bucle (vea los ejemplos de Bash ) que llama a dormir durante 1 minuto, prueba el volumen y luego se repite, puede dejarlo ejecutándose en segundo plano. El último paso es agregarlo a los scripts de inicio o archivos de servicio (dependiendo de su sistema operativo / distribución), de modo que ni siquiera tenga que iniciarlo manualmente.
fuente
sample[n]>sample[n-1]&&sample[n]>sample[n+1]
que he usado esto como un mecanismo rudimentario para medir la energía de una canción y funciona bastante bien. Simplemente busque un número mágico en el que esté satisfecho con el nivel de volumen.Así es como se puede hacer con Pure Data :
Metro es un metrónomo, y "metro 100" sigue golpeando cada 100 ms.
El audio proviene de adc ~, el volumen se calcula por env ~. "pd dsp 0" apaga el DSP cuando se golpea, "pd dsp 1" lo enciende. "shell" ejecuta el comando pasado en un shell, uso la API xrandr de Linux para establecer el brillo en X, necesita adaptar esto para Wayland.
Como puede ver, el período de gracia y el bloqueo ocupan mucho más espacio que el código de audio.
Hacer una solución con amortiguadores de anillo y / o promedios móviles debería ser mucho más fácil que hacerlo
sox
. Así que no creo que sea una mala idea usar Pure Data para esto. Pero la pantalla se queda en blanco y el bloqueo no se ajusta al paradigma del flujo de datos.El archivo PD está en gist.github.com: ysangkok - kidsyell.pd .
fuente
Consulte "Cómo detectar la presencia de sonido / audio" de Thomer M. Gil .
Básicamente, graba el sonido cada 5 segundos, luego comprueba la amplitud del sonido, usa
sox
y decide si dispara un guión o no. ¡Creo que puede adaptar fácilmente elruby
guión para sus hijos! O puede optar por hackear el script de Python (usando PyAudio) que también ha proporcionado.fuente
Puede obtener información del micrófono haciendo algo como:
Puede que tenga que jugar un poco con la configuración, como:
De ahí en adelante, es una simple cuestión de analizar la salida.
fuente
Esta es una de las preguntas más divertidas que he visto. Me gustaría agradecer a tucuxi por tan buena respuesta; que configuré como script bash
fuente
Mis 2 centavos para la solución C o C ++: tal vez no sea el enfoque más efectivo, pero en Linux, puede usar la API ALSA (biblioteca de manejo de audio incorporada de Linux) y usar alguna técnica numérica (por ejemplo, calcular el sonido promedio nivelar cada segundo) para obtener el nivel de ruido.
Luego puede verificarlo en un bucle infinito, y si es mayor que un umbral preestablecido, puede usar la biblioteca X11 para apagar la pantalla durante algunos segundos, o alternativamente (menos elegante, pero funciona) invocar el
chvt
comando usandosystem("chvt 3; sleep 15; chvt 7 ");
.fuente
chvt
. ArchWiki tiene buenos ejemplos.