Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频。

1、AudioSystem获取音频

奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频率,我们的采样速率必须是人类听觉范围的两倍。人类能听到的声音频率范围大约在20Hz到20000Hz之间,所以在录制音频的时候采样率大多是44100Hz。这是大多数标准MPEG-1 的采样率。44100这个值最初来源于索尼,因为它可以允许音频在修改过的视频设备上以25帧(PAL)或者30帧( NTSC)每秒进行录制,而且也覆盖了专业录音设备的20000Hz带宽。所以当你在选择录音的频率时,选择44100Hz就好了。

定义音频格式:

public static float sampleRate = 44100;

public static int sampleSizeInBits = 16;

public static int channels = 2; // double

public static boolean signed = true; // Indicates whether the data is signed or unsigned

public static boolean bigEndian = true; // Indicates whether the audio data is stored in big-endian or little-endian order

public AudioFormat getFormat() {

return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,

bigEndian);

}

调用麦克风获取音频,保存到out中

public static ByteArrayOutputStream out = new ByteArrayOutputStream();1

try {

AudioFormat format = smartAuto.getFormat(); // Fill AudioFormat with the settings

DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

startTime = new Date().getTime();

System.out.println(startTime);

SmartAuto.line = (TargetDataLine) AudioSystem.getLine(info);

SmartAuto.line.open(format);

SmartAuto.line.start();

new FileAnalysis().getDataToOut("");

while (smartAuto.running) {

checkTime(startTime);

}

SmartAuto.line.stop();

SmartAuto.line.close();

} catch (Throwable e) {

e.printStackTrace();

}

获取到的out数据需要通过傅里叶变换,从时域信号转换为频域信号。

傅里叶变换

public Complex[] fft(Complex[] x) {

int n = x.length;

// 因为exp(-2i*n*PI)=1,n=1时递归原点

if (n == 1){

return x;

}

// 如果信号数为奇数,使用dft计算

if (n % 2 != 0) {

return dft(x);

}

// 提取下标为偶数的原始信号值进行递归fft计算

Complex[] even = new Complex[n / 2];

for (int k = 0; k < n / 2; k++) {

even[k] = x[2 * k];

}

Complex[] evenValue = fft(even);

// 提取下标为奇数的原始信号值进行fft计算

// 节约内存

Complex[] odd = even;

for (int k = 0; k < n / 2; k++) {

odd[k] = x[2 * k + 1];

}

Complex[] oddValue = fft(odd);

// 偶数+奇数

Complex[] result = new Complex[n];

for (int k = 0; k < n / 2; k++) {

// 使用欧拉公式e^(-i*2pi*k/N) = cos(-2pi*k/N) + i*sin(-2pi*k/N)

double p = -2 * k * Math.PI / n;

Complex m = new Complex(Math.cos(p), Math.sin(p));

result[k] = evenValue[k].add(m.multiply(oddValue[k]));

// exp(-2*(k+n/2)*PI/n) 相当于 -exp(-2*k*PI/n),其中exp(-n*PI)=-1(欧拉公式);

result[k + n / 2] = evenValue[k].subtract(m.multiply(oddValue[k]));

}

return result;

}

计算out的频域值

private void setFFTResult(){

byte audio[] = SmartAuto.out.toByteArray();

final int totalSize = audio.length;

System.out.println("totalSize = " + totalSize);

int chenkSize = 4;

int amountPossible = totalSize/chenkSize;

//When turning into frequency domain we'll need complex numbers:

SmartAuto.results = new Complex[amountPossible][];

DftOperate dfaOperate = new DftOperate();

//For all the chunks:

for(int times = 0;times < amountPossible; times++) {

Complex[] complex = new Complex[chenkSize];

for(int i = 0;i < chenkSize;i++) {

//Put the time domain data into a complex number with imaginary part as 0:

complex[i] = new Complex(audio[(times*chenkSize)+i], 0);

}

//Perform FFT analysis on the chunk:

SmartAuto.results[times] = dfaOperate.fft(complex);

}

System.out.println("results = " + SmartAuto.results.toString());

}

总结

以上所述是小编给大家介绍的Java实现Shazam声音识别算法的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

java 音色识别_Java实现Shazam声音识别算法的实例代码相关推荐

  1. java 音色识别_Java实现Shazam声音识别算法

    Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频 ...

  2. Java实现Shazam声音识别算法

    Java实现Shazam声音识别算法 Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理 ...

  3. java实现人民币数字转换中文大写的工具实例代码demo分享

    原文:java实现人民币数字转换中文大写的工具实例代码demo分享 http://www.zuidaima.com/share/1816208858221568.htm 刚好在项目里面用到了数字转化为 ...

  4. java 加密工具包_Java加密和解密算法调用工具包

    软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...

  5. java 二分查找_JAVA 实现二分查找算法。我知道你会,但没你想象的那么简单

    二分查找算法定义:二分查找(binary search),也称折半搜索,是一种在 有序数组 中 查找某一特定元素 的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结 ...

  6. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  7. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

  8. java二分法查找_java 中二分法查找的应用实例

    java 中二分法查找的应用实例 二分查找的前提是:数组有序 注意:mid的动态变化,否则出错!!! 实例代码: public class BiSearch { public static void ...

  9. java打开浏览器_Java调用浏览器打开网页完整实例

    这篇文章主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下 本文实例讲述了Java调用浏览器打开网页的方法.分享给大家供大家参考.具体实现 ...

最新文章

  1. ccf Markdown
  2. vs代码补全的快捷键_一款Python编程的自动补全插件神器——kite
  3. 记录一次nginx配置vhost的小bug
  4. 击溃音乐服务器第一人!周杰伦新歌首发,QQ音乐服务器一度崩溃
  5. 添加git 忽略文件
  6. mysql从挂了数据怎么恢复_详解MySQL误操作后怎样进行数据恢复
  7. L1-029 是不是太胖了 (5 分)—团体程序设计天梯赛
  8. 【软件工程】-可行性研究报告
  9. 【论文阅读】Pothole Detection Based on Disparity Transformation and Road Surface Modeling
  10. 人脸识别:路在何方?| 爱莫受邀参加VALSE Webinar报告会
  11. Windows 7 Boot Updater 如何使用
  12. iframe中加入html,HTML中IFRAME标签的使用
  13. 《headfirst设计模式》读书笔记9-迭代器和组合模式
  14. 进gmail不失去连接的办法之一
  15. 平安科技面试问题整理
  16. Programming Exercise 6:Support Vector Machines
  17. Java 实现sha_Java实现SHA-1算法实例
  18. 将.fig或其他图片文件转为Visio可编辑的.vsd文件
  19. 局域网中资源共享(FTP)
  20. 干货 :浅谈云音乐活动数据分析体系

热门文章

  1. 服务器升级如何维护,服务器维护更新升级的注意事项服务器教程 -电脑资料
  2. 产品经理技能,岗位职责,项目开发流程
  3. UI设计教程-界面设计构图
  4. Class 'Imagick' not found——thinkphp
  5. 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (四)——新版带界面 console 的使用
  6. 信息复制的革命:印刷术【提高信噪比】
  7. 芯片产业 - 常见流程和术语
  8. 零食商城java_java web 网上零食商城后端代码
  9. 32位系统中short、short int、int、long int、long、long long所表示数值的范围
  10. 扁鹊见王的故事——《重构》前言