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数组中有了完整的音频信息。第一步捕获音频信息完成了。