Мои дети (4 и 5) много кричат, играя в игры на компьютере. Я нашел эффективное лекарство от этого. Когда я слышу громкие звуки, я захожу в игровой компьютер и делаю:
chvt 3; sleep 15; chvt 7
Это выключит экран на 15 секунд в Linux. Я сказал им, что компьютер не любит громкие звуки. Они полностью верят в это и просят у компьютера прощения. Они стали намного тише, но не до того уровня, на котором я был бы счастлив, и поэтому мне нужно продолжить этот образовательный процесс. Тем не менее, я не всегда готов сделать это вручную.
Можно ли это автоматизировать? Микрофон прикреплен к коробке. Если уровень громкости превышает некоторый порог, тогда я хочу запустить команду.
linux
audio
shell
parental-controls
Леонид Вольницкий
источник
источник
Ответы:
Используйте
sox
из SoX для анализа короткого аудио образца:Если
-t .wav
мы укажем, мы обрабатываем тип wav,"|arecord -d 2"
выполняемarecord
программу в течение двух секунд,-n
выводим в нулевой файл иstat
указываем, что нам нужна статистика.Вывод этой команды в моей системе с некоторой фоновой речью:
Максимальная амплитуда может быть затем извлечена с помощью:
Мы
grep
для строки, которую мы хотим, используем,tr
чтобы обрезать символы пробела и затемcut
его по:
символу и взять вторую часть, которая дает нам0.068383
в этом примере. Как следует из комментариев, RMS является лучшим показателем энергии, чем максимальная амплитуда.Наконец, вы можете использовать
bc
результат для сравнения значений с плавающей точкой из командной строки:Если вы создаете цикл (см. Примеры Bash ), который вызывает сон в течение 1 минуты, проверяет громкость, а затем повторяет, вы можете оставить его работающим в фоновом режиме. Последний шаг - добавить его в сценарии инициализации или служебные файлы (в зависимости от вашей ОС / дистрибутива), чтобы вам даже не пришлось запускать его вручную.
источник
sample[n]>sample[n-1]&&sample[n]>sample[n+1]
я использовал это как элементарный механизм для измерения энергии песни, и он работает довольно хорошо. Просто найдите магическое число, на котором вы довольны уровнем громкости.Вот как это можно сделать с помощью Pure Data :
Метро - это метроном, и «Метро 100» продолжает стучать каждые 100 мс.
Звук идет от adc ~, громкость рассчитывается по env ~. «pd dsp 0» отключает DSP при ударе, «pd dsp 1» включает его. «shell» выполняет переданную команду в оболочке, я использую Linux Xrandr API для установки яркости на X, вам нужно адаптировать это для Wayland.
Как видите, льготный период и блокировка занимают намного больше места, чем аудиокод.
Создание решения с кольцевыми буферами и / или скользящими средними должно быть намного проще, чем с ним
sox
. Поэтому я не считаю плохой идеей использовать для этого Чистые данные. Но экран сам по себе гаснет, и блокировка не соответствует парадигме потока данных.Файл PD находится по адресу gist.github.com: ysangkok - kidsyell.pd .
источник
Проверка "Как обнаружить наличие звука / звука" от Thomer M. Gil .
В основном он записывает звук каждые 5 секунд, затем проверяет амплитуду звука, используя
sox
, и решает, запускать сценарий или нет. Я думаю, что вы можете легко адаптироватьruby
сценарий для ваших детей! Или вы можете выбрать взломать скрипт Python (используя PyAudio), который он также предоставил.источник
Вы можете получить информацию с микрофона, выполнив что-то вроде:
Возможно, вам придется немного поиграть с настройками, такими как:
С этого момента, это просто вопрос анализа результатов.
источник
Это один из самых забавных вопросов, которые я видел. Я хотел бы поблагодарить Tucuxi за такой прекрасный ответ; что я установил как скрипт bash
источник
Мои 2 цента за решение C или C ++: возможно, не самый эффективный подход, но в Linux вы можете использовать ALSA API (встроенную библиотеку обработки звука в Linux) и использовать некоторые числовые методы (например, вычисление среднего звука). уровень каждую секунду), чтобы получить уровень шума.
Затем вы можете проверить это в бесконечном цикле, и, если он превышает заданный порог, вы можете использовать библиотеку X11, чтобы отключить экран на несколько секунд, или, альтернативно (менее элегантно, но это работает), вызвать
chvt
команду, используяsystem("chvt 3; sleep 15; chvt 7 ");
.источник
chvt
. ArchWiki имеет хорошие примеры.