# Shazam 是如何听音辨曲的？

- 作者：何宗丞
- 发布时间：2010-09-28 09:00
- 分类：公司
- 原文：https://www.ifanr.com/21133

我们常常会遭遇到这样的尴尬：在大街小巷邂逅一段熟悉的旋律，无奈又听不清歌词。遗憾也许这辈子就这样失之交臂了。

不必懊恼，Shazam 是一款能够识别音乐讯号的应用。相信不少朋友对它并不陌生。它在 iPhone 和 Andriod 手机里出现的频率很高，诺基亚的某些手机甚至预装了这样一款软件。

它的基本原理就是通过采集十几秒的声音样本，通过网络将音乐信号发回 Shazam公司，经过数据分析，很快便将该乐曲的相关信息发回手机。你对此一定不满足，幸运的是我们找到了开发者的一份材料。

我们都知道，一段音乐信号可以通过频谱图表示。横轴表示时间，纵轴为频率，另一个轴表示强度，即一个三维的频谱。那么，一条水平线代表一段连续的音频，垂直线代表一个瞬间的白噪声。如下图，图中的每一个点都代表特定时间点的频率强度，即为选定的“锚点”。图中的红色标记代表该时间点声音强度的峰值。

![](https://s3.ifanr.com/wp-content/uploads/2010/09/shazam-spectrogram1.jpg)

由开发者的材料看，他们大约是每秒提取 3 个锚点。然后，他们会把收集到的信息建成一个哈希表（Hash table），其键值就是频率。当 Shazam 收到一段音频，以下图为例，它会以第一个键值，即 823.44 Hz 搜索匹配项。

[![](https://s3.ifanr.com/wp-content/uploads/2010/09/thumb160x_frequencygraph1.jpg)](http://www.ifanr.com/21133/thumb160x_frequencygraph1)

哈希表可能如图所示：

![](https://s3.ifanr.com/wp-content/uploads/2010/09/frequencygraph2.png)

他们不只是标注频谱的一个点，而是一个点对，每个峰值加了第二次锚点，即一个散列的两个点的频率，这样就能减少搜索时因噪声干扰而可能产生的误差。

接下来就是检索的过程了，如果一段音频多次匹配，就会自动坚持这些频率所对应的时间是否与哈希表一致。当两个音频近似时，这些锚点连成一条连线，如果能检测出这条线，就说明音频匹配。

![](https://s3.ifanr.com/wp-content/uploads/2010/09/shazam-plot_011-360x262.jpg)

据悉，类似的技术最早由一家名为 Melodis 的公司推出，它推出的一款应用—— Midomi ，与 Shazam 相似。当然，也不乏基于电脑的应用，比如前不久测试的百度哼唱，是首次在国内推出的哼唱搜索引擎。  
搜索引擎发展的趋势就是越来越简单，越来越以人为本。在搜索引擎刚起步的阶段你能想到我们可以在移动设备上语音搜索 Google Map 吗？现在，我们可以想象了，有一天我们摆脱了键盘、鼠标，我们用感官，用意念，遨游于整个互联网。

Via [Gizmodo](http://gizmodo.com/5647458/)
