在使用绉纱模型检测ml5间距时,如何检测±2kHz以上的间距



我成功使用了ml5的音调检测功能:

  • 教程:https://ml5js.org/reference/api-PitchDetection/
  • 模型:https://cdn.jsdelivr.net/gh/ml5js/ml5-data-and-models/models/pitch-detection/crepe/

问题:

没有检测到±2000Hz以上的音高。我尝试了多个设备,并检查声音在超声图上是可见的,所以这似乎不是麦克风的问题。

我认为这可能是采样率限制/由库进行重采样的结果,因为奈奎斯特频率(最大"可记录")。频率)为采样率的一半。

我在本地托管ml5源并尝试修改PitchDetection类

我看到采样率似乎被重新采样到1024Hz的性能原因。这听起来不太对,虽然如果我没有弄错的话,这只允许检测频率高达512hz。我肯定错过了什么(或很多)。

我试着调整速率,但将其增加到2048会导致错误:Error when checking : expected crepe_input to have shape [null,1024] but got array with shape [1,2048].

我的问题是:是否有ml5 PitchDetection类的东西我可以修改,配置(也许是不同的模型)检测频率高于2000Hz使用绉纱模型?

经过进一步调查,发现CREPE模型本身支持高达~1997Hz(见代码)或1975.5 Hz(见论文)

关于CREPE的论文:https://arxiv.org/abs/1802.06182

:

360音调值表示为c1, c2,…, 360,因此它们覆盖了C1和B7之间的六个八度,间隔为20分,对应于32.70 Hz和1975.5 Hz

JS实现有这个映射,将360间隔映射到0 - 1997Hz范围:

const cent_mapping = tf.add(tf.linspace(0, 7180, 360), tf.tensor(1997.3794084376191))

这意味着,如果不重新训练模型,我现在可能无法使用它。

编辑:

一夜好眠后,我发现了一个简单的解决方案,它适用于我的简单应用程序。

在它的本质上,它是重新采样我的音频缓冲,所以它有2倍的低音调。CREPE比将440Hz的音高检测为220Hz,我只需要将其乘以2。

在我的实时、嘈杂的应用程序中,结果仍然比YIN算法更一致。

最新更新