像 Shazam 这样的服务通过创建音频片段的独特“指纹”并将其与预计算指纹数据库进行比较来执行音频匹配和搜索。这个过程涉及三个主要阶段:生成音频的紧凑表示、高效索引指纹以及执行快速相似性搜索。目标是即使输入音频嘈杂、截断或在非最佳条件下录制,也能识别匹配。
首先,音频指纹技术通过使用短时傅里叶变换 (STFT) 等技术将原始音频信号转换为声谱图来开始。这揭示了音频随时间变化的频率内容。声谱图中的关键点,例如特定频带中的局部最大值,被识别为“地标点”。例如,在 10 秒时发生的 1 kHz 峰值可能与 2 秒后发生的 2 kHz 峰值配对。这些地标点对被转换为哈希值——一种编码峰值之间时间和频率关系的数字表示。这个哈希步骤将音频缩减为一组唯一的标识符,同时容忍微小失真。
接下来,系统依赖于为快速查找优化的数据库。每首存储的歌曲都会进行预处理以生成其指纹,然后使用倒排索引或哈希表进行索引。例如,一个哈希值如“A3F9”可能映射到一个歌曲和时间戳列表,表示该哈希值出现的位置。当用户查询一个片段时,Shazam 提取其哈希值并在数据库中搜索匹配项。为了处理规模问题,通常使用分布式系统或经过优化的数据结构,如后缀树。索引还考虑了变化——例如速度变化——通过在匹配过程中允许哈希之间的灵活时间对齐。
最后,匹配算法通过分析时间一致性来识别最可能的候选对象。如果查询片段中的多个哈希值在时间上与存储的歌曲对齐(例如,查询中的哈希值间隔 5 秒,与存储歌曲中 5 秒的间隔匹配),则匹配的置信度会增加。统计方法,例如计算时间窗内重叠的哈希值,有助于过滤假阳性。例如,一个 10 秒的片段可能产生 100 个哈希值,如果其中 70 个与一首歌曲的时间线对齐,则确认匹配。这种方法平衡了速度和准确性,即使使用部分或质量下降的音频输入也能实现实时识别。