Tôi tìm thấy một cách run rẩy mà giải quyết vấn đề này.
Tôi nhận thấy rằng khi phát hiện sự im lặng, sox sẽ không tự động thêm bất cứ thứ gì vào tệp cho đến khi nghe thấy nhiều âm thanh hơn. Vì vậy, tôi quyết định tôi có thể thử và tận dụng lợi thế này.
Trước hết, tôi khởi động máy ghi âm của sox trong nền:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
Tiếp theo tôi nhận được PID của quá trình ghi với: p=$!
Sau đó, tôi cho quá trình ghi âm một giây để kết thúc khởi động, và sau đó đợi cho đến khi tệp bắt đầu phát triển.
ngủ 1
cho đến khi ["$ var1"! = "$ var2"]; làm
var1 = `du" /tmp/recply.flac "`
ngủ 1
var2 = `du" /tmp/recply.flac "`
làm xong
Sau khi vòng lặp này bị hỏng, điều đó có nghĩa là âm thanh đã được phát hiện. Vì vậy, bây giờ tôi tạo một vòng lặp khác để đợi cho đến khi dữ liệu dừng được thêm vào tệp (Điều này sẽ xảy ra khi sox phát hiện sự im lặng một lần nữa).
tiếng vang "Phát hiện âm thanh"
cho đến khi ["$ var1" == "$ var2"]; làm
var1 = `du" /tmp/recply.flac "`
ngủ 0,5
var2 = `du" /tmp/recply.flac "`
làm xong
Bây giờ tôi chỉ cần bỏ rec
:
tiếng vang "Phát hiện sự im lặng"
giết $ p
Và đó là nó. Đây là kịch bản hoàn thành:
rec /tmp/recply.flac tỷ lệ 32k im lặng 1 0,1 3% -1 3.0 3% &
p = $!
ngủ 1
cho đến khi ["$ var1"! = "$ var2"]; làm
var1 = `du" /tmp/recply.flac "`
ngủ 1
var2 = `du" /tmp/recply.flac "`
làm xong
tiếng vang "Phát hiện âm thanh"
cho đến khi ["$ var1" == "$ var2"]; làm
var1 = `du" /tmp/recply.flac "`
ngủ 0,5
var2 = `du" /tmp/recply.flac "`
làm xong
tiếng vang "Phát hiện sự im lặng"
giết $ p
Bây giờ tôi muốn một cách tốt hơn, ổn định hơn để làm điều này, nhưng điều này sẽ phải làm việc ngay bây giờ.