私はsoxを使って会話を録音するスクリプトを書いています。これで、録音を始める前に音が検出されるのを待つ必要があることを実際に見つけました。しかし靴下も必要です。出口一度少なくとも3秒間沈黙します。今のように話が終わったら、手動でsoxを終了する必要があります。そうでなければ、soxは私がもっと話すまで待ってから出力ファイルに追加します(これは私が望むものではありません)。これは私が今使っている録音コマンドです。
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
繰り返しますが、Soxは私が話を始めるのを待ってから、私が話をやめるまで録音してからsoxプログラムを終了しなければなりません。
答え1
元のコマンドから負の符号を削除します。
rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%
「Below Count」が負の場合、無音コマンドはファイルの途中ですべての無音を切り取ります。正の場合は、ファイルの末尾から無音を削除します。
答え2
上記のアイデアをいくつか調整しました。 (約)1秒の沈黙が発生するまで、すべてのノイズを永遠に録音します。それから:
- 2つのサブディレクトリを作成する必要があります。
- 2つの記録されたスペクトル(正規化の前後のスペクトル)が計算され、日付スタンプが記録されたフォルダに記録されます。
- 日付スタンプがあるフォルダ内のファイルに完全修飾ファイルを書き込みます。
- 2つのchirp .oggファイルで標準化されたファイルを再生します(音声操作CBラジオを介して再生)。
(非常に便利な小型UHF/2メートルエコリピータが作れます)
#!/bin/bash 本当ですが。 buffer.ogg サイレント 1 0.1 5% 1 1.0 5% 記録 日付=`日付+%Y%m%d%H%M%S` DPATH=`日付+%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.oggnormbuffer.ogg ゲイン -n -2 soxnormbuffer.ogg -n スペクトログラム -x 300 -y 200 -z 100 -t $DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png mvnormbuffer.ogg ./voice/$DPATH/$DATE.ogg pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 再生 完璧
答え3
私はこの問題を解決するための不安定な方法を見つけました。
私はサイレントが検出されると、より多くの音が聞こえるまで自然にsoxがファイルに何も追加しないことがわかりました。それで私はこの事実を活用してみることにしました。
まず、バックグラウンドでSoxのレコーダーを起動します。
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &
次に、次のコマンドを使用して録音プロセスのPIDを取得しました。p=$!
その後、録音プロセスが開始されるまでしばらく待ってから、ファイルが大きくなり始めるまで待ちます。
睡眠1 ["$var1"まで! = "$ var2"]; var1=`du "/tmp/recording.flac"` 睡眠1 var2=`du"/tmp/recording.flac"` 完璧
ループが中断されると、音が検出されたことを意味します。これで、データがファイルに追加されるのを停止するのを待つ別のループが作成されます(soxが再びサイレントを検出すると、これが発生します)。
echo 「音が検出されました」 ["$var1" == "$var2"]まで。 var1=`du "/tmp/recording.flac"` 睡眠0.5 var2=`du"/tmp/recording.flac"` 完璧
これで終了するだけですrec
。
echo「静音が検出されました」 $ pを殺す
それはすべてです。完成したスクリプトは次のとおりです。
rec /tmp/recording.flac 速度 32k ミュート 1 0.1 3% -1 3.0 3% & p=$! 睡眠1 ["$var1"まで! = "$ var2"]; var1=`du "/tmp/recording.flac"` 睡眠1 var2=`du"/tmp/recording.flac"` 完璧 echo 「音が検出されました」 ["$var1" == "$var2"]まで。 var1=`du "/tmp/recording.flac"` 睡眠0.5 var2=`du"/tmp/recording.flac"` 完璧 echo「静音が検出されました」 $ pを殺す
今はこれを行うより良い信頼性の高い方法を好みますが、今はこれがうまくいくはずです。
答え4
これは永遠に聞こえ、しばらく沈黙が聞こえるまで最後のサウンドのみを録音し、ファイルに書き込んでタイムスタンプを指定してから再開します。
#!/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