Sound2Sound 技术全解析 —— 让机器听懂人哼的歌
两种技术路线的根本差异
所有识曲应用可以分成两大类,各有自己的核心技术路线:
| 路线 | 代表产品 | 输入 | 核心技术 | 解决的问题 |
|---|---|---|---|---|
| 外部声源比对 | Shazam、SoundHound 听音识曲 | 外部播放的专业录音 | 音频指纹(Audio Fingerprinting) | "正在播放的是什么歌?" |
| 人声哼唱比对 | SoundHound 独有 | 用户自己的哼唱/唱歌 | Sound2Sound | "我脑子里记得这段旋律,是什么歌?" |
SoundHound 同时拥有这两条路线——橙色按钮默认走外部声源比对,你主动哼唱时走 Sound2Sound。
音频指纹回顾
先快速回顾一下音频指纹(Shazam 路线)的原理,方便对比:
- 把一段音频转换成频谱图(时间 × 频率 × 强度)
- 从频谱图中提取最亮的几个"峰值点"(类似于声音最响的时刻、对应哪个频率)
- 用这些峰值点的时间-频率坐标构成一段很短的"指纹"
- 用指纹去匹配数据库中每首歌的指纹
音频指纹的妙处是对噪音鲁棒——即使你在嘈杂环境中采集,只要那几个峰值点能被提取出来,就能匹配。但指纹只能来自专业录音,你哼出来的声音不可能和专业录音的波形一致。
Sound2Sound 的三步法
Sound2Sound 完全绕过了"波形比对",转而分析音乐的本质特征:旋律和节奏。
第一步:音高曲线(Pitch Contour)
不管你唱得好不好、用什么音色,一段旋律的核心是"什么时候变高了、什么时候变低了、每个音持续多久"。SoundHound 用 FFT(快速傅里叶变换)从你的哼唱中实时提取基频(F0),得到一条连续的音高曲线。
把音色信息全部丢掉——不管你是用假声、用胸声、男生唱低了五度、女生唱高了一个八度——只要音高变化的相对方向和时间间隔是对的,就保留下来。
第二步:音符分割(Note Segmentation)
连续的音高曲线还需要进一步切分成"音符"。SoundHound 检测音高曲线中的显著变化点(斜率突变),把曲线切成一段一段的音符。每个音符有两个属性:
- 音高值(归一化处理,不受整体偏高/偏低的影响)
- 持续时长
第三步:动态时间规整(DTW)匹配
现在你得到了哼唱的"音符序列"和数据库中每首歌的"音符序列"。但你可能唱得快了半拍、慢了一拍、某个音多唱了一拍。怎么容忍这些时间偏差?
SoundHound 用 DTW(Dynamic Time Warping,动态时间规整)算法来解决这个问题。DTW 允许两个序列在时间轴上做非线性的伸缩,找到最优的对齐方式。这意味着:
- 你把副歌第一句拉长了两倍,没关系
- 你跳过了一个间奏直接接第二段,也没关系
- 你某个音符唱短了一半,算法会自动对齐
为什么只有 SoundHound 在做这件事
不是没有人尝试过 Query by Humming(哼唱搜索)——实际上学术界从 2000 年就开始研究这个方向。但要把它做成一个可用的商业产品需要解决三个大问题:
- 数据库标注:需要大量的哼唱样本训练和校准匹配算法(SoundHound 从 2005 年就开始积累)
- 实时性:DTW 算法很耗算力,需要优化到能在手机端秒级完成
- 容错性:普通人哼唱的质量参差不齐,算法需要能容忍很大程度的不准确
SoundHound 之所以能成为唯一成熟的商业产品,一方面是积累的时间久,另一方面是它把 Houndify 语音 AI 的技术储备用到了哼唱识别上——两者都是"处理不完美的人声输入并从中提取结构"的问题。