shazam 音频指纹 听歌识曲 原理(附代码)

shazam 音频指纹 听歌识曲 原理

如何用java来实现shazam?

几天以前我读了一篇论文 :How shazam works?(shazam的工作原理)
这让我有了自己写一个java版本的shazam的兴趣。

关于shazam

shazam的核心功能是类似于网易云音乐和QQ音乐中的“听歌识曲”,当你开启听歌识曲功能以后,仅需要两三秒,便可以知道正在播放的歌曲叫什么。
当我第一次使用听歌识曲时:太神奇辽!!!这是怎么做到的???即便当我使用听歌识曲功能好几次以后,我依然感觉超级神奇!
如果自己用java来写一个听歌识曲的小程序那不是更酷吗哈哈哈哈,我开始依照shazam的论文来搞这个东西。
这就是我过去两天的课余小项目。

录入歌曲。。。!!!

要做的第一件事就是把一段样本录入java中。以前从来没有做过音频类的东西,所以有多难我也不清楚。
可是事实证明是,超级简单!!!!

final AudioFormat format = getFormat(); //Fill AudioFormat with the wanted settings 
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();

现在我们就可以从TargetDatLine中读取数据了,就像读取普通数据流一样。

// In another thread I start: 

OutputStream out = new ByteArrayOutputStream();
running = true;

try {
    while (running) {
        int count = line.read(buffer, 0, buffer.length);
        if (count > 0) {
            out.write(buffer, 0, count);
        }
    }
    out.close();
} catch (IOException e) {
    System.err.println("I/O problems: " + e);
    System.exit(-1);
}

使用这个方法就可以打开麦克风来记录下音频信息了。个人采用记录音频的格式为:

private AudioFormat getFormat() {
    float sampleRate = 44100;
    int sampleSizeInBits = 8;
    int channels = 1; //mono 
    boolean signed = true;
    boolean bigEndian = true;
    return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
}

所以,我们在 ByteArrayOutputStream数组中有了完整的音频信息。第一步捕获音频信息完成了。

这。。。是个啥&#x

  • 17
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 88
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 88
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值