机通感:使用图像处理算法audioanaliz





如果你只是想看看的Python代码,请按照 GitHub上库。

对于使用笔记本电脑IPython的材料的准备工作。您可以在<一个它下载href="http://nbviewer.ipython.org/urls/raw.github.com/jminardi/audio_fingerprinting/master/Computationalsynesthesia-JackMinardi.ipynb">ссылке.

Audioanaliz使用图像处理算法 H4>图形处理器都设计有一个单一的目的 - 模拟光的物理性质,但现在我们把它们用于各种人,各种任务。是有可能使用图像处理算法常规区之外?为什么不将它们用于信号处理的?

为了研究这个问题,我决定使用模板匹配和图像,以确定音频的方法。经典算法需要一个图象和模板和返回到图像的图案部分的相似性,任何程度。我的任务是确定该歌曲到一个数据库,它是在音频样本的一部分,使用比较的掩模的方法(这就是使沙札姆或SoundCloud的)。

预处理数据 H4>的音频数据被表示为一维均匀分布在时间离散样本的阵列。单图像通常是存储和处理二维数组,所以我不得不以某种方式引入录音在两个方面。最原始的方法 - 仅仅是重新格式化二维一维数组

然而,在实践中,这应谨慎进行。让我们假定,我们开始捕捉从半秒的数据库中的记录开始后一源音频 - 所得这两个条目的二维阵列将有很大的不同。两峰均位于附近,可能会意外地是在样品的两端。



显而易见的是,第二图像是其一部分(子样品)之首。

与面具一个简单的比较算法始终把面具的形象和比较中(其中,这已经是一个功能 match_template I>在 skimage.feature I>)。在这种方式中使用的算法,将不能够识别上述多个呈现的更小的图像。



正如你所看到的, match_template i>的给出了一个非常低的匹配与图像的任意部分模板的机会。

我们使用傅立叶变换 H4>敏感性移时间范围可以被减少到最低程度,如果忽略时间轴和去的信号的电平。这是通过使用离散傅立叶变换(DFT)进行,并做快速 - 使用快速傅立叶变换,或FFT(如果需要对FFT和DFT的更多信息,可以看到的帖子 Vanderplasa杰克(杰克VanderPlas))。

如果我们将傅立叶变换到每一列格式化我们的信号,我们得到的谐波如何随时间变化的一个想法。事实证明,这是创建谱图时广泛使用相当普遍的技术。

在其核心,傅立叶变换告诉我们它的信号的频率的具有最高能量。因为谐波音频通常随着时间而改变,则该频谱中包含属性的时间和频率域。

让我们来看看测试声音频谱段:



正如你所看到的,图为两条水平线。这意味着,音频是由一组的两个信号不变的。说来也巧,因为测试的记录 - 比两种不同频率的正弦信号的总和罢了

现在我们有一些像图像,理论上,我们的方法能够很好地处理一个子样本,在时间上移位。让我们来测试我们的理论:



成功了!该功能 match_template i>的告诉我们,这两个“图像”有很强的相关性。但是,如果该算法的工作用的声音,这是东西多的正弦信号只是一个总和?

的实际数据 H4>我要确保我的电脑是能够确定哪些预定的系列节目正在播放。作为一个例子,我将使用1季动画系列<一href="http://images3.wikia.nocookie.net/__cb20121206013652/adventuretimewithfinnandjake/images/f/fe/Horse_gif.gif">Adventure时间。我在子目录保存11 WAV档案(每个情节) adv_time I>。



在产生的图形高峰!函数的 match_template i>的定义什么子样品是原始音频轨道的一部分。然而,该算法比较了20秒太长。为了加速这一过程,我们需要“减肥”的一些数据。

让我们问奈奎斯特 H4>一个叫哈利奈奎斯特人向我们表明,我们能够可靠地识别率最高,相当于采样频率的一半。



44.1 kHz的采样率意味着我们可以确定的音频频率高达22千赫。这是足够的,因为人耳感知内只有20千赫 的频率。

然而,在频谱上面它表明感兴趣几乎所有的数据都在上半部分,而最大的数量 - 在前八。看来有用的信息的范围中包含的音带冒险时间,甚至接近人类感知的上限。这意味着我们可以生产出重采样步骤8,而不会损失太多的重要信息。



要好得多。下采样加快功能的15倍,同时还给予一个明确的信号背景环境噪声,这是71%。但是,我想进一步加快数据的过程中,再切削量。如果我们花更多的时间在子采样时间,然后我们开始失去一个重要的高频率的信息。但它是可以进行量化。

我们再次纷纷加快至4倍,仍然保持了良好的信号/噪音比!我很高兴与算法的速度。现在我可以用一个两小时的五秒钟的音频轨道的比较样品在不到一秒的时间。但是有一个最后的测试。到目前为止,我们已经使用了雕刻出从数据库中记录的子样本。我需要了解使用麦克风的算法样品,是否记录。



实验的结果在下面的代码之后呈现。首先,我准备了一个音轨每一集,并将其保存在目录商店 I>。然后我用了 pyaudio 在他的笔记本电脑来记录从电视冒险时间插曲的声音。







有用!正如你所看到的,在结果图显示了一个峰值,这意味着程序正确识别本赛季的第一个情节。我写的代码能够确定的第一个11集的系列冒险时间与足够的精度,在不到3秒。

结论 H4>我能够使用的图像处理算法超出了他们的正常应用。我创造了很好的应用,识别记录。也许正是意识到不是最好的(我敢肯定,Shazaam采用了更高效的算法),但其创作给我留下了几个令人愉快的经历。我曾尝试使用带有屏蔽比较其它方法,例如,调制角和SURF(见 github上),但是经典的方法是最明显和容易执行。进一步的工作,可向其他的方法的研究。

我没有写干净的代码,有效地利用计算机的内存,并且我认为这是可能的挤了很多更多的性能。除了有关与内存工作的问题,这些算法仍有许多问题需要解决 - 我并没有花很多时间优化的。进一步的研究可能揭示子采样时间和频率所有的美丽。我也想尝试的样品和其欠的长度。

我想测试算法的可靠性与不同的音频源一起工作。持有我失望抽样不依赖于使用我的声音的具体类型,但可能会破坏一切,如果你连接其他音源。

所有的代码都可以在 github上

资料来源:<一href="http://geektimes.ru/company/audiomania/blog/251144/">geektimes.ru/company/audiomania/blog/251144/