我有兴趣确定音频样本的音乐键。算法如何(或可能)试图逼近音乐音频样本的密钥?
Antares Autotune和Melodyne是两款完成此类工作的软件。
任何人都可以给一些外行人解释这是如何工作的吗?通过分析和弦进行的频谱等,以数学方式推断出歌曲的关键。
这个话题让我很感兴趣!
编辑 - 每个为此问题做出贡献的人都可以找到精彩的来源和丰富的信息。
尤其来自:the_mandrill和DanielBrückner。
答案 0 :(得分:57)
值得注意的是,这是一个非常棘手的问题,如果你没有信号处理的背景(或者有兴趣了解它),那么你将面临非常令人沮丧的时间。如果您期望在问题上抛出几个FFT,那么您将不会走得太远。我希望你有兴趣,因为它是一个非常迷人的领域。
最初存在音高识别的问题,对于使用诸如自相关或谐波和频谱的方法(例如参见Paul R的链接)的简单单声道乐器(例如语音)而言,这是相当容易的。但是,你经常会发现这会产生错误的结果:你通常会得到你所期望的音高的一半或两倍。这称为音高周期加倍或倍频程错误,它主要是因为FFT或自相关假设数据随时间具有恒定特性。如果你有一个人类演奏的乐器,总会有一些变化。
有些人将键识别问题解决为首先进行音高识别然后从音高序列中找到键的问题。如果除了单声道音高序列之外还有其他任何东西,那么这就是难以置信的难度。如果你确实有单声道音高序列,那么它仍然不是确定键的明确方法:例如,如何处理彩色音符,或确定它是主音还是小音。所以你需要使用类似于Krumhansl的key finding algorithm。
的方法因此,考虑到这种方法的复杂性,另一种方法是查看同时播放的所有音符。如果你有和弦,或者有多种乐器,那么你将会有很多正弦波一起播放的光谱汤。每个音符由多个谐波组成一个基频,因此A(440Hz)将由440,880,1320处的正弦曲线组成...此外,如果你演奏E (见diagram表示音高)然后是659.25Hz,几乎是A的1.5倍(实际上是1.498)。这意味着A的每个三次谐波都与E的每个二次谐波一致。这就是和弦听起来令人愉快的原因,因为它们共享谐波。 (顺便说一下,西方和谐发挥作用的全部原因是命运的怪癖,即权力7的第二根2接近1.5)
如果你超越这个第5区间的主要,次要和其他和弦,那么你会发现其他比率。我认为许多关键的发现技术将枚举这些比率,然后填充信号中每个谱峰的直方图。因此,在检测和弦A5的情况下,您可能会在440,880,659,1320,1760,1977找到峰值。对于B5,它将是494,988,741等。因此,创建一个频率直方图,并为每个信号中的正弦峰值(例如来自FFT功率谱)增加直方图条目。然后,对于每个键,A-G将直方图中的区间计算在一起,而条目最多的区域最有可能成为您的关键。
这只是一个非常简单的方法,但可能足以找到弹奏或持续和弦的关键。您还必须将信号切割成小间隔(例如20ms)并分析每个信号以建立更稳健的估计。
编辑:
如果你想进行实验,我建议你下载一个像Octave或CLAM这样的软件包,这样可以更容易地显示音频数据并运行FFT和其他操作。
其他有用的链接:
答案 1 :(得分:17)
我曾在大学录制过两年多的复音CD录音问题。这个问题非常困难。与问题相关的第一篇科学论文可以追溯到20世纪40年代,到目前为止还没有针对一般情况的可靠解决方案。
你通常阅读的所有基本假设并不完全正确,而且大多数都是错误的,除了非常简单的场景之外,它们都无法用于所有事情。
泛音的频率不是基频的倍数 - 存在非线性效应,因此高部分偏离预期频率 - 而不仅仅是几赫兹;找到你预期的第6个部分并不罕见。
傅里叶变换不对音频分析起到很好的作用,因为人们感兴趣的频率是对数间隔的,而傅里叶变换产生线性间隔的频率。在低频时,你需要高频率分辨率来分离相邻的音高 - 但是这会产生糟糕的时间分辨率,并且你会失去快速连续播放单独音符的能力。
录音(可能)不包含重建乐谱所需的所有信息。我们音乐感知的很大一部分发生在我们的耳朵和大脑中。这就是为什么一些最成功的系统是拥有大量知识库的专家系统,这些知识库关于(西方)音乐的结构,只依赖于信号处理的一小部分来从录音中提取信息。
当我回到家时,我会查看我读过的文件并选择20或30个最相关的文件并在此处添加。我真的建议你在决定实施之前先阅读它们 - 如前所述,大多数常见的假设都有些不正确,你真的不想重新发现所有这些在实施和测试时发现和分析超过50年的事情。
这是一个很难的问题,但它也很有趣。我真的很想听听你的尝试以及它的效果。
现在您可以查看Constant Q变换,Cepstrum和Wigner(-Ville)分布。还有一些关于如何从短时傅立叶光谱相位的频移中提取频率的好文章 - 这允许使用非常短的窗口尺寸(用于高时间分辨率),因为频率可以精确地确定几倍大1000倍而不是基础傅立叶变换的频率分辨率。
所有这些变换都比普通的傅立叶变换更适合音频处理的问题。为了改善基本变换的结果,请看一下能量重新分配的概念。
答案 2 :(得分:6)
您可以使用Fourier Transform计算音频样本的频谱。从此输出中,您可以使用frequency values for particular notes将其转换为样本中听到的音符列表。选择一系列样本中每个样本听到的最强音符应该为您提供一个体面的不同音符的地图,您可以将其与不同的musical scales进行比较,以获得包含该音符组合的可能音阶列表
为了帮助确定使用哪种特定音阶,请记录最常听到的音符(不是双关语)。在西方音乐中,音阶的根源通常是听到的最常见音符,其次是第五音,然后是第四音。您还可以查找常见chords,arpeggios或progressions等模式。
样本大小在这里可能很重要。理想情况下,每个样本都是一个音符(这样你就不会在一个样本中得到两个和弦)。如果你filter出去并专注于低频,你可以使用通常与打击乐器相关的音量峰值(“咔嗒声”)来确定歌曲的节奏并将你的算法“锁定”到节拍音乐从长度为半拍的样本开始,然后从那里进行调整。准备丢弃一些没有大量有用数据的样本(例如在幻灯片中间拍摄的样本)。
答案 3 :(得分:5)
据this article我所知,各种键都有自己的共同频率,所以它可能会分析音频样本以检测最常见的音符和和弦。毕竟,你可以拥有多个具有相同锐利和平面配置的键,区别在于键开始的音符,因此是这些键的和弦,所以看起来重要的音符和和弦出现的频率是多少。唯一可以解决这种问题的真正方式。我并不认为你可以在不遗漏大量信息的情况下得到外行人对实际数学公式的解释。
请注意,这是来自在这方面绝对没有经验的人,他的第一次曝光是在这个答案中链接的文章。
答案 4 :(得分:3)
这是一个复杂的主题,但确定单个键(单个音符)的简单算法如下所示:
对包含该注释的样本的一部分进行傅里叶变换,假设4096个样本(确切大小取决于您的分辨率要求)。确定光谱中的功率峰值 - 这是音符的频率。
如果您有和弦,不同的“乐器/效果”或非同音乐音乐模式,事情会越来越紧张。
答案 5 :(得分:1)
首先,您需要pitch detection algorithm(例如autocorrelation)。
您可以使用您的音高检测算法在多个短时间窗口中提取音高。之后,您需要查看采样音高最适合的音乐键。
答案 6 :(得分:1)
如果您现在需要对一堆歌曲进行分类,那么请使用Mechanical Turk之类的内容来解决问题。
答案 7 :(得分:1)
分析关键与分析音高不是一回事。不幸的是,关键的整个概念有些含糊不清,不同的定义通常倾向于只分享主音的概念,即中心音调/和弦。即使存在一个良好的自动转录系统,也没有可靠的确定密钥的算法。