답변:
이 솔루션은 디스크에 반복적으로 쓰는 것을 피할 수 있으며 최악의 경우 원하는 0.5 초가 아닌 1 초가 걸리더라도 시도한 후에도 충분히 빠릅니다. 그래서 내가 사용하는 두 개의 스크립트는 다음과 같습니다.
./ 감지 :
while true; do
arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>\
&1 | grep "Maximum amplitude" | cut -d ':' -f 2 | ./check.py
if [ $? -eq 0 ] ; then
amixer set Master 0
else
amixer set Master 80
fi
done
./check.py :
#!/usr/bin/env python
import sys
number = 0.0
thing="NO"
line = sys.stdin.readline()
thing = line.strip()
number = float(thing)
if number < 0.15:
raise Exception,"Below threshold"
거의 우아하지 않지만 작동합니다.
참고 :보다 점진적인 것을 원하면 다음과 같이 추가하십시오.
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
음소거 및
for i in `seq 0 80`; do
amixer set Master $i
done
음소거 해제
python 스크립트와 TALKING_PERIOD가없는 버전은 DOWN_SOUND_PERC 수준에서 몇 초 동안 소리가 나는지를 설정 한 다음 UP_SOUND_PERC 수준으로갑니다.
#!/bin/bash
TALKING_PERIOD=16
UP_SOUND_PERC=65
DOWN_SOUND_PERC=45
counter=0
while true; do
echo "counter: " $counter
if [ "$counter" -eq 0 ]; then
nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)
echo "nmb: " $nmb
if (( $(echo "$nmb > 0.3" |bc -l) )); then
echo "ticho"
amixer -D pulse sset Master 45%
counter=$TALKING_PERIOD
else
echo "hlasno"
amixer -D pulse sset Master 65%
fi
fi
if [[ $counter -gt 0 ]]; then
((counter--))
fi
sleep 1
끝난
pavumeter라는 도구가 있는데, 마이크 레벨, pavumeter의 Open capture interface,
그런 다음 pavucontrol을 사용하여 캡처 사운드 레벨을 조정하십시오. pavucontrol에서 입력 장치로 이동하여 마이크 감도를 조정하십시오.
편집 : R4v0의 bash 스크립트에서 done은 코드 내부에 있습니다.
Edit2 : 소음이있을 때마다 볼륨을 높이고 싶었습니다.
if (( $(echo "$nmb < 0.3" |bc -l) )); then
주변 소음 수준에 따라 볼륨을 높이기 위해 bash 스크립트를 수정했습니다.
minimum_volume, maximum_volume [값은 퍼센트]를 변경할 수 있습니다.
To_Do : 증분이 아직 테스트되지 않았습니다. sox와 bc가 설치되어 있어야합니다.
#!/bin/bash
minimum_volume=20
maximum_volume=60
increment=10
counter=0
while true; do
# echo "counter: " $counter
nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)
echo "nmb: " $nmb
if (( $(echo "$nmb <= 0.1" |bc -l) )); then
amixer -D pulse sset Master $minimum_volume%
else
if (( $(echo "$nmb <= 0.2" |bc -l) )); then
amixer -D pulse sset Master $(($minimum_volume+ $increment))%
else
if (( $(echo "$nmb <= 0.3" |bc -l) )); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.4" |bc -l) & maximum_volume>=40)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.5" |bc -l) & maximum_volume>=50)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.6" |bc -l) & maximum_volume>=60)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.7" |bc -l) & maximum_volume>=70)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.8" |bc -l) & maximum_volume>=80)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
if (( $(echo "$nmb <= 0.9" |bc -l) & maximum_volume>=90)); then
amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
else
amixer -D pulse sset Master $(($maximum_volume+ $minimum_volume))%
fi
fi
fi
fi
fi
fi
fi
fi
fi
sleep 1
done
while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done