Saya sedang menulis skrip yang menggunakan sox untuk merekam saya berbicara. Sekarang saya perlu sox untuk menunggu sampai mendeteksi suara sebelum mulai merekam, dan saya sudah mengetahuinya. Tapi saya juga perlu sox untuk keluar setelah ada keheningan selama setidaknya 3 detik. Seperti sekarang, saya harus secara manual membunuh sox begitu saya selesai berbicara, kalau tidak sox hanya menunggu lagi sampai saya berbicara lagi, menambahkan ke file output (Bukan itu yang saya inginkan). Berikut adalah perintah untuk merekam yang saya gunakan sekarang:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
Sekali lagi, hanya untuk memperjelas, Sox harus menunggu sampai saya mulai berbicara, dan kemudian merekam sampai saya berhenti berbicara, maka program sox harus berhenti.
Saya tweak ide-ide di atas lagi. Ini merekam selamanya, merekam semua suara sampai (kira-kira) satu detik keheningan ditemui. Kemudian:
(Membuat repeater gema kecil UHF / 2 meter sangat praktis)
sumber
Saya menemukan semacam cara goyah yang memecahkan masalah ini.
Saya perhatikan bahwa ketika keheningan terdeteksi, sox secara alami tidak akan menambahkan apa pun pada file sampai terdengar lebih banyak suara. Jadi saya memutuskan untuk mencoba dan memanfaatkan fakta ini.
Pertama-tama, saya memulai perekam suara sox di latar belakang:
Selanjutnya saya mendapatkan PID dari proses rekaman dengan:
p=$!
Lalu saya memberikan proses rekaman sebentar untuk menyelesaikan memulai, dan kemudian menunggu sampai file mulai tumbuh.
Setelah loop ini putus, itu berarti bahwa suara telah terdeteksi. Jadi sekarang saya membuat loop lain untuk menunggu sampai data berhenti ditambahkan ke file (Ini akan terjadi setelah sox mendeteksi keheningan lagi).
Sekarang saya hanya perlu berhenti
rec
:Dan itu saja. Berikut ini skrip yang lengkap:
Sekarang saya lebih suka cara yang lebih baik dan lebih stabil untuk melakukan ini, tetapi ini harus bekerja untuk saat ini.
sumber
Ini mendengarkan selamanya, hanya merekam suara terakhir sampai mendengar satu detik hening, kemudian menulis file, cap waktu, dan me-restart:
sumber
while true
loop