특정 소음 수준에 도달 한 경우 기계를 빈 화면으로 만드는 방법은 무엇입니까?


1549

내 아이들 (4와 5)은 컴퓨터에서 게임을 할 때 소리를 지 릅니다. 나는 이것에 대한 효과적인 치료법을 발견했다. 큰 소리가 들리면 게임 컴퓨터에 ssh하고 다음을 수행합니다.

chvt 3;  sleep 15;  chvt 7 

Linux에서 15 초 동안 화면이 꺼집니다. 나는 컴퓨터가 큰 소음을 좋아하지 않는다고 말했다. 그들은 이것을 완전히 믿고 컴퓨터를 용서해달라고 간청합니다. 그들은 훨씬 더 조용해졌지만, 내가 만족할만한 수준이 아니 었으므로이 교육 과정을 계속해야합니다. 그러나 항상 수동으로 수행하는 것은 아닙니다.

이것을 자동화 할 수 있습니까? 상자에 마이크가 부착되어 있습니다. 음량 수준이 임계 값을 초과하면 명령을 실행하고 싶습니다.


2
그들은 CTRL +의 ALT + F7 키를 누릅니다 배울 때까지
Suici 도가

1
@SuiciDoga 이봐; 그들은 무슨 일이 일어나고 있는지 모른다!
wizzwizz4

기술 솔루션을 축하합니다. 그러나 나는 항상 아이들에게 진실을 말하는 것이 중요하다고 생각합니다.
peterh

답변:


646

사용 sox에서 삭스 짧은 오디오 샘플을 분석 :

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

함께 -t .wav우리는 우리가 WAV 형식을 처리하는 지정 "|arecord -d 2"실행 arecord , 2 초 동안 프로그램을 -n널 (null) 파일로 출력하고, 함께 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) )) ; # ... 

1 분 동안 절전 모드 를 호출 하고 볼륨을 테스트 한 다음 반복 하는 루프 ( 배시 예제 참조)를 빌드 하면 백그라운드에서 실행 상태로 둘 수 있습니다. 마지막 단계는 수동으로 시작할 필요가 없도록 init 스크립트 또는 서비스 파일 (OS / distro에 따라 다름)에 추가하는 것입니다.


281
최대 진폭을 사용하지 않는 것이 좋습니다. 누군가가 박수를 치거나 비슷한 물건으로 인해 화면이 꺼지면 아이들에게 좋지 않습니다. 평균이 더 적절한 것 같습니다.
orlp

34
간단히 말해서 "평균"이란 RMS 진폭을 의미합니까? 잡음이 2 초 동안 일관되게 큰 경우 평균 진폭은 0에 가까워집니다 (양과 음의 절반이 서로 상쇄 됨).
누가

6
일련의 샘플에 대한 간단한 "에너지"검출기는 모든 피크의 값을 모두 더하는 것입니다. 원치 않는 경우 평균을 내야 할 필요도 없습니다. 피크는 sample[n]>sample[n-1]&&sample[n]>sample[n+1]노래의 에너지를 측정하기위한 기초 메커니즘으로 이것을 사용하여 아주 잘 작동 하는 지점 입니다. 볼륨 레벨에 만족하는 마법 번호를 검색하십시오.
Kaslai

3
나는 참조를 위해 실제로 소리 지르는 소리에 관한 첫 번째 명령의 샘플 출력을보고 싶습니다.
Alvin Wong

3
설명 된 사용법 (자동으로 시작 + 몇 분마다 실행)의 경우 cron 작업이 올바른 도구입니다. init script + bash loop + sleep을 사용하는 것보다 설정이 훨씬 간단하고 강력합니다.
m000

131

Pure Data 로 수행 할 수있는 방법은 다음과 같습니다 .

퓨어 데이터를 이용한 어린이 소리 예방

메트로 는 메트로놈이며 "메트로 100"은 100ms마다 계속 두드리고 있습니다.

오디오는 adc ~에서 나오고 볼륨은 env ~로 계산됩니다. "pd dsp 0"은 DSP를 뱅킹하면 끄고 "pd dsp 1"은 DSP를 켭니다. "shell"은 쉘에서 전달 된 명령을 실행합니다. Linux xrandr API를 사용하여 밝기를 X로 설정합니다. Wayland에 맞게 조정해야합니다.

