Akhiri perekaman sox setelah diam terdeteksi

16

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.

Ishak
sumber

Jawaban:

13

Hapus tanda negatif dari perintah awal Anda:

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

Ketika "jumlah di bawah" negatif, perintah keheningan akan memangkas semua keheningan dari tengah file. Ketika positif, ini memangkas keheningan dari akhir file.

meetar
sumber
1
Itu adalah solusi yang jauh lebih sederhana daripada yang saya buat, LOL!
Isaac
3

Saya tweak ide-ide di atas lagi. Ini merekam selamanya, merekam semua suara sampai (kira-kira) satu detik keheningan ditemui. Kemudian:

  • Pastikan dua subdirektori dibuat
  • Menghitung dua spektrograf rekaman - satu sebelum normalisasi, dan satu setelah, dan menulis ke folder yang dicantumkan.
  • Menulis yang dinormalisasi ke file ke folder datestamped.
  • Memutar file yang dinormalisasi kembali, dengan dua file chirp .ogg (kembali melalui Radio CB yang dioperasikan dengan suara)

(Membuat repeater gema kecil UHF / 2 meter sangat praktis)

#! / bin / bash
sementara benar; melakukan
  rec buffer.ogg silence 1 0.1 5% 1 1.0 5%
  DATE = `date +% Y% m% d% H% M% S`
  DPATH = `date +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Mengganti nama file buffer menjadi $ DATE
  sox buffer.ogg -n spectrogram -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg gain normbuffer.ogg -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
  mainkan pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
selesai
Nigel Weeks
sumber
2

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:

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

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.

tidur 1
sampai ["$ var1"! = "$ var2"]; melakukan
    var1 = `du" /tmp/recording.flac "`
    tidur 1
    var2 = `du" /tmp/recording.flac "`
selesai

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

gema "Terdeteksi Suara"
sampai ["$ var1" == "$ var2"]; melakukan
    var1 = `du" /tmp/recording.flac "`
    tidur 0,5
    var2 = `du" /tmp/recording.flac "`
selesai

Sekarang saya hanya perlu berhenti rec:

gema "Diam Terdeteksi"
bunuh $ p

Dan itu saja. Berikut ini skrip yang lengkap:

rec /tmp/recording.flac rate 32k diam 1 0.1 3% -1 3.0 3% &
p = $!
tidur 1
sampai ["$ var1"! = "$ var2"]; melakukan
    var1 = `du" /tmp/recording.flac "`
    tidur 1
    var2 = `du" /tmp/recording.flac "`
selesai
gema "Terdeteksi Suara"
sampai ["$ var1" == "$ var2"]; melakukan
    var1 = `du" /tmp/recording.flac "`
    tidur 0,5
    var2 = `du" /tmp/recording.flac "`
selesai
gema "Diam Terdeteksi"
bunuh $ p

Sekarang saya lebih suka cara yang lebih baik dan lebih stabil untuk melakukan ini, tetapi ini harus bekerja untuk saat ini.

Ishak
sumber
1

Ini mendengarkan selamanya, hanya merekam suara terakhir sampai mendengar satu detik hening, kemudian menulis file, cap waktu, dan me-restart:

#!/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
Jared Terrell
sumber
2
Bash memiliki while trueloop
Michael Mrozek