java 音色识别_Java实现Shazam声音识别算法的实例代码
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声音识别算法的实例代码相关推荐
- java 音色识别_Java实现Shazam声音识别算法
Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频 ...
- Java实现Shazam声音识别算法
Java实现Shazam声音识别算法 Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理 ...
- java实现人民币数字转换中文大写的工具实例代码demo分享
原文:java实现人民币数字转换中文大写的工具实例代码demo分享 http://www.zuidaima.com/share/1816208858221568.htm 刚好在项目里面用到了数字转化为 ...
- java 加密工具包_Java加密和解密算法调用工具包
软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...
- java 二分查找_JAVA 实现二分查找算法。我知道你会,但没你想象的那么简单
二分查找算法定义:二分查找(binary search),也称折半搜索,是一种在 有序数组 中 查找某一特定元素 的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结 ...
- java super实例_java Super 用法详解及实例代码
java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...
- java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码
通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...
- java二分法查找_java 中二分法查找的应用实例
java 中二分法查找的应用实例 二分查找的前提是:数组有序 注意:mid的动态变化,否则出错!!! 实例代码: public class BiSearch { public static void ...
- java打开浏览器_Java调用浏览器打开网页完整实例
这篇文章主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下 本文实例讲述了Java调用浏览器打开网页的方法.分享给大家供大家参考.具体实现 ...
最新文章
- ccf Markdown
- vs代码补全的快捷键_一款Python编程的自动补全插件神器——kite
- 记录一次nginx配置vhost的小bug
- 击溃音乐服务器第一人!周杰伦新歌首发,QQ音乐服务器一度崩溃
- 添加git 忽略文件
- mysql从挂了数据怎么恢复_详解MySQL误操作后怎样进行数据恢复
- L1-029 是不是太胖了 (5 分)—团体程序设计天梯赛
- 【软件工程】-可行性研究报告
- 【论文阅读】Pothole Detection Based on Disparity Transformation and Road Surface Modeling
- 人脸识别:路在何方?| 爱莫受邀参加VALSE Webinar报告会
- Windows 7 Boot Updater 如何使用
- iframe中加入html,HTML中IFRAME标签的使用
- 《headfirst设计模式》读书笔记9-迭代器和组合模式
- 进gmail不失去连接的办法之一
- 平安科技面试问题整理
- Programming Exercise 6:Support Vector Machines
- Java 实现sha_Java实现SHA-1算法实例
- 将.fig或其他图片文件转为Visio可编辑的.vsd文件
- 局域网中资源共享(FTP)
- 干货 :浅谈云音乐活动数据分析体系
热门文章
- 服务器升级如何维护,服务器维护更新升级的注意事项服务器教程 -电脑资料
- 产品经理技能,岗位职责,项目开发流程
- UI设计教程-界面设计构图
- Class 'Imagick' not found——thinkphp
- 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (四)——新版带界面 console 的使用
- 信息复制的革命:印刷术【提高信噪比】
- 芯片产业 - 常见流程和术语
- 零食商城java_java web 网上零食商城后端代码
- 32位系统中short、short int、int、long int、long、long long所表示数值的范围
- 扁鹊见王的故事——《重构》前言