首先,我从来没有做过任何音频编码。我想看看如何开始这个小项目,想象一下,你有一个 MP3 歌曲分成三个块,我如何比较一个文件的开头和另一个文件的结尾,看看它们是否应该按该顺序播放。
就像在播放过程中连续播放专辑一样,但您没有曲目编号。
我的想法是将音频的最后一部分与另一首的开头进行比较,并尝试找到匹配项,直到所有部分都匹配。
谁能指出我正确的方向?
这取决于它是如何分裂的。
MP3 文件是一个标题块,后面跟着一些数据,您可以在任何标题块处拆分文件,然后通过将它们连接在一起来组合它们。标题块中不一定有任何内容来说明它的顺序。(http://en.wikipedia.org/wiki/MP3#File_structure)
如果 MP3 文件是专辑中的单独曲目,它们将具有列出曲目编号的 ID 标签。有一些 python MP3 库 - 请参阅Accessing mp3 Meta-Data with Python
编辑:如果您的意思是分析音乐以便判断一个音符是否应该跟随另一个音符,那有点超出我的专业知识!
我认为您正在寻找如何完全通过它们的声音来排列曲目;也就是说,您拥有的唯一信息是音频信息。我不懂python,但我懂数字音频;这是您可以使用的算法。基本上,您需要一个差异度量来比较每个轨道的开始与其他轨道的结束。可能的指标包括速度、幅度和音色。我建议的方法基本上是尝试匹配波形。
任何方法都必须假设轨道之间没有寂静,并且它们从一个到另一个没有间隙地流动。不幸的是,大多数专辑并非如此。如果歌曲之间有沉默,除了去discogs.com或其他什么之外别无他法。我猜想这样的解决方案可能会减少工作量,并且肯定比您可以在合理时间内编写的任何脚本更可靠。
不过,这是我的建议:
您可能需要转换为 wave 才能执行上述操作。如果是这样,您可能会使用非常低的采样/比特率来最大程度地减少转换时间和 RAM 使用量。我不知道python有什么工具,但是如果你只能转换这些文件的开头和结尾,那肯定会提高性能!当然,您只需要在转换后从每一端存储几分之一秒。
量化“良好匹配”:要比较样本,您可以使用预测与真实之间差异的平方,将差异添加到对的每一端。添加导数比较意味着您必须弄清楚如何将导数差异与样本差异进行比较。
潜在问题
如果您正在处理 CD 质量的音频文件,该算法应该可以很好地工作。转换过程中可能发生了一些事情,导致轨道末端的信息丢失,这与上述情况大相径庭。丢失一秒的一小部分音频将完全破坏这种方法!
另一个潜在的症结是,如果你的斜率非常高,你看到的声音很可能是嘈杂的。如果是这样,那么我建议的比较容易出错。您可以进行自相关或其他操作以查看您的音频是否嘈杂(短时间尺度的低 ACF 表示噪音),然后降低真实/预测差异以支持斜率,甚至只是噪音。
一般来说,您可能希望根据您预测的跳跃幅度来衡量真实和预测之间的差异。如果您预测跳跃幅度较大,则应根据跳跃的大小考虑与预测值的偏差,因此当预测跳跃较小时,较大的偏差更重要。
另一种对该问题不太敏感的方法是使用 FFT 进行频谱分析,以便您的距离度量成为每个频率区间的幅度差异。这对瞬变很敏感(例如鼓声、吉他弹奏);使用非常小的分析窗口可能会减轻这个困难。我可以想象,除了上述过程之外,您还可以使用它,除非您仅将其用作肯定标准:如果开始/结束对是良好的光谱匹配,则可能表示真正的配对,但如果光谱数据匹配,因为瞬变破坏数据的可能性,它没有提供信息。或者,您可以使用长窗口,以便确保包含比较两端可能存在的任何瞬变。
最终,您使用的技术可能取决于您使用的音乐类型。如果你有一张硬摇滚专辑,那么很可能到处都是钹和失真的吉他,在任何地方看起来基本上都是一样的。另一方面,如果你在曲目的开头出现了突然的过渡,那么什么都不会起作用。
正如我所说,“手动”执行此操作可能是最可靠甚至最快的解决方案(考虑开发时间),除非您对大量 mp3 执行此操作。