Saya mencari alat yang akan memberi tahu saya, dalam waktu kurang dari setengah detik, jika mikrofon mengambil suara di atas ambang tertentu. (Saya berencana untuk membisukan saluran Master dengan alat baris perintah lain, seperti amixer.)
Saya mencari alat yang akan memberi tahu saya, dalam waktu kurang dari setengah detik, jika mikrofon mengambil suara di atas ambang tertentu. (Saya berencana untuk membisukan saluran Master dengan alat baris perintah lain, seperti amixer.)
Jawaban:
Solusi ini akan menghindari penulisan berulang kali ke disk, dan meskipun dalam kasus terburuk membutuhkan satu detik daripada yang diinginkan kurang dari setengah detik, saya merasa cukup cepat setelah mencobanya. Jadi, inilah dua skrip yang saya gunakan:
./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"
Agak elegan, tapi berhasil.
Catatan: Jika Anda menginginkan hal yang lebih bertahap, tambahkan sesuatu seperti ini:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
untuk mematikan dan
for i in `seq 0 80`; do
amixer set Master $i
done
untuk mengaktifkan suara.
Hanya versi tanpa skrip python dan TALKING_PERIOD, yang menetapkan berapa detik suara akan terdengar di tingkat DOWN_SOUND_PERC, kemudian naik ke tingkat 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
selesai
Ada alat yang disebut pavumeter yang memungkinkan Anda melihat level mikrofon, Open capture interface of pavumeter,
Kemudian sesuaikan tingkat pengambilan suara menggunakan pavucontrol, Dalam pavucontrol, buka perangkat input, dan sesuaikan sensitivitas mikrofon.
Sunting: Di skrip bash oleh R4v0, yang dilakukan adalah kode di dalamnya.
Sunting2: Saya ingin menaikkan volume setiap kali ada suara, jadi saya hanya mengedit lebih dari menjadi kurang dari dan membatalkan berbicara peroid
if (( $(echo "$nmb < 0.3" |bc -l) )); then
Saya memodifikasi skrip bash untuk menambah volume sesuai dengan tingkat kebisingan di sekitarnya.
Anda dapat mengubah minimum_volume, maksimum_volume [nilai dalam persen].
To_Do: increment belum diuji. sox dan bc perlu diinstal.
#!/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