マイクの監視とフィルタリングされたクリップの保存

マイクの監視とフィルタリングされたクリップの保存

次のスクリプトを使用してマイクを監視します。

while true; do
    printf "$(AUDIODEV=hw:2,0 rec -n stat trim 0 1 2>&1 |
        awk 'BEGIN { ORS="" } /^Maximum amplitude/ { print "Max. amplitude: "$3} 
             /^Rough\s+frequency/ { print " Frequency: "$3} 
             /^Maximum\s+delta/ { print " Max. delta: "$3}')\r";
done

1秒の長さのセグメントを記録し、標準出力からMaximum amplitude合計値を抽出して印刷します。Rough frequencysox

セグメント数または頻度が特定のしきい値より大きい場合は、ファイルとして保存できますか?各セグメントを保存して分析できることを知っていますが、書き込みが多すぎて避けたいです。

答え1

その間に解決策を見つけました。これはrecPythonの出力をパイピングしてbase64ASCIIでエンコードし、bash変数に保存できるようにすることに基づいています。セグメント数と頻度を分析する時が来たら、base --decode可変コンテンツを実行します。以下のスクリプトでは、ボリュームのみが分析されます。しきい値(0.6)を超えると、handleExcessそのセグメントが呼び出されて保存されます。また、クリップの長さを5秒に長くしました。

handleExcess() {
    echo "$1" | base64 --decode > /tmp/"$2".wav
}

VOLUME="";

while true; do
    AUDIO_DATA="$(AUDIODEV=hw:0,0 rec -c 1 -t wav - trim 0 5 2> /dev/null | base64)";
    declare $(echo "$AUDIO_DATA" | base64 --decode | sox - -n stat 2>&1 | awk 'BEGIN { ORS="" } /^Maximum amplitude/ { print "VOLUME="$3 }');

    if [ $(echo "$VOLUME > 0.6" | bc) == 1 ]; then
        AUDIO_DATA_TMP="$AUDIO_DATA";
        handleExcess "$AUDIO_DATA_TMP" "$VOLUME""_""$(date +%s)" &
    fi
done

関連情報