如何检测实时音频输入中的口哨声,爆裂声和其他声音?


9

我已经阅读了很多关于SO的问题,坦率地说,每个问题都没有描述解决该问题的任何特定方法。有些人说“做FFT”,有些人说“零交叉”等。但是我只了解数字音频输入由一个特定频率的幅度阵列组成。很好。超越它。

现在我知道尼奎斯特定理,频率,振幅,傅立叶级数等,这是从2-3年前的某个学期在我的大学课程中做到的。但是那时候我们真的没有教过傅立叶在现实世界中的使用情况,而且我不花心思去研究更多关于傅立叶的知识,而不仅仅是学习通过该课程。但是现在我将不得不使用所有这些东西。

这是我要检测的声音的快照:

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

显然,声音具有独特的图表。我只想了解如何为图中的独特尖峰线提取其特定独特特征。像是什么幅度,频率等等,还有多少时间-尽管我猜这很微不足道。

我想要一个简单,循序渐进,不模糊的说明列表-我可以用谷歌搜索我不懂的术语。

像这样吗?-

  1. 获取输入音频数据

  2. 频谱图

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

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

  5. 利用(4)中找到的声音特征,做出某种可以检测实时音频馈送中那些特定特征的功能

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

  7. 完善算法以消除误报。

ABXZ

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

可以这么说,在最初的3秒钟内,我的系统将确定当前输入是正常的安静背景声音。然后,图表中的突然变化将开始声音输入。然后,当录制停止时,录制将继续进行3秒钟,随后是安静的时间间隔。这将由用户手动完成。然后,它将仅自动存储图表中突然变化持续的那部分的特征-在填充时间之间的某个地方。

因此,该部分的特性将另存为该声音的手势数据,该数据随后将用于检测实时音频馈送中的特定声音。

问题是,我在用通俗的英语思考所有这些。我需要考虑数学和物理学,以便能够在我的代码中有效地实现它。关于我在代码中写什么和在哪里写,我真是一无所知,即使我有这么多库和关于SO的问题也是如此。

很抱歉,如果这很长。


1
出于好奇,该频谱图是在手机或平板电脑上制作的吗?如果是这样,您能说出应用程序的名称吗?看起来真的很酷。关于您的问题,那么我认为您的应用程序类似于执行孤立单词识别的主题/任务。谷歌搜索可能会得到很多想法和启发。难的部分不是在有限的相对较小的手势集中识别手势,而难的部分是过滤掉不是手势的内容。
niaren

这是应用程序:play.google.com/store/apps / ... 谢谢您的意见。但是我想让你告诉我如何检测的不是单词,而是声音(至少现在),例如吹口哨,流行,拍手等。我正在使用Python。
bad_keypoints 2013年

1
不幸的是,这种事情仍然是研究领域。我不知道有人能解决这个特定问题。
比约恩·罗奇

Answers:


2

尽管我同意其中一项评论,即使用语音识别技术可能是一个不错的开始,但是这些声音是不同的,而且我不知道有人对分类进行过任何研究(Nathan引用的论文似乎只是在区分语音和噪音),因此除非有人提出与之相矛盾的东西,否则您将不得不发明自己的技术,这将需要大量的学习和大量的工作。我能做的最好的就是让您入门。

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

因此,您可能需要寻找的一些参数包括:

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

一旦有了一组您认为可以区分声音的参数,就需要使用某种统计方法对它们进行分类。语音中经常使用隐马尔可夫模型。您还可以研究logistic回归,K均值,我敢肯定还有其他选择,但是我认为HMM确实可行。


您的回答很好,但是我基本上是在要求用户将自己的声音与他以后使用我的软件时发出的声音进行匹配。喜欢,相似的东西。假设用户发出不同类型的声音A,B和C。这些声音的特征分别存储为C_A,C_B和C_C。
bad_keypoints 2013年

技术仍然是相同的:1.确定要测量的参数,2.测量它们,3.使用统计信息了解使每种声音不同的原因,4.使用该数据进行分类。
比约恩·罗奇

所以基本上就是我的想法。但是我想我将不得不从您提供的完整长列表中查看哪些参数,我将不得不标记这些参数以淡化声音。
bad_keypoints 2013年

1
老实说,我对能够在各种环境中区分手指拨动和电灯开关之类的东西感到非常悲观,而没有大量的示例数据和可能比我提供的参数更多的参数,但我希望我错了。即使需要一段时间,也请报告您的结果。
比约恩·罗氏

同样,在music-dsp邮件列表(music.columbia.edu/cmc/music-dsp)上的某些人可能还有其他建议。
比约恩·罗氏

0

当我尝试忽略电话中用于计算机语音识别的这类声音时,我将本文用于基于熵的端点,如果您尝试捕获的声音是语音,那么熵可以很好地工作,对于音乐来说,没有用。


0

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

训练

  • 确定适当的特征(例如,过零率,频谱重心,MFCC)
  • 检测发病
  • 计算输入音频的这些功能(您的手势记录)
  • 保留特征计算数据库。您将需要确定这是有监督还是无监督的培训情况。例如,用户是否事先指定快照为“声音1”,拍手为“声音2”,或者您的系统在训练后是否尝试将它们聚类。

分类

  • 实时检测发作并计算传入音频的特征
  • 使用距离度量(欧氏距离或另一个Lp距离)进行最近邻居或K最近邻居分类,以确定数据库中“最接近”的声音

纸打击乐音色识别可能是有些用处的。它概述了潜在特征的定义,以根据传入声音和作者的分类方法进行计算。这对于敲击声音非常有效,但对于语音(多个音节)之类的声音可能效果不佳,在这种情况下,HMM方法更合适。同样,您的发作检测的准确性会根据您要寻找的声音类型而有所不同。

如果您特别在意按键与灯光开关,请花点时间弄清楚哪些功能可以准确地区分两种声音。


我将通过检测传入音频数据的突然变化来检测发作。那应该工作。我正在检测要存储的手势的开始和结束。
bad_keypoints 2013年

是的,应该可以正常工作。我建议使用“光谱通量”的唯一原因是,无论如何您都将使用STFT。如果您希望在一个安静的环境中工作,那么基本的幅度阈值设置应该可以很好地工作。
greatscott 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.