如何检测现场音频输入中的口哨声、爆破声和其他声音?

信息处理 fft 声音的 语音处理
2022-01-03 17:33:35

我已经阅读了很多关于 SO 的问题,坦率地说,每个问题都没有描述任何特定的解决方法。有人说“做FFT”,有人说“过零”等。但我只了解数字音频输入由特定频率的振幅数组组成,而且……不太了解超越它。

现在我确实知道奈奎斯特定理、频率、幅度、傅里叶级数等,那是 2-3 年前我在某个学期的大学课程中做到的。但当时我们真的没有被教过太多傅里叶在现实世界中的用法,而且我也没有费心去挖掘更多关于这个主题的知识,只是学习到足以通过这个主题。但现在我将不得不使用所有这些东西。

这是我试图检测的声音的快照:

独特的手指按扣和灯开关图

显然,声音具有独特的图表。我只是想了解如何为图表中独特的尖线提取它们的独特特征。比如幅度、频率等。以及持续多长时间——尽管我猜这很微不足道。

我想要一个简单的分步说明列表——我可以用谷歌搜索我不明白的术语。

可能像这样?--

  1. 获取输入音频数据

  2. 绘制频谱图

  3. 获取您想要在无噪音环境中检测的声音的频谱图

  4. 研究该图 - 绘制该声音的独特特征

  5. 使用 (4) 中找到的声音特征,制作某种可以检测实时音频馈送中的特定特征的函数

  6. 如果找到匹配项,那么 - 工作就完成了。

  7. 完善算法以清除假阴性。

我感到困惑的地方是 - 我怎么去 3,4,5。特别是 3 和 4。因为我正在制作一个软件,用户可以在其中录制任何声音作为手势输入以供以后使用,我希望我的系统能够录制任何声音并将其与现场音频相匹配feed 以检测该声音手势。比如咳嗽、弹指、吹口哨或鼓掌。或者说辅音 -几乎任何声音。ABXZ

我正在考虑让用户在安静的环境中记录他们想要存储的声音作为手势。并且用户只会在安静的时间填充之间发出声音;录制开始和结束时 3 秒。

比如说,在前 3 秒内,我的系统会确定当前输入是正常的安静背景声音。然后图表中的突然变化将是声音输入开始。当它停止时,录音会再持续 3 秒,这是尾随的安静时间填充这将由用户手动完成。然后它会自动存储图表中突然变化持续的那部分的特征——介于填充时间之间的某个地方。

因此,该部分的特征将被保存为该声音的手势数据,稍后将用于在实时音频馈送中检测该特定声音。

问题是,我用简单的英语思考这一切。我需要考虑数学和物理,以便能够在我的代码中有效地实现它。我对在我的代码中写什么以及在哪里写它一无所知——即使有这么多关于 SO 的库和问题可供我使用。

对不起,如果这很长。

3个回答

虽然我同意使用语音识别技术可能是一个好的开始的评论之一,但这些声音是不同的,我不知道有人对它们进行过分类研究(Nathan 引用的论文似乎只是区分语音和噪音),所以除非有人提出与此相矛盾的东西,否则你将不得不发明自己的技术,这需要大量的学习和大量的工作。我能做的最好的就是让你开始。

首先,不要指望任何人能够产生一些神奇的公式。从声音到声音是什么没有等式。人类和计算机必须通过整合数据来学习,以便对声音是什么做出有根据的猜测。人们在回答中说“使用 FFT”或“使用过零”的原因是因为这些是语音识别和相关算法中使用的一些基本 DSP 构建块。但 FFT 和过零率通常只是创建一组描述声音的参数的第一步。然后对这些参数进行统计分析(而不是通过一些魔术函数)以确定它们最有可能属于哪个类别。请注意,我说的是“最有可能”:即使是最好的语音检测(以及人脑!

因此,您可以寻找的一些参数包括:

  • 过零率
  • 频率质心
  • 包络(这实际上是一组参数,包括,例如起音时间)
  • 频谱包络
  • 偶/奇谐波平衡
  • 声音
  • 基本音高

一旦你有了一组你认为可以让你区分声音的参数,你就需要使用一些统计方法来对它们进行分类。隐马尔可夫模型常用于语音。您还可以研究逻辑回归、K-means,我相信还有其他选择,但我认为 HMM 是经过验证的。

当我试图忽略电话中的这些声音时,我使用了这篇关于基于熵的端点的论文,用于计算机语音识别,如果你试图捕捉的声音是语音,那么熵可以很好地工作,对于音乐它可能没用。

我认为 Bjorn 的建议非常好,但我想提供一些额外的信息。根据您的描述,这听起来很像音色识别问题。在计算机音乐背景下,这方面有一些研究(识别不同的乐器是一件很有用的事情,并且区分啪啪声和拍手是因为声音的音色)。威廉布伦特已经在这方面做了一些研究(在他的页面上查找 timbreID)并创建了一些在 Pure Data 中使用的软件。在每种情况下,您都在寻找特定事件,因此通过发病检测进行一些自动分割将是一个好主意。由于您已经在使用 STFT,因此确定发病不需要太多额外的工作(查看 Spectral Flux 发病检测)。系统大纲可以是这样的:

训练

  • 确定适当的特征(例如过零率、频谱质心、MFCC)
  • 检测发作
  • 计算输入音频的这些特征(你的手势记录)
  • 保留特征计算的数据库。您将需要确定这是有监督还是无监督的培训情况。例如,用户是否事先指定 snap 是“sound 1”而 clap 是“sound 2”,或者您的系统是否在训练后尝试对这些进行聚类。

分类

  • 实时检测开始并计算传入音频的特征
  • 使用距离度量(欧几里得距离或另一个 Lp 距离)进行最近邻或 K-最近邻分类以确定数据库中“最近”的声音

这篇关于打击乐音色识别的论文可能会有一些用处。它概述了用于计算传入声音的潜在特征的定义和作者的分类方法。这对于敲击声音来说效果很好,但对于语音(多音节)之类的声音可能效果不佳,在这种情况下,HMM 方法会更合适。同样,您的发病检测的准确性将根据您正在寻找的声音类型而有所不同。

如果您特别关心按扣与电灯开关,那么请花一些时间找出哪些功能可以准确地区分这两种声音。