Gunakan sox
dari SoX untuk menganalisis sampel audio pendek:
sox -t .wav "|arecord -d 2" -n stat
Dengan -t .wav
kami tentukan, kami memproses jenis wav, "|arecord -d 2"
menjalankan arecord
program selama dua detik, -n
mengeluarkan ke file nol dan dengan stat
kami menentukan kami ingin statistik.
Output dari perintah ini, pada sistem saya dengan beberapa pidato latar belakang, adalah:
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read: 16000
Length (seconds): 2.000000
Scaled by: 2147483647.0
Maximum amplitude: 0.312500
Minimum amplitude: -0.421875
Midline amplitude: -0.054688
Mean norm: 0.046831
Mean amplitude: -0.000044
RMS amplitude: 0.068383
Maximum delta: 0.414063
Minimum delta: 0.000000
Mean delta: 0.021912
RMS delta: 0.036752
Rough frequency: 684
Volume adjustment: 2.370
Amplitudo maksimum kemudian dapat diekstraksi melalui:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Kami grep
untuk baris yang kami inginkan, gunakan tr
untuk memangkas karakter spasi dan kemudian cut
oleh :
karakter dan mengambil bagian kedua yang memberi kita 0.068383
dalam contoh ini. Seperti yang disarankan oleh komentar, RMS adalah ukuran energi yang lebih baik daripada amplitudo maksimum.
Anda akhirnya dapat menggunakan bc
pada hasil untuk membandingkan nilai floating-point dari baris perintah:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Jika Anda membuat lingkaran (lihat contoh Bash ) yang memanggil sleep selama 1 menit, menguji volume, dan kemudian mengulanginya, Anda bisa membiarkannya tetap berjalan di latar belakang. Langkah terakhir adalah menambahkannya ke skrip init atau file layanan (tergantung pada OS / distro Anda), sehingga Anda bahkan tidak harus menjalankannya secara manual.