有没有办法(通过命令行)输出进入声卡线路输入插孔的音频的分贝级别?如果进入线路输入的音频的音量/强度超过某个阈值,我想运行一个脚本。
我检查了 /proc/asound 中的文件和子目录,并使用了一些 alsa/a* 工具,但没有发现任何有希望的东西。
有什么想法/意见吗?
答案1
尝试使用 sox 包中包含的 rec 和静音过滤器。您可以确定开始和停止录制的级别和持续时间。然后,您可以将其用作触发器来继续执行脚本。
有一个非常好的链接:http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/
问候,
答案2
一般来说不是。记录的数据是相对值(相对于设置将记录的最大值,该最大值因麦克风、声卡和其他因素而异)。
如果您有另一台设备可以校准声卡输出的值,那么您就可以算出答案(同样,针对特定设置)。但是如果没有这个外部参考,就无法知道。
答案3
你可以尝试这样的事情:
/usr/bin/arecord -L # figure out what device to use
/usr/bin/arecord -d 1 --device plughw:CARD=HD1,DEV=0 -t wav | sox -t .wav - -n stats 2>&1 | awk '/RMS lev dB/{print $4}'
答案4
虽然没有资格发表评论,但我认为我应该准确概述@pez 的回答:
/usr/bin/arecord -L # figure out what device to use
这应该会产生一系列看起来像的东西plughw:CARD=HD1,DEV=0
。
我发现这hw:0
通常就足够了,特别是当你使用某种单板计算机时。
/usr/bin/arecord -d 1 --device plughw:CARD=HD1,DEV=0 -t wav | sox -t .wav - -n stats 2>&1 | awk '/RMS lev dB/{print $4}'
如果您遇到从未见过的命令,运行man <command_name>
是一个不错的开始。它将概述命令的作用。在本例中,该命令具有arecord
以下参数:
-d
<- 设置持续时间,在本例中为 1 秒
--device
<-这将设置设备进行记录
-t
<- 设置输出文件类型
来自(通过 stdout)的结果arecord
通过垂直管道字符“管道传输”或作为输入输入到一系列新的命令(在本例中为 sox)中|
。
sox
是一个对音频文件执行操作的命令 cli 实用程序。在本例中,它被告知输入是一个 .wav 文件,并使用 null 作为输出-n
。这通常用于当您想要有关音频的元信息而不一定对播放感兴趣时。然后该stats
参数会为我们带来一大段有关音频流的信息。
由于某种原因,我们stderr
使用运算符将(文件描述符 2)重定向到 stdout(文件描述符 1)>&
。不确定为什么。
|
然后将的输出通过管道( )传输sox
到awk
!
awk
如果您不熟悉的话,这有点多,但通常它一次对一行文本执行操作。awk 有几个内置变量,它有自己的语法。在本例中:
awk '/RMS lev dB/{print $4}'
awk
使用 设置正则表达式/.../
,其基本含义是“如果我正在处理的行与某个地方的此字符流不匹配,我将继续处理”。然后语句的主体awk
进入,用 表示{...}
。
正文中预设了一组变量,用于提供有关行的信息,例如字段数(默认情况下为列,或用空格分隔的单词),以及 $0 到 $NF。所以这表示仅打印输入文本中的第 4 列。
用最外行的话来说,该命令将一秒钟的音频录制为 wav 文件,使用该sox
命令获取其统计信息,然后找到包含分贝信息的行并打印出该值。