Как сделать машину «экранным экраном» в течение определенного периода времени (в качестве штрафа), если будут достигнуты определенные уровни шума?

Мои дети (4 и 5) много орают, играя в игры на компьютере. Я нашел эффективное средство для этого. Когда я слышу громкие звуки, я вхожу в компьютер игры и делаю:

chvt 3;  sleep 15;  chvt 7 

Это отключит экран в течение 15 секунд в Linux. Я сказал им, что компьютер не любит громких звуков. Они полностью верят в это и просят компьютер прощения. Они стали намного тише, но не до уровня, которым я был бы счастлив, и поэтому мне нужно продолжить этот образовательный процесс. Однако я не всегда делаю это вручную.

Можно ли автоматизировать это? К коробке прикреплен микрофон. Если уровень громкости проходит некоторое пороговое значение, я хочу запустить команду.

1525 голосов | спросил Leonid Volnitsky 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 21:14:09 +0400000000pmFri, 01 Feb 2013 21:14:09 +040013 2013, 21:14:09

6 ответов


637

Используйте sox из SoX , чтобы проанализировать короткий образец аудио:

sox -t .wav "|arecord -d 2" -n stat

С -t .wav мы указываем, что мы обрабатываем wav-тип, "|arecord -d 2" выполняет arecord в течение двух секунд, -n выводит в нулевой файл и с stat мы указываем, что хотим статистику.

Вывод этой команды в моей системе с некоторой фоновой речью:

Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read:             16000
Length (seconds):      2.000000
Scaled by:         2147483647.0
Maximum amplitude:     0.312500
Minimum amplitude:    -0.421875
Midline amplitude:    -0.054688
Mean    norm:          0.046831
Mean    amplitude:    -0.000044
RMS     amplitude:     0.068383
Maximum delta:         0.414063
Minimum delta:         0.000000
Mean    delta:         0.021912
RMS     delta:         0.036752
Rough   frequency:          684
Volume adjustment:        2.370

Затем максимальная амплитуда может быть извлечена через:

grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2

Мы grep для линии, которую хотим, используйте tr , чтобы обрезать пробельные символы, а затем cut с помощью символа : и возьмите вторую часть, которая дает нам 0.068383 в этом примере. Как указано в комментариях, RMS является лучшим показателем энергии, чем максимальная амплитуда.

Наконец, вы можете использовать bc для сравнения значений с плавающей запятой из командная строка:

if (( $(echo "$value > $threshold" | bc -l) )) ; # ... 

Если вы создаете цикл (см. Примеры Bash ), который вызывает sleep в течение 1 минуты, проверяет громкость, а затем повторяет, вы можете оставить ее в фоновом режиме. Последний шаг - добавить его в сценарии инициализации или служебные файлы (в зависимости от вашей ОС /дистрибутива), чтобы вы даже не запускали его вручную.

ответил tucuxi 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 21:36:38 +0400000000pmFri, 01 Feb 2013 21:36:38 +040013 2013, 21:36:38
126

Вот как это можно сделать с помощью Чистых данных :

Защита от крика с использованием чистых данных

Metro - метроном, а «метро 100» продолжает бить каждый 100 мс.

Аудио поступает из adc ~, объем вычисляется по env ~. «pd dsp 0» отключает DSP при ударе, «pd dsp 1» включает его. «shell» выполняет переданную команду в оболочке, я использую API-интерфейс Linux xrandr для установки яркости на X, вам нужно адаптировать это для Wayland.

Как вы можете видеть, льготный период и блокировка занимают больше места, чем звуковой код.

Создание решения с кольцевыми буферами и /или скользящими средними должно быть проще, чем при использовании sox. Поэтому я не думаю, что это плохая идея использовать Pure Data для этого. Но сам экранный экран и блокировка не соответствуют парадигме потока данных.

Файл PD находится в gist.github.com: ysangkok - kidsyell.pd .

ответил Janus Troelsen 5 FebruaryEurope/MoscowbTue, 05 Feb 2013 20:20:11 +0400000000pmTue, 05 Feb 2013 20:20:11 +040013 2013, 20:20:11
100

Отметьте «Как обнаружить присутствие звука /звука» Томара М. Гила .

В основном он записывает звук каждые 5 секунд, чем проверяет амплитуду звука, используя sox и решает, запускать сценарий или нет. Я думаю, вы можете легко адаптировать скрипт ruby для своих детей! Или вы можете взломать скрипт Python (используя PyAudio), который он также предоставил.

ответил Atropo 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 21:32:18 +0400000000pmFri, 01 Feb 2013 21:32:18 +040013 2013, 21:32:18
52

Вы можете получить информацию от микрофона, сделав что-то вроде:

arecord -d1 /dev/null -vvv

Возможно, вам придется немного поиграть с настройками, например:

arecord -d1 -Dhw:0 -c2 -fS16_LE /dev/null -vvv

Оттуда, это просто вопрос разбора вывода.

ответил cha0site 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 21:28:44 +0400000000pmFri, 01 Feb 2013 21:28:44 +040013 2013, 21:28:44
43

Это один из самых веселых вопросов, которые я видел. Я хотел бы поблагодарить tucuxi  за такой прекрасный ответ; что я установил в качестве сценария bash

#!/bin/bash

threshold=0.001
# we should check that sox and arecord are installed
if [ $1 ]; then threshold=$1; fi
while [ 1 -gt 0 ]; do
 if(( $(echo "$(sox -t .wav '|arecord -d 2' -n stat 2>&1|grep -e 'RMS.*amplitude'|tr -d ' '|cut -d ':' -f 2 ) > $threshold"|bc -l) ))
 then
  chvt 3; sleep 5; chvt 7;
 fi
done
ответил Alexx Roche 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 18:10:44 +0400000000pmFri, 08 Feb 2013 18:10:44 +040013 2013, 18:10:44
41

Мои 2 цента для решения C или C ++: возможно, это не самый эффективный подход, но в Linux вы можете использовать ALSA API (встроенная библиотека обработки аудиоинформации Linux) и использовать некоторую численную технику (например, вычисление среднего уровня звука каждую секунду) для получения уровня шума.

Затем вы можете проверить его в бесконечном цикле, и если он больше, чем предустановленный вызов, вы можете использовать библиотека X11 , чтобы отключить экран в течение нескольких секунд или, альтернативно (менее элегантный, но он работает), вызовите команду chvt, используя system("chvt 3; sleep 15; chvt 7 ");.

ответил H2CO3 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 21:32:58 +0400000000pmFri, 01 Feb 2013 21:32:58 +040013 2013, 21:32:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132