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


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

chvt 3;  sleep 15;  chvt 7 

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

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


1526
2018-02-01 17:14


происхождения


Пока они не научится нажимать CTRL + ALT + F7 - Suici Doga


ответы:


использование 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), который вызывает спать в течение 1 минуты проверяет громкость, а затем повторяет, вы можете оставить ее в фоновом режиме. Последний шаг - добавить его в сценарии инициализации или служебные файлы (в зависимости от вашей ОС / дистрибутива), чтобы вы даже не запускали его вручную.


637
2018-02-01 17:36



Я бы не согласился принять максимальную амплитуду. Это не хорошо для детей, когда их экран гаснет только потому, что кто-то хлопнул или что-то подобное. Среднее кажется более подходящим. - orlp
Просто разъяснение, по «среднему» вы имеете в виду RMS Amplitude? Средняя амплитуда будет близка к 0, если шум будет иметь согласованную громкость в течение 2 секунд (положительная и отрицательная половины будут отменять друг друга). - Luke
Простой «энергетический» детектор для серии образцов состоит в том, чтобы просто добавить значение всех пиков вместе. Вам не нужно было бы даже усреднять его, если бы вы этого не хотели. Пик - это всего лишь точка, где sample[n]>sample[n-1]&&sample[n]>sample[n+1] Я использовал это как рудиментарный механизм измерения энергии песни, и он работает достаточно хорошо. Просто найдите магическое число, в котором вы довольны уровнем громкости. - Kaslai
Я хотел бы увидеть образец вывода вашей первой команды, когда на самом деле приходит к ребенку, кричащему, для справки. - Alvin Wong
Для описанного использования (запуск автоматически + запуск каждые несколько минут) задание cron является правильным инструментом для использования. Гораздо проще настроить и повысить надежность, чем использование скрипта init + bash loop + sleep. - m000


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

Kid yell prevention using Pure Data

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

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

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

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

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


126
2018-02-05 16:20



очень хорошо! Вы можете сделать это очень отзывчивым, используя эту технику: отслеживать средний уровень звука за минуту, а затем использовать это как базовую линию, чтобы, когда дети переходят на 20 дБ выше базовой линии, она срабатывает. Затем он автоматически настроится на уровень окружающего звука. - Hans-Christoph Steiner
Да, это имеет смысл @ Hans-ChristophSteiner. Но каким-то образом не будет ли уровень окружающего шума на самом деле требовать от детей кричать громче, поскольку они будут составлять меньшую долю общего шума? Это, конечно, применимо только в том случае, если существующий шум белый или розовый или иначе игнорируется. - Janus Troelsen
если бы он был тише обычного, например, утром в выходные, то это сделало бы его более чувствительным, так как оно всегда будет на 20 дБ выше уровня окружающей среды - Hans-Christoph Steiner
Это расширенный PD? - nullpotent
@iccthedral: я использовал pd-extended, чтобы сделать это, но я не знаю, использовал ли я какие-либо расширенные конкретные конструкции pd. - Janus Troelsen


Проверьте «Как определить наличие звука / звука» Томара М. Гила,

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


100
2018-02-01 17:32



Как насчет этих вспышек менее 5 секунд, чтобы избежать обнаружения? - RhysW


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

arecord -d1 /dev/null -vvv

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

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

Оттуда, это просто вопрос анализа результатов.


52
2018-02-01 17:28





Это один из самых интересных вопросов, которые я видел. Я хотел бы поблагодарить белый дельфин  за такой прекрасный ответ; что я установил как скрипт 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

43
2018-02-08 14:10



Если вы запустите этот запуск, добавив строку в /etc/rc4.d/S99rc.local, а затем измените входной микрофон с unamplified на 100%, вы тоже можете попасть в tty3 (вы можете прыгнуть назад до сна с помощью Ctrl + Alt + F7), и если ваша клавиатура слишком громкая, чтобы открыть терминал, для запуска sudo killall too_loud, тогда Ctrl + Alt + F1 и войдите там.) - Alexx Roche


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

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


41
2018-02-01 17:32



Если использовать команду, я бы рассмотрел что-то другое, чем chvt, ArchWiki имеет приятные примеры. - A.D.