Mikrofonun belirli bir eşiğin üzerinde herhangi bir ses alıp almadığını yarım saniyeden daha kısa sürede söyleyecek bir araç arıyorum. (Daha sonra Ana kanalı amixer gibi başka bir komut satırı aracıyla susturmayı planlıyorum.)
Mikrofonun belirli bir eşiğin üzerinde herhangi bir ses alıp almadığını yarım saniyeden daha kısa sürede söyleyecek bir araç arıyorum. (Daha sonra Ana kanalı amixer gibi başka bir komut satırı aracıyla susturmayı planlıyorum.)
Yanıtlar:
Bu çözüm tekrar tekrar diske yazmaktan kaçınacaktır ve en kötü durumda yarım saniyeden daha az istenen yerine bir saniye sürse de, denedikten sonra yeterince hızlı buldum. İşte, kullandığım iki komut dosyası:
./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"
Çok zarif, ama işe yarıyor.
Not: Daha kademeli bir şey istiyorsanız, şöyle bir şey ekleyin:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
susturmak için ve
for i in `seq 0 80`; do
amixer set Master $i
done
yoksaymak için.
Python betiği ve TALKING_PERIOD içermeyen sürüm, DOWN_SOUND_PERC düzeyinde kaç saniye sesin çıkacağını ayarlayan UP_SOUND_PERC seviyesine gider.
#!/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
tamam
Mikrofon seviyesini görmenizi sağlayan pavumeter adlı bir araç var, Pavumeter'in açık yakalama arayüzü,
Ardından pavucontrol'ü kullanarak yakalama ses seviyesini ayarlayın, Pavucontrol'de giriş cihazlarına gidin ve mikrofon hassasiyetini ayarlayın.
Düzenleme: R4v0 tarafından bash betiğinde, kod içinde yapılır.
Edit2: Her gürültü olduğunda ses seviyesini yükseltmek istedim, bu yüzden daha az olmaktan daha fazla düzenledim ve konuşma peroidini iptal ettim
if (( $(echo "$nmb < 0.3" |bc -l) )); then
Ses seviyesini çevredeki gürültü seviyesine göre artırmak için bash betiğini değiştirdim.
Minimum_volume, maximum_volume [değer yüzde olarak] değerini değiştirebilirsiniz.
To_Do: artış henüz test edilmedi. sox ve bc'nin kurulması gerekir.
#!/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