# Shazam 听歌识曲：声音指纹的秘密

手机如何把几秒钟的录音变成声音指纹，再通过索引和时间对齐找到对应的歌曲。

By Xiaochuang DU

Topic: Computing, AI &amp; Electronics

[Open the interactive Jig](https://ask.jig.com/j/QdbDCfe8qQRQ)

## Transcript

### 1. 听几秒，认出一首歌

手机听到一小段音乐，就能寻找对应歌曲。接下来，我们把声音变成可以检索的指纹，看看这个过程如何完成。

本作是基于 Numa 原作《Shazam Algorithm Anatomy》制作的简体中文 Remix，讲解的方法出自 Avery Wang 2003 年发表的论文。在画面任意处拖动，可以转动装置。

### 2. 采集一小段声音

手机记录音乐片段。录音中可能混有说话声和环境噪声，我们需要从中提取有辨识度的特征。

片段通常只有几秒到十来秒。指纹是一份能认出某样东西的简短摘要，就像手指上独一无二的纹路。

### 3. 把声音展开成频谱

将声音分成短时间片，分析每片中不同频率的强弱，得到时频图。横向表示时间，纵深表示频率，柱子的高度与颜色表示强度。

发光的扫描门就是正在分析的那一小段时间。低频在托盘前侧，高频在后侧。

### 4. 留下稳定的特征点

挑选时频图中显著的局部峰值。大片声音数据被压缩成一组稀疏的特征点，用来描述音乐片段的局部结构。

金黄色的星点就是保留下来的峰值，连峰值原本有多响也会舍去，只记下时间和频率。试着加入噪声，看看有多少星点留了下来。

### 5. 配对，生成声音指纹

把一个峰值与附近峰值配对，将两个频率和时间差编码成哈希。每个指纹还带有它在片段中的时间位置。

被选中的峰值叫锚点，它与后方青色目标区里的几个峰值配对。哈希用的是时间差而不是绝对时间，所以录音从歌曲哪里开始都可以。

### 6. 用索引快速找候选

数据库预先保存歌曲的指纹。查询指纹可直接访问对应索引，取出候选歌曲及其时间位置，而不必逐首播放比较。

这就像图书馆的卡片目录：每个哈希都有自己的抽屉。2003 年的论文描述的曲库超过一百万首。

### 7. 用时间对齐确认匹配

单个指纹可能碰巧相同。如果许多指纹都指向同一首歌，而且录音与原曲的时间偏移一致，匹配证据就会集中起来。

粉色的高柱就是集中起来的证据。若以录音时间和原曲时间作图，真正的匹配会排成一条斜直线。

### 8. 从声音到歌名

采集片段、生成时频图、提取峰值、生成指纹、索引检索、时间对齐。镜头平滑拉远，回到完整装置，点亮识别结果。

这里演示的是经典音频指纹方法的原理，并不代表 Shazam 当前商业系统的全部内部实现；抽屉和立体装置只是帮助理解算法的视觉比喻。
