내 아이들 (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 ");
있습니다.