python - 如何在现场系统声音中识别声音“峰值”?
问题描述
我想制作一个程序,当系统的基本声音播放任何类型的声音时,它会执行特定的命令。就像你在 facebook 上收到一条消息一样,你会听到一点警报声。我想认识这个“高峰”。在python中怎么可能?
解决方案
</嘿>
获取您的音频数据
我认为您正在寻找的是以某种方式回送系统输出,以便您可以阅读它,就好像您的操作系统认为它是输入一样。有不同的方法可以做到这一点(取决于你的操作系统)。
但是,由于在您提到您的操作系统是 Windows 8.1 的评论中,您可以使用PyAudio -> PyAudio_portaudio的一个分支:这是普通的PyAudio,但扩展为使用WASAPI将您的 Windows 系统输出回送回您可以在 Python 中检索的内容。
如果我遗漏了任何内容,请参阅有关使用 Python 记录系统输出的其他 SO 帖子,并感谢@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 / 峰值分析,以计算已播放的声音/具有任何属性。
这是一个快速示例,可帮助您开始在 Python 中进行峰值检测。为了获得更准确的结果,也许您可以存储要识别的 .wav 文件并执行互相关以查看是否播放了相同的 .wav 文件。
推荐阅读
- javascript - 我有基本相同的 API 函数将我的前端连接到烧瓶后端。但是为什么一个有效而另一个无效呢?
- java - org.joda.time.DateTime.now 分辨率
- sql - 填充现有表中开始日期和结束日期之间的行
- python - Python Selenium - 通过 aria-label 或其他自定义字段查找和单击元素
- angular - 不带参数的双破折号 (--) 与带参数的双破折号之间的区别(例如:--no-watch)
- amazon-web-services - AWS CloudFormation 忽略现有资源
- python - 将华氏温度转换为摄氏温度 Python
- xml - 从 XML Schema 中移除命名空间支持
- html - 如何调整图像css的高度
- javascript - 为什么我分配给 Javascript 提取的返回值的数组包含甚至没有出现在响应中的数据?