我想检测的不是音高,而是要检测演唱音符的 音高等级 。
因此,无论是C4还是C5都不重要:必须将它们都检测为C。
想象一下摆在钟面上的12个半音,而指针指向音高等级。那就是我所追求的!理想情况下,我想知道唱的音符是亮点还是小点。
这不是先前问题的重复,因为它引入了以下约束:
声源是 单一的人类声音 ,希望其背景干扰可以忽略不计(尽管我可能需要处理)
八度不重要, 只有音高等级
其他答案中引用的大多数频率检测算法不适用于语音。要了解为什么如此直观,可以考虑将所有语言的元音都唱到一个特定的音符上。即使所有这些元音具有不同的频率成分,也必须将它们全部检测为同一音符。任何用于语音的音符检测算法都必须以某种方式考虑到这一点。此外,人类的语音和歌曲包含许多擦音,其中许多没有隐含的音调。
在一般(非语音情况下)中,您要查找的功能称为 色度功能, 并且在该主题上有相当多的工作要做。它等效地称为 谐波音调等级分布 。关于该概念的原始参考文件是Tayuka Fujishima的“ 音乐声音的实时和弦识别:使用普通Lisp音乐的系统 ”。在维基百科条目有算法的更现代的变体的概述。有大量免费论文和色度特征检测的MATLAB实现。
但是,由于您仅关注人的声音,并且人的声音自然包含大量的泛音,因此在这种特定情况下,您实际需要的是 基本的频率检测算法 或 f0检测算法 。有几种此类算法已针对语音进行了明确调整。另外,这是一种被广泛引用的算法,可同时处理多个声音。然后,您应根据等温标度检查检测到的频率,然后找到最接近的匹配项。
由于我怀疑您正在尝试构建音调检测器和/或自动调谐器,因此您可能要使用M. Morise出色的WORLD实施,该实施可快速,高质量地检测和修改语音流上的f0。
最后,请注意,只有少数人声音调检测器在人声油炸套中工作良好。几乎所有这些声音,包括WORLD,都因发声和声音很低而失败。许多论文将人声炒作称为“吱吱作响的声音”,并且已经开发出特定的算法来专门帮助这种类型的声音输入。