私は、soxを使用して会話を録音するスクリプトを作成しています。録音を開始する前に音を検出するまでsoxを待機する必要があります。しかし、少なくとも3秒間無音になったら、exitへのsoxも必要です。現在のように、話が終わったら手動でsoxを強制終了する必要があります。そうでない場合、soxはさらに話すまで再び待機し、出力ファイルに追加します(これは私が望んでいることではありません)。これは私が今使っている録音用のコマンドです:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
繰り返しになりますが、明確にするために、Soxは私が話し始めるまで待機し、録音が終わるまで録音します。その後、Soxプログラムは終了します。
元のコマンドからマイナス記号を削除します。
rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%
「below count」が負の場合、silenceコマンドはファイルの中央からすべての無音をトリミングします。正の場合、ファイルの最後から無音部分を削除します。
上記のアイデアをさらに調整しました。それは永遠に記録し、(おおよそ)2分の沈黙に遭遇するまですべてのノイズを記録します。次に:
(非常に手軽な小さな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 完了
私はこの問題を解決する一種の不安定な方法を見つけました。
無音が検出された場合、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
今、私はこれを行うためのより良い、より安定した方法を好みますが、これは今のところ機能する必要があります。
これは永久にリッスンし、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