無音が検出されたらソックスの録音を終了する


16

soxを使用して会話を記録するスクリプトを書いています。今、録音を開始する前に、soxが音を検出するまで待つ必要があり、それを把握しました。しかし、少なくとも3秒間無音状態になったら終了するためにsoxも必要です。現状では、話を終えたら手動でsoxを強制終了する必要があります。そうでなければ、soxはさらに話をするまで再び待機し、出力ファイルに追加します(これは望んでいないことです)。現在使用している録音コマンドは次のとおりです。

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

繰り返しますが、わかりやすくするために、Soxは会話を開始するまで待機し、会話を停止するまで録音してから、soxプログラムを終了する必要があります。

回答:


13

元のコマンドから負符号を削除します。

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

「カウント未満」が負の場合、無音コマンドはファイルの中央からすべての無音を切り取ります。肯定的な場合、ファイルの終わりから無音を削除します。


1
これは、私が思いついたLOLよりもはるかに簡単なソリューションです!
アイザック

3

上記のアイデアをさらに調整しました。それは永久に記録し、(大体)1秒間の無音に遭遇するまですべてのノイズを記録します。次に:

  • 2つのサブディレクトリが作成されるようにします
  • 記録の2つのスペクトログラフを計算します。1つは正規化前、もう1つは後、日付スタンプされたフォルダーに書き込みます。
  • 正規化されたものを、日付スタンプされたフォルダーのファイルに書き込みます。
  • 2つのchirp .oggファイルを使用して、正規化されたファイルを再生します(音声操作のCB Radioを介して再生)

(非常に手頃な小さなUHF / 2メートルのエコーリピーターを作成します)

#!/ bin / bash
真実ながら 行う
  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バッファファイルの名前を$ DATEに変更
  sox buffer.ogg -nスペクトログラム-x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg normbuffer.ogg gain -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
  pre.oggを再生します。/voice/$DPATH/$DATE.oggpost.ogg 
やった

2

私は、この種の問題を解決する一種の不安定な方法を見つけました。

無音が検出されると、soxはファイルに音を追加するまで自然にファイルに追加しません。それで、私はこの事実を利用しようと決めました。

まず、バックグラウンドでsoxのサウンドレコーダーを起動します。

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

次に、記録プロセスのPIDを取得します。 p=$!

次に、記録プロセスに1秒を与えて起動を終了し、ファイルが大きくなり始めるまで待ちます。

寝る1
until ["$ var1"!= "$ var2"]; 行う
    var1 = `du" /tmp/recording.flac "`
    寝る1
    var2 = `du" /tmp/recording.flac "`
やった

このループが切れると、音が検出されたことを意味します。そこで、別のループを作成して、データがファイルに追加されなくなるまで待機します(これは、soxが再び無音を検出すると発生します)。

echo "検出された音"
until "" $ var1 "==" $ var2 "]; 行う
    var1 = `du" /tmp/recording.flac "`
    睡眠0.5
    var2 = `du" /tmp/recording.flac "`
やった

今、私はちょうど終了する必要がありますrec

echo "Silence Detected"
$ pを殺す

以上です。完成したスクリプトは次のとおりです。

rec /tmp/recording.flac rate 32k無音1 0.1 3%-1 3.0 3%&
p = $!
寝る1
until ["$ var1"!= "$ var2"]; 行う
    var1 = `du" /tmp/recording.flac "`
    寝る1
    var2 = `du" /tmp/recording.flac "`
やった
echo "検出された音"
until "" $ var1 "==" $ var2 "]; 行う
    var1 = `du" /tmp/recording.flac "`
    睡眠0.5
    var2 = `du" /tmp/recording.flac "`
やった
echo "Silence Detected"
$ pを殺す

今、私はこれを行うためのより良い、より安定した方法を好むでしょうが、これは今のところ動作する必要があります。


1

これは永久にリッスンし、1秒間の無音が聞こえるまで最後のサウンドのみを記録し、ファイルを書き込み、タイムスタンプを付け、再起動します。

#!/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 trueループがあります
Michael Mrozek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.