识别音乐文件中的乐器

信息处理 频谱 Python 音乐 分类
2022-02-02 08:37:01

假设我有一个包含一些乐器的文件,如何识别每个乐器的名称(最终目标)或至少它们所属的类别,如管乐器?例如,如果我加载包含吉他、钢琴和贝司的音乐文件,我希望输出为“吉他、钢琴、贝司”,或者至少是类别的名称。我可以通过频率、密度、频谱等来做吗?

我的目标是编写一个可以对仪器进行分类的代码,而不必使用深度学习,如果可能的话,只进行信号处理。例如,我试图了解钢琴声音和吉他声音的区别,但我没有太多运气将它整合到代码中。

您建议我如何对乐器进行分类,我应该遵循哪些步骤?

编辑:如果不可能将几种乐器混合在一起,我如何使用频率分析或类似方法识别单个乐器?

1个回答

由于缺乏声誉,我无法发表评论,并在此回复作为答案。

一般来说,这是一个极其困难的问题,因为仪器种类繁多,而且它们的变化很大。一个相关的问题是使用按键的声学测量来识别在键盘上按下的按键,这里已经尝试了混合结果该问题最稳健的解决方案本质上是为每个键创建匹配过滤器,这是通过单独记录每个键或使用一些不包含同时击键的已知训练集来执行的。当尝试检测未包含在训练数据中的不同键盘上的键时,此解决方案通常会失败。

要将其等同于您的问题,这就像记录您要检测的每种乐器的每个音符并与之匹配过滤。主要区别在于,在音乐中,多个乐器可能同时演奏,并且可能一次演奏多个音符(即和弦)。为了克服这个问题,可以在频域中执行匹配滤波器,而不是使用短时傅里叶变换,并允许滤波器中的公共和弦。然而,每台仪器都有其独特的谐波响应,这使得将您的检测推广到您没有训练过的仪器具有挑战性。如果您试图检测训练数据之外的仪器,

假设您能够让频域匹配滤波器相对一致地工作,您几乎肯定会遇到大量误报。为了改善这一点,您可以实现一个概率模型,该模型仅在仪器在某个窗口内的给定时间百分比内存在时才宣布检测。

正如其他人所提到的,许多其他人已经尝试过这种方法,但成功有限,我相信其他人之前也尝试过实施上述方法。但是,如果你只是想检测你用最简单的音乐训练过的乐器,你可能会取得一些合理的成功。到那时,机器学习甚至可能有机会。