Sürekli olarak ses kaydetmek gerektiğinde en iyi yöntem sadece ortamda ses olduğunda kayıtı başlatmaktır. SoX sahip olduğu filtre özellikleri ile ortamdaki ses belli bir düzeyin (threshold) üzerine çıktığında kayıt yapmak üzere ayarlanabilir. Bunun için öncelikle sesin hangi eşiğin üzerine çıktığında kayıt yapılacağını tespit etmektir. SoX stat filtresi kaydın ses seviyesi hakkında istatistiksel bilgiler sunar. Aşağıdaki komutu çalıştırın ve istatistik çıktısındaki Minumum amplitude değerini izleyin. Bu değer, 1 saniyelik süre dilimleri içerisinde ortamda rastlanan ses şiddeti seviyesinin en küçük değerini verir. Bu değeri kullanarak ayarlayabileceğiniz bir amplitude değeri, kaydı başlatmak için eşik değeri olarak kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
pi@raspberry:~ $ sox -t alsa plughw:1 -n stat trim 0 00:00:01 : restart Maximum amplitude: 0.020538 Minimum amplitude: -0.019592 Midline amplitude: 0.000473 Mean norm: 0.002086 Mean amplitude: 0.000037 RMS amplitude: 0.002916 Maximum delta: 0.007935 Mean delta: 0.000086 RMS delta: 0.000158 Rough frequency: 414 Volume adjustment: 48.689 |
Yukarıdaki komut ile SoX 1 sn.’lik kayıt örnekleri alarak, bu süre zarfında rastlanan en yüksek, en düşük ve ortalama ses şiddeti gibi değerleri ekrana basmıştır. Ayrıca bu örneklemeler restart direktifi sayesinde, her saniye tekrarlanır. Kaydı sonlandırmak için Ctrl+C tuş bileşimini kullanabilirsiniz.
Aşağıdaki bash betiği temel olarak birer saniye ses örneği alarak, örnekteki sesin tanımlanan eşikten büyük olup olmadığına bakar ve eğer büyükse 5dk’lık bir kayıt başlatır. 5dk’lık kayıt bittiğinde ortamdaki ses düzeyini izlemeye devam ederek gerektiğinde kaydı yeniden başlatır. Eşik değeri tespit edildiğinde hem ekrana hem de /var/log/messages günlük dosyasına eşiğin geçildiğine ve kaydın başladığına dair bir mesaj yazar (logger). Betiği kaydetmek için nano editörünü kullanabilirsiniz. Kaydettikten sonra betiğe çalıştırma izni vermeyi unutmayın (chmod +x).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
pi@raspberry:~ $ nano otokayit.sh #!/bin/bash # # Raspberry Pi icin ayarlanabilir esik seviyeli # otomatik ses kaydedici script. # Script'in calisabilmesi icin ayarlayin: chmod +x ~/otokayit.sh to ESIK_DEGERI=0.014000 gurultu_karsilastir() { awk -v GURULTU=$1 -v ESIK_DEGERI=$2 'BEGIN {if (GURULTU > ESIK_DEGERI) exit 0; exit 1}' } while true ; do GURULTU=$(sox -t alsa plughw:1,0 -n stat trim 0 00:00:01 2>&1 > /dev/null | grep 'Maximum amplitude' | cut -d ':' -f 2 | tr -d ' ') if gurultu_karsilastir $GURULTU $ESIK_DEGERI; then logger -s "Gurultu esigi ($GURULTU/$ESIK_DEGERI): 5 dk. kayit baslayiyor." sox -c 1 -v 30 -t alsa plughw:1,0 $(date +%Y%m%d-%H%M%S).ogg trim 0 00:05:00 treble +10 fi done pi@raspberry:~ $ chmod 755 otokayit.sh |
Yukarıdaki betik temel olarak ortamdaki ses şiddetinin ayarlanan düzeyin üzerine çıktığı durumlarda herhangi bir işlevi yerine getirmek için de kullanılabilir. Bir alarmı tetiklemek, kameradan fotoğraf çekmek veya bir mail ya da sms göndermek için de kullanılabilir. Örneğin evde olmadığınız zamanlarda; kapınızın gözetleme deliğine yerleştirdiğiniz bir kamera, kapıya vurulduğunda ya da zile basıldığında kişinin fotoğrafını çekerek size mail atabilir. Ses şiddeti seviyesine bağlı tetiklemeyi kullanarak gerçekleştirebilecekleriniz hayal gücünüzle sınırlı.
Eşik değerini sağlıklı olarak belirleyebilmek için ortamdaki ses seviyesini bir süre izlemeniz ve eşik kabul edilebilecek değere karar vermeniz gerekir. Bunun için aşağıdaki betiği kullanabilirsiniz. Betik ortamdaki sesi 2 saniyelik sürelerle örnekleyerek, sesin en yüksek, en düşük ve ortalama değerlerini sürekli olarak ekrana basar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
pi@raspberry:~ $ nano ses_olcumle.sh BOS=' ' printf "Varsayılan ses giriş aygıtı dinleniyor...\n" printf "\n" printf " Max/Min/Midline Amplidudes (2sn)\n" printf " MAKS MIN MID\n" printf " -------- --------- ---------\n"; while true; do ORN=$(sox -t alsa plughw:1,0 -n stat trim 0 00:00:02 2>&1 > /dev/null) MAK=$(echo "$ORN" | grep 'Maximum amplitude'|cut -d ':' -f 2 | tr -d ' ') MIN=$(echo "$ORN" | grep 'Minimum amplitude' | cut -d ':' -f 2 | tr -d ' ') ORT=$(echo "$ORN" | grep 'Midline amplitude' | cut -d ':' -f 2 | tr -d ' ') printf "%s %s %s %s %s %s\n" "${BOS:${#MAK}}" $MAK "${BOS:${#MIN}}" $MIN "${ BOS:${#ORT}}" $ORT done |
Daha önceki örnekte (otokayit.sh) ses eşik seviyesi olarak Maximum amplitude değeri kontrol edilmekteydi. Genellikle negatif değerlerde olan Minimum amplitude değeri de kayıt tetiklemek için kullanılabilir. Ses ortamına göre Maximum, Minimum ve Midle line değerlerinden hangisini kullanacağınıza karar verebilirsiniz. Yukarıdaki betiğin ekran çıktısı aşağıdaki gibidir. Son üç kayıtta ortamdaki ses hacmi artırılmıştır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
pi@raspberry:~ $ chmod 755 ses_olcumle.sh pi@raspberry:~ $ ./ses_olcumle.sh Varsayılan ses giriş aygıtı dinleniyor... Max/Min/Midline Amplidudes (2sn) MAKS MIN MID -------- --------- --------- 0.015717 -0.014648 0.000534 0.016846 -0.015747 0.000549 0.016907 -0.014862 0.001022 0.016266 -0.014954 0.000656 0.021881 -0.023743 -0.000931 0.022400 -0.021790 0.000305 0.023438 -0.022217 0.000610 |
