我的孩子(4岁和5岁)在计算机上玩游戏时大喊大叫。我找到了有效的解决方法。当我听到很大的声音时,我便进入游戏计算机并执行以下操作:
chvt 3; sleep 15; chvt 7
在Linux上,这将关闭屏幕15秒钟。我告诉他们,计算机不喜欢吵闹的声音。他们完全相信这一点,并请求计算机原谅。他们变得安静了许多,但没有达到我满意的程度,因此我需要继续进行这一教育过程。但是,我并不总是手动执行此操作。
可以自动化吗?麦克风已连接到盒子。如果响度级别超过某个阈值,那么我要运行命令。
我的孩子(4岁和5岁)在计算机上玩游戏时大喊大叫。我找到了有效的解决方法。当我听到很大的声音时,我便进入游戏计算机并执行以下操作:
chvt 3; sleep 15; chvt 7
在Linux上,这将关闭屏幕15秒钟。我告诉他们,计算机不喜欢吵闹的声音。他们完全相信这一点,并请求计算机原谅。他们变得安静了许多,但没有达到我满意的程度,因此我需要继续进行这一教育过程。但是,我并不总是手动执行此操作。
可以自动化吗?麦克风已连接到盒子。如果响度级别超过某个阈值,那么我要运行命令。
Answers:
使用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分钟,测试音量,然后重复播放,则可以使其在后台运行。最后一步是将其添加到初始化脚本或服务文件中(取决于您的OS /发行版),这样您甚至不必手动启动它。
sample[n]>sample[n-1]&&sample[n]>sample[n+1]我将其用作测量歌曲能量的基本机制的任何点,并且效果很好。只需搜索一个令您满意的音量数字即可。
这是使用Pure Data可以完成的方法:

Metro是一个节拍器,“ Metro 100”每100 ms不断跳动。
音频来自adc〜,音量由env〜计算。撞击时,“ pd dsp 0”将关闭DSP,“ pd dsp 1”将其打开。“ shell”在shell中执行传递的命令,我使用Linux xrandr API将亮度设置为X,您需要对此进行调整以适应Wayland。
如您所见,宽限期和锁定比音频代码占用更多的空间。
使用环形缓冲区和/或移动平均线来进行求解应该比使用来容易sox。因此,我认为为此使用Pure Data并不是一个坏主意。但是屏幕本身会消隐并且锁定不符合数据流范式。
选中Thomer M. Gil的“如何检测声音/音频的存在”。
基本上,它每5秒钟记录一次声音,然后使用来检查声音的幅度sox,并确定是否触发脚本。我认为您可以轻松地ruby为孩子们改编剧本!或者,您也可以选择破解他提供的Python脚本(使用PyAudio)。
这是我所看到的更有趣的问题之一。我要感谢tucuxi 这么好的回答;我已经设置为bash脚本
#!/bin/bash
threshold=0.001
# we should check that sox and arecord are installed
if [ $1 ]; then threshold=$1; fi
while [ 1 -gt 0 ]; do
if(( $(echo "$(sox -t .wav '|arecord -d 2' -n stat 2>&1|grep -e 'RMS.*amplitude'|tr -d ' '|cut -d ':' -f 2 ) > $threshold"|bc -l) ))
then
chvt 3; sleep 5; chvt 7;
fi
done