3

我似乎对看似非常微不足道的事情有很大的问题。

目标:尝试比较两个 Wav 文件,看看一个(小文件)是否是另一个(大文件)的一部分。

测试:首先,我录制了一段 1 分钟长的音频,并将 30 秒的音频导出到另一个文件。我首先尝试简单地读取 byte[] 数据并通过日志查看它,即使它们都来自同一个源文件,也绝对没有相关性?然后我尝试使用 WavFile 和 MusicG 等库,但我根本看不到两个“指纹”之间的任何关联,甚至看不到来自两个文件的原始字节 [] 数据?

问题分析这两个 Wav 文件的相似之处的最简单方法是什么?我已经阅读过,如果它们来自同一个源音频文件,它们应该是字节字节相同的。因此,对每个样本进行抽样,它们应该是相同的吗?这不是正在发生的事情吗?

现在我已经为这个问题搜索了很多,但几乎所有的答案都只完成了 25-50%,所以我觉得我在某个地方错过了一个很大的部分。

感谢您提供的任何解决方案!

[编辑]源音频文件只是一个 1 分钟的 Wav 文件......我从中提取了前 30 秒以创建较小的文件。然后我比较短(30 秒)和长(1 分钟)。我从 Audacity 以 1141kbps、16 位、Wav 的速度导出了两者。这是为了避免格式问题……我想

有关代码,请查看这个 UNANSWERED 问题:Wav comparison, same file

4

1 回答 1

3

这里发生了一些奇怪的事情。在不详细说明的情况下,我只想说,当某些程序执行您所谓的“提取”之类的简单操作时,它们并没有制作精确的副本。例如,当从 int 声音文件到 float(Audacity 内部使用的)返回 int 时,Libsndfile 不会透明地转换。如果 Audacity 使用 libsndfile (我很确定它确实如此),它不会制作文件的透明副本,因此您的方法将不起作用。例如:尝试以下操作:打开一个 wav 文件,使用相同的参数导出它。使用 diff 比较输入和输出。很可能,它们会有所不同。有关更多详细信息,请参见此处:http ://blog.bjornroche.com/2009/12/int-float-int-its-jungle-out-there.html

libsndfile 的作者在这里为他的设计决定辩护:http ://www.mega-nerd.com/libsndfile/FAQ.html#Q010

您可以尝试另一个应用程序,但我怀疑即使人们使用大胆,您也希望它能够正常工作。

其中一条评论建议互相关。您还可以使用音频指纹识别。不过,这两种解决方案都有些复杂。

可能最简单的解决方案是以本机格式读取数据。例如,如果文件是 16 位,则读取 16 位整数(不是字节)。然后将它与较短的比较,但比较允许一些错误(在我的脑海中,我很确定你永远不应该超过一个,但这是每次经历大胆的时候)。因此,与其问“这些值是否相等”,不如问“这些值是否在彼此的 epsilon 内”。当然,对于其中有很多沉默的事情,你会想要做一些例外。

Audacity 也有可能使用抖动,因此请确保已将其关闭。抖动会增加显着的噪音,因此如果您想将其纳入方程式,您将需要一个不同的解决方案。

于 2012-08-05T01:28:40.727 回答