Я шукаю інструмент, який підкаже мені менше ніж за півсекунди, якщо мікрофон сприймає якийсь звук вище певного порогу. (Я планую потім відключити головний канал за допомогою іншого інструмента командного рядка, наприклад, amixer.)
Я шукаю інструмент, який підкаже мені менше ніж за півсекунди, якщо мікрофон сприймає якийсь звук вище певного порогу. (Я планую потім відключити головний канал за допомогою іншого інструмента командного рядка, наприклад, 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, який дозволяє бачити рівень мікрофона, відкритий інтерфейс захоплення павуметра,
Потім відрегулюйте рівень звуку захоплення за допомогою pavucontrol, У pavucontrol перейдіть до пристроїв введення та налаштуйте чутливість мікрофона.
Редагувати: У сценарії bash від R4v0, зроблено всередині коду.
Edit2: Я хотів збільшувати гучність кожного разу, коли лунає шум, тому я просто редагував більше, ніж був меншим, і скасовував розмову з пероїдом
if (( $(echo "$nmb < 0.3" |bc -l) )); then
Я змінив скрипт bash для збільшення гучності відповідно до навколишнього рівня шуму.
Ви можете змінити мінімальний об'єм, максимальний об'єм [значення у відсотках].
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