ฉันกำลังมองหาเครื่องมือที่จะบอกฉันภายในเวลาไม่ถึงครึ่งวินาทีหากไมโครโฟนกำลังรับเสียงใด ๆ ที่สูงกว่าระดับที่กำหนดไว้ (ฉันวางแผนที่จะปิดเสียงช่อง Master ด้วยเครื่องมือบรรทัดคำสั่งอื่นเช่น amixer)
ฉันกำลังมองหาเครื่องมือที่จะบอกฉันภายในเวลาไม่ถึงครึ่งวินาทีหากไมโครโฟนกำลังรับเสียงใด ๆ ที่สูงกว่าระดับที่กำหนดไว้ (ฉันวางแผนที่จะปิดเสียงช่อง Master ด้วยเครื่องมือบรรทัดคำสั่งอื่นเช่น amixer)
คำตอบ:
วิธีนี้จะหลีกเลี่ยงการเขียนซ้ำ ๆ ลงบนดิสก์และแม้ว่าในกรณีที่เลวร้ายที่สุดใช้เวลาหนึ่งวินาทีแทนที่จะต้องการน้อยกว่าครึ่งวินาทีฉันก็พบว่ามันเร็วพอหลังจากลองแล้ว ดังนั้นนี่คือสองสคริปต์ที่ฉันใช้:
./detect:
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
จากนั้นปรับระดับเสียงการจับภาพโดยใช้ pavucontrol ใน pavucontrol ไปที่อุปกรณ์อินพุตและปรับความไวของไมโครโฟน
แก้ไข: ในสคริปต์ทุบตีโดย R4v0 เสร็จแล้วจะอยู่ในรหัส
แก้ไข 2: ฉันต้องการเพิ่มระดับเสียงในแต่ละครั้งที่มีเสียงรบกวนดังนั้นฉันเพิ่งแก้ไขมากกว่าจะน้อยกว่าและยกเลิกการพูดถึง peroid
if (( $(echo "$nmb < 0.3" |bc -l) )); then
ฉันแก้ไขสคริปต์ทุบตีเพื่อเพิ่มระดับเสียงตามระดับเสียงโดยรอบ
คุณสามารถเปลี่ยน 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