Bash
監控麥克風並保存過濾片段
我使用以下腳本來監控我的麥克風:
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 frequency``sox
如果片段的數量或頻率大於特定門檻值,我可以將片段保存到文件嗎?我知道我可以保存每個段然後分析它,但是寫操作會太多,我想避免。
與此同時,我找到了解決方案。它基於管道輸出
rec
tobase64
以便可以將其編碼為 ASCII 並儲存在 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