使用* SoX **中的sox
来分析一个短的音频样本:
sox -t .wav "|arecord -d 2" -n stat
用-t .wav
我们指定我们处理wav类型,"|arecord -d 2"
执行 arecord
程序两秒钟,-n
输出到空文件,用stat
我们指定我们要统计。
这个命令的输出,在我的系统上有一些背景语音,输出的结果是:
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
Samples read: 16000
Length (seconds): 2.000000
Scaled by: 2147483647.0
Maximum amplitude: 0.312500
Minimum amplitude: -0.421875
Midline amplitude: -0.054688
Mean norm: 0.046831
Mean amplitude: -0.000044
RMS amplitude: 0.068383
Maximum delta: 0.414063
Minimum delta: 0.000000
Mean delta: 0.021912
RMS delta: 0.036752
Rough frequency: 684
Volume adjustment: 2.370
然后可以通过提取最大振幅。
grep -e "RMS.*amplitude" | tr -d ' ' | cut -d ':' -f 2
我们 grep
对于我们想要的行,用 tr
去掉空格字符,然后 cut
用:
字符取第二部分,这就得到了0.068383
在这个例子中。正如评论所建议的那样, RMS 是比最大振幅更好的能量测量方法。
最后,你可以在结果上使用 bc
来比较命令行的浮点值:
if (( $(echo "$value > $threshold" | bc -l) )) ; # ...
如果你建立一个循环(见 Bash例子 ),调用 sleep 1分钟,测试音量,然后重复,你可以让它在后台运行。最后一步是将它添加到init脚本或服务文件中(取决于你的操作系统/发行版),这样你甚至不用手动启动它。