Tôi đang tìm kiếm một công cụ sẽ cho tôi biết, trong chưa đầy nửa giây, nếu micrô phát ra bất kỳ âm thanh nào vượt quá ngưỡng nhất định. (Tôi dự định tắt tiếng kênh Master bằng một công cụ dòng lệnh khác, như amixer.)
Tôi đang tìm kiếm một công cụ sẽ cho tôi biết, trong chưa đầy nửa giây, nếu micrô phát ra bất kỳ âm thanh nào vượt quá ngưỡng nhất định. (Tôi dự định tắt tiếng kênh Master bằng một công cụ dòng lệnh khác, như amixer.)
Câu trả lời:
Giải pháp này sẽ tránh ghi liên tục vào đĩa và mặc dù trong trường hợp xấu nhất chỉ mất một giây thay vì mong muốn chưa đến nửa giây, tôi thấy nó đủ nhanh sau khi thử. Vì vậy, đây là hai kịch bản tôi sử dụng:
./phát hiện:
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"
Khó thanh lịch, nhưng nó hoạt động.
Lưu ý: Nếu bạn muốn một thứ dần dần, hãy thêm một cái gì đó như thế này:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
để tắt tiếng và
for i in `seq 0 80`; do
amixer set Master $i
done
để tắt tiếng.
Chỉ là phiên bản không có tập lệnh python và TALKING_PERIOD, sẽ thiết lập bao nhiêu giây âm thanh sẽ ở mức DOWN_SOUND_PERC, sau đó chuyển sang cấp 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
làm xong
Có một công cụ gọi là pavumeter cho phép bạn xem cấp độ micrô, Giao diện chụp mở của pavumeter,
Sau đó điều chỉnh mức âm thanh thu bằng pavucontrol, Trong pavucontrol, đi đến các thiết bị đầu vào và điều chỉnh độ nhạy của micrô.
Chỉnh sửa: Trong tập lệnh bash của R4v0, được thực hiện bên trong mã.
Edit2: Tôi muốn tăng âm lượng mỗi khi có tiếng ồn, vì vậy tôi chỉ chỉnh sửa nhiều hơn là ít hơn và hủy bỏ peroid nói chuyện
if (( $(echo "$nmb < 0.3" |bc -l) )); then
Tôi đã sửa đổi tập lệnh bash để tăng âm lượng theo mức độ tiếng ồn xung quanh.
Bạn có thể thay đổi minim_volume, Maximum_volume [giá trị tính bằng phần trăm].
To_Do: gia tăng chưa được thử nghiệm. sox và bc cần phải được cài đặt.
#!/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