Sử dụng sox
từ SoX để phân tích một mẫu âm thanh ngắn:
sox -t .wav "|arecord -d 2" -n stat
Với -t .wav
chúng tôi chỉ định, chúng tôi xử lý loại wav, "|arecord -d 2"
thực thi arecord
chương trình trong hai giây, -n
xuất ra tệp null và với stat
chúng tôi chỉ định chúng tôi muốn thống kê.
Đầu ra của lệnh này, trên hệ thống của tôi với một số lời nói nền, là:
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
Biên độ tối đa sau đó có thể được trích xuất thông qua:
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
Chúng tôi grep
cho dòng chúng tôi muốn, sử dụng tr
để cắt bớt các ký tự khoảng trắng và sau cut
đó theo :
ký tự và lấy phần thứ hai cho chúng tôi 0.068383
trong ví dụ này. Theo đề xuất của các bình luận, RMS là thước đo năng lượng tốt hơn biên độ cực đại.
Cuối cùng, bạn có thể sử dụng bc
kết quả để so sánh các giá trị dấu phẩy động từ dòng lệnh:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
Nếu bạn xây dựng một vòng lặp (xem ví dụ Bash ) gọi chế độ ngủ trong 1 phút, kiểm tra âm lượng và sau đó lặp lại, bạn có thể để nó chạy ở chế độ nền. Bước cuối cùng là thêm nó vào tập lệnh init hoặc tệp dịch vụ (tùy thuộc vào hệ điều hành / bản phân phối của bạn), sao cho bạn thậm chí không phải khởi chạy thủ công.