将录制的音频转换为数字数据

Turning Recorded Audio into numerical data

我正在制作一个 Java 个人项目,您可以在其中录制自己演唱的歌曲,该程序将加载一首与该旋律最匹配的歌曲(从预先选择的一小部分中选择)。到目前为止,我已经实现了用户使用 Java 声音 API 将音频文件录制为 WAVE 文件的功能。我看到对于音频相似度,可以将音频文件之间进行相关,通过测量相关图中是否存在高幅度峰值,可以判断音频文件是否相似。

我在信号处理堆栈交换中阅读了以下内容post https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar 讨论了使用快速傅里叶变换来完成卷积(适用于延时音频的相关性)。我已经在 Github 上导入了 JTransforms 项目以使用 FFT,但我不确定如何将 WAVE 文件转换为可用于执行相关或卷积的数字表示形式(类似于大量值)。非常感谢任何关于如何解决这个问题的建议!

要阅读 .wav,您将使用 class AudioInputStream。教程中提供了一个示例“Using Files and Format Converters 这是文章中的第一个代码示例,位于“读取声音文件”部分。

下一个障碍是将字节转换为有意义的 PCM。在上面的代码示例中,有一个注释行显示为:

  // Here, do something useful with the audio data that's 
  // now in the audioBytes array...

这就是您可以将字节转换为 PCM 的地方。确切的算法取决于您可以通过 AudioInputStreamgetFormat 方法检查的格式,其中 returns 和 AudioFormat.

格式会告诉您每个 PCM 值有多少字节(例如,16 位编码是每个 PCM 值两个字节)和字节顺序,可以是小端或大端。如果音频是立体声,则 PCM 值在左右交替。

从字节构建 PCM 值涉及位移位。我猜你知道如何处理这个。假设数据是带符号的 PCM 格式,创建 16 位值的自然结果将是带符号的短整数。因此,最后一步通常是除以 Short.MAX_VALUE 将短裤转换为从 -1 到 1 的有符号浮点数。