Kết thúc ghi sox sau khi phát hiện sự im lặng


16

Tôi đang viết một kịch bản sử dụng sox để ghi lại tôi nói chuyện. Bây giờ tôi cần sox để đợi cho đến khi nó phát hiện ra âm thanh trước khi nó bắt đầu ghi âm, và tôi đã tìm ra điều đó. Nhưng tôi cũng cần sox để thoát khi đã im lặng ít nhất 3 giây. Như bây giờ, tôi phải tự giết sox một khi tôi nói xong, nếu không thì sox chỉ đợi một lần nữa cho đến khi tôi nói thêm, thêm vào tệp đầu ra (Đó không phải là điều tôi muốn). Đây là lệnh để ghi tôi đang sử dụng:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%

Một lần nữa, để rõ ràng, Sox nên đợi cho đến khi tôi bắt đầu nói, và sau đó ghi âm cho đến khi tôi ngừng nói, thì chương trình sox sẽ thoát.

Câu trả lời:


13

Xóa dấu âm khỏi lệnh ban đầu của bạn:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%

Khi "số đếm bên dưới" âm, lệnh im lặng sẽ cắt tất cả các khoảng lặng từ giữa tệp. Khi nó tích cực, nó cắt sự im lặng từ cuối tập tin.


1
Đó là một giải pháp đơn giản hơn nhiều so với giải pháp tôi nghĩ ra, LOL!
Isaac

3

Tôi điều chỉnh các ý tưởng trên một số chi tiết. Nó ghi lại mãi mãi, ghi lại tất cả tiếng ồn cho đến khi (khoảng) một giây im lặng gặp phải. Sau đó:

  • Đảm bảo hai thư mục con được tạo
  • Tính toán hai máy quang phổ của bản ghi - một trước khi chuẩn hóa và một sau và ghi vào các thư mục được đánh dấu.
  • Viết một tệp được chuẩn hóa thành một tệp vào thư mục được đánh dấu dữ liệu.
  • Phát lại tệp đã chuẩn hóa, với hai tệp .ogg chirp (quay lại qua CB Radio được điều khiển bằng giọng nói)

(Làm cho bộ lặp tiếng vang UHF / 2 mét rất nhỏ)

#! / bin / bash
trong khi sự thật; làm
  rec đệm.ogg im lặng 1 0,1 5% 1 1,0 5%
  NGÀY = `ngày +% Y% m% d% H% M% S`
  DPATH = `ngày +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Đổi tên tệp bộ đệm thành $ DATE
  sox buffer.ogg -n Spectrogram -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg Normbuffer.ogg đạt được -n -2
  sox Normbuffer.ogg -n Spectrogram -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv Normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  chơi pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
làm xong

2

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ờ.


1

Điều này nghe mãi mãi, chỉ ghi lại những âm thanh cuối cùng cho đến khi nó nghe thấy một giây im lặng, sau đó ghi tệp, đánh dấu thời gian và khởi động lại:

#!/bin/bash
/usr/bin/sox -t alsa default /home/default/working/recording.wav silence 1 0.1 5% 1 1.0 5%
DATE=$(date +%Y%m%d%H%M%S)
mv /home/default/working/recording.wav /home/default/waiting/$DATE.recording.wav
/home/default/startrecord.sh

2
Bash có while truecác vòng lặp
Michael Mrozek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.