web-dev-qa-db-ja.com

無音が検出されたらsox記録を終了します

私は、soxを使用して会話を録音するスクリプトを作成しています。録音を開始する前に音を検出するまでsoxを待機する必要があります。しかし、少なくとも3秒間無音になったら、exitへのsoxも必要です。現在のように、話が終わったら手動でsoxを強制終了する必要があります。そうでない場合、soxはさらに話すまで再び待機し、出力ファイルに追加します(これは私が望んでいることではありません)。これは私が今使っている録音用のコマンドです:

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

繰り返しになりますが、明確にするために、Soxは私が話し始めるまで待機し、録音が終わるまで録音します。その後、Soxプログラムは終了します。

16
Isaac

元のコマンドからマイナス記号を削除します。

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

「below count」が負の場合、silenceコマンドはファイルの中央からすべての無音をトリミングします。正の場合、ファイルの最後から無音部分を削除します。

13
meetar

上記のアイデアをさらに調整しました。それは永遠に記録し、(おおよそ)2分の沈黙に遭遇するまですべてのノイズを記録します。次に:

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

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

#!/ bin/bash 
 trueの間; do 
 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 spectrogram -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
 soxバッファー。 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
 play pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
完了
3
Nigel Weeks

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

無音が検出された場合、soxは当然、音が聞こえるまでファイルに何も追加しません。だから私はこの事実を試して利用できると決めました。

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

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

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

次に、記録プロセスを1秒後に開始し、ファイルが大きくなるまで待ちます。

スリープ1 
 until ["$ var1"!= "$ var2"]; do 
 var1 = `du" /tmp/recording.flac"`
 sleep 1 
 var2 = `du" /tmp/recording.flac"`
完了

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

 echo "Sound Detected" 
 until ["$ var1" == "$ var2"]; do 
 var1 = `du" /tmp/recording.flac"`
 sleep 0.5 
 var2 = `du" /tmp/recording.flac"`
完了

ここで、recを終了するだけです。

 echo "Silence Detected" 
 kill $ p 

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

 rec /tmp/recording.flac rate 32k silence 1 0.1 3%-1 3.0 3%&
 p = $!
 sleep 1 
 until ["$ var1 "!=" $ var2 "]; do 
 var1 = `du" /tmp/recording.flac"`
 sleep 1 
 var2 = `du" /tmp/recording.flac"`
完了
 echo "Sound Detected" 
 until ["$ var1" == "$ var2"]; do 
 var1 = `du" /tmp/recording.flac"`
 sleep 0.5 
 var2 = `du" /tmp/recording.flac"`
完了
 echo "Silence Detected" 
 kill $ p 

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

2
Isaac

これは永久にリッスンし、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
1
Jared Terrell