c# - 音乐检测(非识别)

标签 c# audio audio-processing

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

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

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

有什么妙招吗?还是我最好实现节拍检测算法并逐个处理它。然后估计入/出点?

最佳答案

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

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

  2. 调音:几乎所有专业音乐都有的东西,包括专业歌手的声音(当他们有音乐伴奏时),但任何其他声音是他们都将处于 12 音等调音阶的相同“调音”中。换句话说,它们的频率将始终被 2^(1/12) 的精确倍数分隔开。一旦调整建立起来,它们将永远处于这些步骤之间的间隙中。包括人声在内的正常声音遍布整个频谱,但音乐几乎总是在音阶的 +/- 10 音分范围内。

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

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

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

好吧,这些是我的“聪明”想法。现在只是实现的一个小问题……;-)

关于c# - 音乐检测(非识别),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142674/

相关文章:

c# - 如何理解服务调用是 "Restful service call"还是 "standard wcf call"?

c# backgroundworker 无法使用我希望它执行的代码

ios - 通过 Spotify iOS SDK 获取用于可视化的 pcm 音频

audio - 相同音频文件的独特数字签名

android - Android-我可以从混音器中获取要播放的音频数据吗?

c# - 为什么我的 C 程序比对应的 C# 程序慢?

c# - 在 MVVM 中实现临时覆盖的最佳方式

audio - 识别 "ding-dong"声音

python - 为什么我的 8kHz wav 文件的 mel 特征在 sr = 16kHz 和 44.1kHz 中提取不同

python - 相同长度音频剪辑的不同 FFT 信号长度