【案例】Shazam识别音乐
from《数据挖掘技术:应用于市场营销、销售与客户关系管理》
背景:
1. 是个手机APP,收到的音频可能有许多噪音
2. 用户输入的是一个音乐片段,而不是整首歌,因此不能直接做两个音频的对比
过程:
1. 音频签名:纵轴是频率,横轴是时间,每半秒钟取样一次
→ 缺点:同一首歌的音频签名可能很不一样,因为有背景噪音等
2. 使用星点图,只取峰值点,这样就key减少背景噪音和压缩对谱图的影响
3. 相似度计算
1)星点图每个点包含的字段
a. 频率
b. 时间
c. 强度
2)如果是两首完整的歌,直接对比星点图中相同点所占的比例作为相似度就可以,然而音乐片段不行,因为x轴坐标不同
3)时间片:
a. 将片段视为一个时间片,与音乐分割的时间片进行对比;如果两个时间片有超过90%的峰值匹配,就认为两个时间片匹配
b. 计算片段与音乐重叠的部分长度,作为距离
c. 计算量很大,因为要对比每个峰值【而且用户唱得慢了或快了怎么办?】
4)锚点距离:
a. 以某个时间点最高峰值作为锚点,其后续一段时间和频率内的星点作为对应点
b. 计算锚点与星点之间的线
c. 对于每一对锚点与星点(锚),包含如下信息:
· 时间差
· 频率差
· 锚点本身的时间和频率
d. 匹配片段和歌曲之间的锚,如果两个片段之间有足够多的锚可以匹配,则两个片段相匹配
e. 如图,从41秒开始逐渐有相匹配的锚
4. 具体实现方法
1)将歌曲片段转换成星点图
2)将星点图转换成各个锚点
3)创建锚和峰值对
4)识别歌曲和片段之间的匹配锚
5)确定片段和每首歌曲之间最长的连续重叠序列
6)返回重叠最长的歌曲