监控麦克风并保存过滤后的片段

监控麦克风并保存过滤后的片段

我使用以下脚本来监控我的麦克风:

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

同时我找到了解决方案。它基于管道recto的输出base64,以便可以将其编码为 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

相关内容