java - 将录制的音频转换为数字数据
问题描述
我正在制作一个 Java 个人项目,您可以在其中录制自己唱歌的歌曲,该程序将加载一首与该旋律最匹配的歌曲(从预先选择的小选择中)。到目前为止,我已经实现了用户使用 Java Sound API 将音频文件录制为 WAVE 文件的功能。我已经看到,对于音频相似性,可以在音频文件之间执行相关性,并通过测量相关图中是否存在高幅度峰值,可以确定音频文件是否相似。
我在信号处理堆栈交换https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar中阅读了以下帖子 其中谈到使用快速傅立叶变换来完成卷积(适用于延时音频的相关性)。我已经在 Github 上导入了 JTransforms 项目以使用 FFT,但我不确定如何将 WAVE 文件转换为可用于执行相关或卷积的数字表示(类似于大型值数组)。非常感谢任何有关如何解决此问题的建议!
解决方案
要阅读 .wav,您将使用 .wav 类AudioInputStream
。教程“使用文件和格式转换器”中提供了一个示例,这是文章中的第一个代码示例,位于“读取声音文件”部分。
下一个障碍是将字节转换为有意义的 PCM。在上面的代码示例中,有一个注释行,内容如下:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
这就是您可以将字节转换为 PCM 的地方。确切的算法取决于您可以通过AudioInputStream
'sgetFormat
方法检查的格式,该方法返回一个AudioFormat
.
该格式将告诉您每个 PCM 值有多少字节(例如,16 位编码是每个 PCM 值两个字节)和字节顺序,可以是小端或大端。如果音频是立体声,则 PCM 值在左右交替。
从字节构建 PCM 值涉及位移。我猜你知道如何处理这个问题。假设数据是有符号 PCM 格式,创建 16 位值的自然结果将是有符号短整数。因此,最后一步通常是除以 Short.MAX_VALUE 以将短裤转换为从 -1 到 1 的有符号浮点数。
推荐阅读
- html - 关于html中项目的想法
- python - 将用 selenium 编写的 pythone 代码转换为 scrapy 或 requests
- javascript - 闭包:范围链变量 - 不确定变量如何链接
- database - Firebase Firestore 监听集合中文档的变化
- java - 为什么在 Linux 中单击所有者时模式窗口的顺序会发生变化
- java - 将 connectionTimedOut 设置为 1 秒会引发 Socket Timed Out 错误
- c++ - 从 python 调用 openMP 共享库时未定义的 opnMP 函数
- django - 如何使用 postgresql 在 django 中处理数据库连接池
- reactjs - 使用 Radium 检查复选框时设置其标签的样式
- makefile - 如何通过make文件中的子字符串连接命令?