如何在现场系统声音中识别声音“峰值”?

Posted

技术标签:

【中文标题】如何在现场系统声音中识别声音“峰值”?【英文标题】:How to recognise a sound ‘peak’ at live system sound? 【发布时间】:2018-07-10 20:22:03 【问题描述】:

我想做一个程序,当系统的基本声音播放任何类型的声音时,它会执行特定的命令。就像你在 facebook 上收到一条消息一样,你会听到一点警报声。我想认识这个“高峰”。在python中怎么可能?

【问题讨论】:

你有没有尝试过你的代码? 这也是依赖于操作系统的,因为我想你必须深入研究一些低级声卡的东西 @MoxieBall 如果我们检查一个指定的程序会更容易吗? @AndrejKesely。还没有 @FrankConrad 更像是,您必须执行此操作的方式取决于如何从您的系统获取声级,这取决于您的系统。我不知道如何为任何系统做到这一点——做过的人必须知道你正在使用什么系统 【参考方案1】:

获取您的音频数据

我认为您正在寻找的是以某种方式回送系统输出,以便您可以读取它,就好像您的操作系统认为它是输入一样。有不同的方法可以做到这一点(取决于您的操作系统)。

但是,由于在您提到您的操作系统是 Windows 8.1 的 cmets 中,您可以使用 PyAudio -> PyAudio_portaudio 的分支:这是正常的 PyAudio,但扩展为使用 WASAPI 环回您的窗口系统输出返回到您可以在 Python 中检索的内容。

如果我遗漏了任何内容,请参阅this other SO post 关于使用 Python 记录系统输出的内容,并感谢 @mate 将链接发布到 PyAudio fork。

这是一个简单的解释:

官方 PyAudio 版本无法记录输出。但是 Windows Vista 及更高版本,引入了一个新的 API,WASAPI,它 包括在环回中打开到输出设备的流的能力 模式。在这种模式下,流的行为类似于输入流,具有 录制输出音频流的能力。

要设置模式,必须设置一个特殊标志 (AUDCLNT_STREAMFLAGS_LOOPBACK, https://msdn.microsoft.com/de-de/library/windows/desktop/dd316551(v=vs.85).aspx )。由于官方版本不支持此标志,因此需要 编辑 PortAudio 和 PyAudio,以添加环回支持。

新选项:“as_loopback”:(true|false)

分析您的数据

这将为您逐块提供数据(以您指定的块大小)。从那里,您可以进行任何您想要的 DSP / 峰值分析来计算已播放的声音/具有任何属性。

下面是一个快速示例,可帮助您开始使用 peak detection in Python。为了获得更准确的结果,也许您可​​以存储您想要识别的 .wav 文件并执行cross correlation 以查看是否播放了相同的 .wav 文件。

Cross correlation 1D Arrays(单声道) Cross correlation 2D Arrays(立体声)

【讨论】:

以上是关于如何在现场系统声音中识别声音“峰值”?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14 的“声音识别”如何使用?

使用哪个麦克风进行声音识别是不是重要?

播放纯声音(一个频率)并识别频率 C++

如何在 .Net 中播放“新邮件”系统声音?

如何从系统声音中获取铃声

如何以编程方式确定系统设备声音设置?