如果达到一定的噪音水平,我如何在一段时间内使机器“空白屏幕”(作为惩罚)?

在电脑上玩游戏时,我的孩子们(4和5)大声叫嚷。我找到了一个有效的治疗方法。当我听到大声的声音时,我就进入游戏电脑,然后:

chvt 3;  sleep 15;  chvt 7 

这将在Linux上关闭屏幕15秒。我告诉他们电脑不喜欢大声的噪音。他们完全相信这一点,并请求电脑宽恕。他们变得更安静,但没有达到我会很高兴的水平,所以我需要继续这个教育过程。但是,我并不总是手动执行此操作。

是否可以自动执行此操作?麦克风连接到盒子上。如果响度水平超过某个阈值,那么我想运行一个命令。

答案


soxSoX使用来分析短音频样本:

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示例),该循环调用睡眠 1分钟,测试音量,然后重复,可以让它在后台运行。最后一步是将其添加到init脚本或服务文件(取决于您的操作系统/发行版),这样您甚至不必手动启动它。


地铁是节拍器,“地铁100”每隔100毫秒就会撞击一次。

音频来自adc〜,音量由env〜计算。“pd dsp 0”会在关闭DSP时关闭DSP,“pd dsp 1”将其打开。“shell”在shell中执行传递的命令,我使用Linux xrandr API将亮度设置为X,您需要为Wayland调整它。

正如你所看到的,宽限期和锁定占用了比音频代码更多的空间。

使用环形缓冲区和/或移动平均值来制定解决方案应该比实现方式更容易sox。所以我认为使用Pure Data来做这件事不是一个坏主意。但是屏幕自身消隐和锁定不符合数据流范例。

PD文件位于gist.github.com:ysangkok – kidsyell.pd


Thomer M. Gil检查“如何检测声音/音频的存在”

基本上它每隔5秒记录声音,比检查声音幅度,使用sox和决定是否触发剧本。我想你可以很容易地ruby为你的孩子修改脚本!或者你可以选择破解他已经提供的Python脚本(使用PyAudio)。


您可以通过执行以下操作来从麦克风获取信息:

arecord -d1 /dev/null -vvv

您可能必须稍微使用一些设置,例如:

arecord -d1 -Dhw:0 -c2 -fS16_LE /dev/null -vvv

从那里开始,解析输出是一件简单的事情。


我的2分钱用于C或C ++解决方案:可能不是最有效的方法,但在Linux上,您可以使用ALSA API(Linux的内置音频处理库)并使用一些数字技术(例如,计算平均声音水平每秒)来获得噪音水平。

然后你可以在一个无限循环中检查它,如果它大于预设的阈值,你可以使用X11库关闭屏幕几秒钟,或者(不太优雅,但它工作)chvt使用调用该命令system("chvt 3; sleep 15; chvt 7 ");


这是我见过的更有趣的问题之一。我想感谢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

添加评论

友情链接:蝴蝶教程