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