Sessizlik algılandığında sox kaydını sonlandır


16

Konuşmamı kaydetmek için sox kullanan bir senaryo yazıyorum. Şimdi kayıt yapmaya başlamadan önce sesi algılayana kadar beklemek için sox'a ihtiyacım var ve bunu anladım. Ama aynı zamanda sox gerek çıkışında en az 3 saniye boyunca sessizlik olmuştur kez. Şimdi olduğu gibi, konuşmayı bitirdikten sonra sox'u manuel olarak öldürmek zorundayım, aksi takdirde sox, biraz daha konuşana kadar çıktı dosyasına ekleyerek tekrar bekler (İstediğim bu değil). İşte şimdi kullandığım kayıt için komut:

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

Yine, net olmak gerekirse, Sox konuşmaya başlayana kadar beklemeli ve sonra konuşmayı bırakana kadar kayıt yapmalı, o zaman sox programı sonlandırılmalıdır.

Yanıtlar:


13

Negatif işaretini orijinal komutunuzdan kaldırın:

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

"Aşağıdaki sayım" negatif olduğunda, sessizlik komutu tüm sessizlikleri dosyanın ortasından keser. Pozitif olduğunda, dosyanın sonundan sessizliği keser.


1
Bu benim bulduğumdan çok daha basit bir çözüm, LOL!
Isaac

3

Yukarıdaki fikirleri biraz daha değiştirdim. Sonsuza kadar kaydeder, (kabaca) bir saniyelik sessizliğe rastlanana kadar tüm gürültüyü kaydeder. Sonra:

  • İki alt dizinin oluşturulmasını sağlar
  • Kaydın iki spektrografını hesaplar - normalleştirmeden önce ve sonra kayıt, ve tarih damgalı klasörlere yazar.
  • Normalleştirilmiş olanı tarih damgalı bir klasöre bir dosyaya yazar.
  • Normalleştirilmiş dosyayı iki cıvıltı .ogg dosyasıyla çalar (sesle çalışan CB Radyo üzerinden geri)

(Çok az bir UHF / 2 metre yankı tekrarlayıcı yapar)

#! / Bin / bash
gerçekken; yapmak
  rec buffer.ogg sessizlik 1 0.1 5% 1 1.0 5%
  TARİH = `tarih +% Y% m% d% H% M% S`
  DPATH = `tarih +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Arabellek dosyasını $ DATE olarak yeniden adlandırıyor
  sox buffer.ogg -n spektrogram -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg normbuffer.ogg kazancı -n -2
  sox normbuffer.ogg -n spektrogram -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg oynayın 
tamam

2

Bu sorunu çözen bir tür titrek yol buldum.

Sessizlik algılandığında, sox'un doğal olarak daha fazla ses duyana kadar dosyaya daha fazla bir şey eklemeyeceğini fark ettim. Bu yüzden bu gerçeği değerlendirmeye karar verdim.

Her şeyden önce, arka planda sox'un ses kaydedicisini başlatıyorum:

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

Sonra ile kayıt sürecinin PID olsun: p=$!

Sonra kayıt işlemine başlamayı bitirmek için bir saniye veriyorum ve sonra dosya büyümeye başlayana kadar bekliyorum.

uyku 1
kadar ["$ var1"! = "$ var2"]; yapmak
    var1 = "du" /tmp/recording.flac "`
    uyku 1
    var2 = "du" /tmp/recording.flac "`
tamam

Bu döngü bozulduktan sonra ses algılanır. Şimdi veri dosyaya eklenmesini durdurmak için beklemek için başka bir döngü oluşturmak (Bu sox bir kez daha sessizlik algıladığında olacak).

echo "Ses Algılandı"
kadar ["$ var1" == "$ var2"]; yapmak
    var1 = "du" /tmp/recording.flac "`
    uyku 0.5
    var2 = "du" /tmp/recording.flac "`
tamam

Şimdi sadece bırakmam gerek rec:

echo "Sessizlik Tespit Edildi"
$ p öldür

Ve bu kadar. Tamamlanan komut dosyası:

rec /tmp/recording.flac oranı 32k sessizlik 1 0,1 3% -1 3,0 3% &
p = $!
uyku 1
kadar ["$ var1"! = "$ var2"]; yapmak
    var1 = "du" /tmp/recording.flac "`
    uyku 1
    var2 = "du" /tmp/recording.flac "`
tamam
echo "Ses Algılandı"
kadar ["$ var1" == "$ var2"]; yapmak
    var1 = "du" /tmp/recording.flac "`
    uyku 0.5
    var2 = "du" /tmp/recording.flac "`
tamam
echo "Sessizlik Tespit Edildi"
$ p öldür

Şimdi bunu yapmanın daha iyi, daha istikrarlı bir yolunu tercih ederim, ama bunun şimdilik çalışması gerekecek.


1

Bu sonsuza kadar dinler, bir saniye sessizlik duyana kadar yalnızca son sesleri kaydeder, ardından dosyayı yazar, zaman damgası yazar ve yeniden başlatır:

#!/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 while truedöngüler var
Michael Mrozek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.