一尘不染

C / C ++ / Obj-C实时算法,可从人声输入中确定音符(不是音高)

algorithm

我想检测的不是音高,而是要检测演唱音符的 音高等级

因此,无论是C4还是C5都不重要:必须将它们都检测为C。

想象一下摆在钟面上的12个半音,而指针指向音高等级。那就是我所追求的!理想情况下,我想知道唱的音符是亮点还是小点。

这不是先前问题的重复,因为它引入了以下约束:

  1. 声源是 单一的人类声音 ,希望其背景干扰可以忽略不计(尽管我可能需要处理)

  2. 八度不重要, 只有音高等级


阅读 230

收藏
2020-07-28

共1个答案

一尘不染

其他答案中引用的大多数频率检测算法不适用于语音。要了解为什么如此直观,可以考虑将所有语言的元音都唱到一个特定的音符上。即使所有这些元音具有不同的频率成分,也必须将它们全部检测为同一音符。任何用于语音的音符检测算法都必须以某种方式考虑到这一点。此外,人类的语音和歌曲包含许多擦音,其中许多没有隐含的音调。

在一般(非语音情况下)中,您要查找的功能称为 色度功能, 并且在该主题上有相当多的工作要做。它等效地称为 谐波音调等级分布
。关于该概念的原始参考文件是Tayuka Fujishima的“
音乐声音的实时和弦识别:使用普通Lisp音乐的系统
”。在维基百科条目有算法的更现代的变体的概述。有大量免费论文和色度特征检测的MATLAB实现

但是,由于您仅关注人的声音,并且人的声音自然包含大量的泛音,因此在这种特定情况下,您实际需要的是 基本的频率检测算法
f0检测算法

。有几种此类算法已针对语音进行了明确调整。另外,这是一种被广泛引用的算法,可同时处理多个声音。然后,您应根据等温标度检查检测到的频率,然后找到最接近的匹配项。

由于我怀疑您正在尝试构建音调检测器和/或自动调谐器,因此您可能要使用M.
Morise出色的WORLD实施,该实施可快速,高质量地检测和修改语音流上的f0。

最后,请注意,只有少数人声音调检测器在人声油炸套中工作良好。几乎所有这些声音,包括WORLD,都因发声和声音很低而失败。许多论文将人声炒作称为“吱吱作响的声音”,并且已经开发出特定的算法来专门帮助这种类型的声音输入。

2020-07-28