【案例】Shazam识别音乐

from《数据挖掘技术:应用于市场营销、销售与客户关系管理》


背景:
1. 是个手机APP,收到的音频可能有许多噪音
2. 用户输入的是一个音乐片段,而不是整首歌,因此不能直接做两个音频的对比

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