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

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

chvt 3;  sleep 15;  chvt 7

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

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



답변

사용 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에 따라 다름)에 추가하는 것입니다.


답변

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에 있습니다.


답변

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

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


답변

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

arecord -d1 /dev/null -vvv

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

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

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


답변

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

답변

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

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