如何使用音高检测将音频转换为一系列音符?

信息处理 声音的 沥青 音乐
2022-02-07 14:21:39

我设置了一个很好的音高检测系统,我想在给定一组音频样本的情况下返回一系列音符。

我目前的方法如下:我有一个跨越音频信号的移动窗口,我计算每个窗口的音高。之后,我通过检测静音区域(即音高检测器返回空值的位置)将音频分割成不同的音符。然后我简单地取每个音符区域的平均值。

不幸的是,这并没有给我带来这么好的结果。音高检测器看起来确实很准确,但问题是它似乎不能很好地分割音符。只有当我在录制音频时在每个音符之间留有长时间的停顿时,它才真正起作用。我想要一些方法来检测音符的变化,而不必依赖一个大的静音区域。

任何想法将不胜感激!

3个回答

这应该使用幅度谱的逐箱差的阈值来工作。

  • 计算当前窗口的绝对 fft 并将其标准化。
  • 与最后一个窗口的归一化 abs fft 进行 bin-wise 差异。
  • 总结 bin-wise 差异并将其与阈值进行比较。

解释:音符的变化意味着 fft bin 上能量分布的变化。因此,如果发生音符变化,则二进制差异的总和应该很高。归一化是为了抑制由于音量变化而对音符变化的错误检测。

一种简单的方法是检测静音的替代机制,为您提供更充足的响应时间。如果您的静音检测器检测到静音,您可以返回 null,否则返回音高检测器的状态。如果您对音高检测器感到满意,那么这样做的好处是不需要对其进行修改。

您可以尝试寻找高振幅或增量振幅的起音,而不是寻找音符衰减到静音,并将它们与以下估计的音高相关联,如果该音高在不久之后检测到的话。

您可以让您的音高检测器返回,不仅是估计的音高,而且还有一些统计概率或音高的可靠性因素是给定音乐律中的某个音符(相对于噪音,或其他一些音符,或音符之间的中间等) . 然后在您的音高检测流中查看两个相邻检测到的音符的概率值何时交叉。

如果训练 ML,您可能会查看“注释”箱权重的推理向量返回的值,并比较比率。