确定线路输入音频的分贝级别

确定线路输入音频的分贝级别

有没有办法(通过命令行)输出进入声卡线路输入插孔的音频的分贝级别?如果进入线路输入的音频的音量/强度超过某个阈值,我想运行一个脚本。

我检查了 /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)>&。不确定为什么。

|然后将的输出通过管道( )传输soxawk

awk如果您不熟悉的话,这有点多,但通常它一次对一行文本执行操作。awk 有几个内置变量,它有自己的语法。在本例中:

awk '/RMS lev dB/{print $4}'

awk使用 设置正则表达式/.../,其基本含义是“如果我正在处理的行与某个地方的此字符流不匹配,我将继续处理”。然后语句的主体awk进入,用 表示{...}

正文中预设了一组变量,用于提供有关行的信息,例如字段数(默认情况下为列,或用空格分隔的单词),以及 $0 到 $NF。所以这表示仅打印输入文本中的第 4 列。


用最外行的话来说,该命令将一秒钟的音频录制为 wav 文件,使用该sox命令获取其统计信息,然后找到包含分贝信息的行并打印出该值。

相关内容