音乐检测(不是识别)

Ben*_*ord 5 c# audio audio-processing

我正在尝试构建一个 C# 应用程序来检测视频中何时出现音乐。我可以找到任何需要的格式的音频。然而,我在音乐检测方面遇到了障碍。

有大量关于音频指纹识别以及如何用 C#/任何语言执行此操作的帖子。然而,我想要电影中音乐出现的大致进出时间,我不关心音乐是什么。

该音乐不太可能存在于任何指纹数据库中。因此可能是完全计算分析。

有什么巧妙的想法吗?或者我会最好地实现节拍检测算法并逐段处理它。然后估计入点/出点?

RBa*_*ung 4

我能想到的只有两件事可以清楚地区分“音乐”与所有其他音频/声音:

  1. 节拍:几乎所有创作的音乐都有节拍。理论上,这应该可以通过 FFT 检测到,但使用的频率范围约为 100 kHz。0.25hz 至 10hz(而不是通常的 20hz-20Khz)。在实践中?我不知道,但似乎值得一试。

  2. 调音:几乎所有专业音乐(包括专业歌手的声音(当他们有音乐伴奏时))的共同点,但与任何其他声音不同的是,它们都将采用 12 音平均律音阶的相同“调音”。换句话说,它们的频率总是被 2^(1/12) 的精确倍数隔开。一旦调整完成,它们将永远不会处于这些步骤之间的间隙中。正常声音(包括人声)分布在整个频谱中,但音乐几乎总是在音阶音符的 +/- 10 美分之内。

方法一不太靠谱,不知道有没有人试过。

但#2 是确定的,您实际上可以使用音频频谱分析仪看到这一点,但 FFT 必须具有非常高的辨别力(每倍频程至少 36 个分区)。但也有一些问题,例如:

  • 区分音乐和其他同时发生的声音/噪音
  • 弦乐器,如吉他和小提琴,经常使音符“弯曲”走调
  • 长号和无伴奏的人声,可以在音符之间“滑动”,或者使用“Just-temper”而不是“Equal-temper”作为和弦。
  • 以编程方式确定电影中不同位置的“曲调”(不一定是绝对的,只是在任何一首音乐中保持稳定)
  • 谐波:音符通常不仅仅是简单的正弦波,这意味着其中混合了很多谐波频率。和声不像音阶那样呈指数,它们是整数倍,因此它们与基音不一致。幸运的是,和声的幅度几乎总是低于基音,因此应该可以只“寻找峰值”。

嗯,这些都是我的“聪明”想法。现在这只是实施的一个小问题......;-)