보시다시피 유예 기간 및 잠금은 오디오 코드보다 많은 공간을 차지합니다.

링 버퍼 및 / 또는 이동 평균을 사용하여 솔루션을 만드는 것이 sox. 따라서 Pure Data를 사용하는 것이 좋지 않다고 생각합니다. 그러나 화면 블랭킹 자체와 잠금은 데이터 흐름 패러다임과 맞지 않습니다.

PD 파일은 gist.github.com : ysangkok-kidsyell.pd에 있습니다.


11
아주 좋아요! 이 기술을 사용하여 반응 속도가 매우 빨라질 수 있습니다. 1 분에 걸친 평균 사운드 레벨을 추적 한 다음 기준선으로 사용하여 아이들이 기준선보다 20dB 이상 올라갈 때 트리거됩니다. 그런 다음 주변 소음 수준에 따라 자동으로 조정됩니다.
Hans-Christoph Steiner

1
그렇습니다. @ Hans-ChristophSteiner가 말이됩니다. 그러나 어떤 식 으로든 주변 소음 수준으로 인해 아이들이 전체 소음의 작은 비율을 구성하기 때문에 실제로 소리를 크게 낼 필요는 없습니까? 물론 기존 노이즈가 흰색 또는 분홍색이거나 그렇지 않은 경우에만 적용됩니다.
야누스 트롤 슨

4
그것은 평소보다 조용한 있다면 항상 주위 레벨 이상 20dB 될 것이기 때문에, 주말 아침처럼, 다음, 그것은 더 민감 할 것
한스 - 크리스토프 슈타이너

이것은 확장 PD입니까?
nullpotent

@iccthedral : pd-extended를 사용하여 만들었지 만 pd-extended 특정 구문을 사용했는지는 알 수 없습니다.
야누스 트롤 슨

103

Thomer M. Gil의 "사운드 / 오디오 감지 방법"을 확인하십시오 .

기본적으로을 사용하여 사운드 진폭을 확인하는 것보다 5 초마다 사운드를 기록하고 sox스크립트를 트리거할지 여부를 결정합니다. ruby자녀에게 대본을 쉽게 적용 할 수 있다고 생각합니다 ! 또는 그가 제공 한 Python 스크립트 (PyAudio 사용)를 해킹 할 수도 있습니다.


5
탐지를 피하는 5 초 미만의 폭발은 어떻습니까?
RhysW

53

다음과 같은 방법으로 마이크에서 정보를 얻을 수 있습니다.

arecord -d1 /dev/null -vvv

다음과 같은 설정으로 약간 재생해야 할 수도 있습니다.

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

거기서부터 출력을 파싱하는 것은 간단합니다.


44

이것은 내가 본 가장 재미있는 질문 중 하나입니다. 그런 훌륭한 답변 에 대해 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

7
/etc/rc4.d/S99rc.local에 줄을 추가 하여이 실행을 시작한 다음 입력 마이크를 증폭되지 않은 상태에서 100 %로 변경하면 tty3으로 넘어갈 수 있습니다 (잠자기 전에 뒤로 건너 뛸 수 있음) Ctrl + Alt + F7)로 넘어 가고 키보드가 너무 커서 터미널을 열 수없는 경우 sudo killall too_loud를 실행하고 Ctrl + Alt + F1을 실행 한 다음 로그인하십시오.)
Alexx Roche

41

C 또는 C ++ 솔루션을위한 2 센트 : 아마도 가장 효과적인 방법은 아니지만 Linux에서는 ALSA API (Linux의 내장 오디오 처리 라이브러리)를 사용하고 수치 기술 (예 : 평균 사운드 계산)을 사용할 수 있습니다 소음 수준을 얻습니다.

그런 다음 무한 루프로 확인할 수 있으며 사전 설정된 임계 값보다 큰 경우 X11 라이브러리 를 사용하여 몇 초 동안 화면을 끄거나 (아주 우아하지만 작동하지는 않음)을 chvt사용 하여 명령을 호출 할 수 system("chvt 3; sleep 15; chvt 7 ");있습니다.


2
명령을 사용하면 다른 것을 고려할 것 chvt입니다. ArchWiki 는 좋은 예가 있습니다.
AD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.