Мои дети (4 и 5) орут много, когда играть в игры на компьютере. Я нашла эффективное лекарство от этого. Когда я слышу громкие звуки, я СШ в игру компьютер, и не делают:
chvt 3; sleep 15; chvt 7
Это позволит выключить экран на 15 секунд на Linux. Я'вэ сказал им, что компьютер не'т, как громкие звуки. Они полностью поверить в это и попросить компьютер для прощения. Они стали намного тише, но не до уровня, что я буду счастлив, и поэтому мне нужно продолжать этот образовательный процесс. Впрочем, я не всегда вокруг, чтобы сделать это вручную.
Можно ли автоматизировать это? Микрофон крепится к коробке. Если уровень громкости переходит некий порог, то я хочу, чтобы выполнить команду.
Используйте Сокс
из Сокс анализировать короткий образец звука:
sox -t .wav "|arecord -d 2" -n stat
С-т .в формате WAVмы указываем мы обрабатываем файлы WAV тип, в
"|Летопись -д-2"в выполняет [
летопись](http://www.linuxcommand.org/man_pages/arecord1.html) программы в течение двух секунд,
-Нвыводит на пустой файл и с
стат` мы указываем, что мы хотим статистику.
Вывод этой команды, на моей системе с фоновой речи, является:
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
на линии, мы хотим, использовать тр
, чтобы отсечь Пространство символов, а затем резать
это символ": "и возьмите вторую часть, которая дает нам 0.068383
в этом примере. Как полагают замечания, СКЗ является лучшей мерой энергии, чем максимальная амплитуда.
Вы можете, наконец, использовать бл
на результат, чтобы сравнить значения с плавающей точкой из командной строки:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Если вы строите петли (см. Баш примеры) что звонки сон в течение 1 минуты, объем испытаний, а потом повторяет, вы можете оставить ее работать в фоновом режиме. Последний шаг, чтобы добавить его в инит скрипты или служебные файлы (в зависимости от вашей ОС / дистрибутив), так что вам даже не придется запускать его вручную.
Здесь's, как это может быть сделано с данных:
Метро метроном, и "Метро 100" и тикает каждые 100 мс.
Звук идет от АЦП~, объем рассчитывается по ОКР~. на "ДСП я пд 0&; выключает DSP, когда грохнут, то "ПД ДСП 1" и включает его. на "Шелл" и выполняет переданную команду в консоли, я использую Линукс расширения xrandr API, чтобы установить яркость на Х, вы должны адаптировать этот Вэйланд.
Как вы можете видеть, льготный период и замок занимает намного больше места, чем аудио код.
Делая раствор с кольцевыми буферами и/или скользящие средние должны быть намного легче, чем делать это с Сокс
. Так что я Дон'т думаю, что это'ы плохая идея, чтобы использовать чистые данные для этого. Но гашения экрана и блокировки не'т соответствовать парадигме потоков данных.
Файл БП по gist.github.com: ysangkok - kidsyell.ПД.
Проверьте "Как определять наличие звука/аудио" и по Thomer М. Хиль.
В основном он записывает звук каждые 5 секунд, чем чеки для звуковой амплитуды, используя Сокс
, и решает, нужно ли запускать скрипт или нет. Я думаю, что вы можете легко адаптировать Рубин
сценариев для ваших детей! Или вы можете выбрать, чтобы вырезать на скрипт Python (используя PyAudio), которые он предоставил, а также.
Вы можете получить информацию от микрофона, делая что-то вроде:
arecord -d1 /dev/null -vvv
Возможно, вам придется поиграть с настройками немного, такие как:
arecord -d1 -Dhw:0 -c2 -fS16_LE /dev/null -vvv
Оттуда на, это'ы простой вопрос парсинга вывода.
Это один из более занимательных вопросов, которые я'вэ видел. Я хотел бы поблагодарить белых за такой прекрасный ответ, который я поставил как баш скрипт
#!/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
Мои 2 цента на C или C++ решение: возможно, не самый эффективный подход, но на Linux, вы можете использовать алса АПИ (встроенный аудио обработки библиотеки Linux) и использовать некоторые численным методом (например, вычисление среднего уровня звука каждую секунду), чтобы получить уровень шума.
Затем вы можете проверить это в бесконечный цикл, и если это's не превышает заданный порог, вы можете использовать Х11 библиотека, чтобы выключить экран на несколько секунд, либо (менее элегантно, но это работает) ссылаться на chvt команды
, используя систему("по-chvt 3; Сон 15; chvt 7 и");
.