我似乎遇到了一个看似非常微不足道的问题。
目标:尝试比较两个Wav文件,看看是否有一个(小文件)是另一个(大文件)的一部分。
测试:首先,我拍了1分钟长的音频并将其30秒输出到另一个文件。我首先尝试简单地读取byte []数据并通过日志查看它,即使它们都来自同一个源文件,也绝对没有相关性?然后我尝试使用诸如WavFile和MusicG之类的库,但我根本看不到两个“指纹”之间的任何关联,甚至是两个文件中出现的原始byte []数据之间的相关性?
问题: 分析这两个Wav文件的相似之处的最简单方法是什么? 我已经读过它们,如果它们来自相同的源音频文件,它们应该是字节字节相同的。因此,采取每个样本,他们应该是相同的?那不是发生了什么事吗?
现在我已经针对这个问题进行了相当多的搜索,但几乎所有的答案都只有25-50%完成,所以我觉得我在某个地方错过了一个巨大的片段。
感谢您提供的任何解决方案!
[编辑] 源音频文件只是一个1分钟的Wav文件...我从前30秒开始创建较小的文件。然后我比较短(30秒)到长(1分钟)。我从Audacity以1141kbps,16bit,Wav出口。这是为了避免格式化问题...我想
有关代码,请查看此UNANSWERED问题:Wav comparison, same file
答案 0 :(得分:3)
这里有一些奇怪的事情发生。在不详细说明的情况下,我只会说,当某些程序执行一个简单的操作时,就像你所谓的“提取”一样,它们并没有制作精确的副本。例如,Libsndfile在从int声音文件转到float(Audacity在内部使用)返回int时不会透明转换。如果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之内”。当然对于那些有很多沉默的东西,你会想要做出某种例外。
大胆也可能正在使用抖动,因此请确保已关闭。抖动会增加明显的噪音,因此如果您想将其与方程式一起使用,您将需要一个不同的解决方案。