在使用crepe模型的ml5音高检测中,如何检测±2kHz以上的音高

如何解决在使用crepe模型的ml5音高检测中,如何检测±2kHz以上的音高

我成功地使用了 ml5 的音高检测功能

问题:

未检测到高于 ±2000Hz 的音高。我尝试了多种设备并检查声音在超声图上是否可见,因此这似乎不是麦克风问题。

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

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

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

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

我的问题是:

ml5 PitchDetection class 中有什么东西可以修改、配置(可能是不同的模型)以使用绉纱模型检测高于 2000Hz 的频率?

解决方法

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

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

状态:

360 个音高值表示为 c1、c2...,选择 360 以便它们覆盖六个八度音程,C1 和 B7 之间的间隔为 20 音分,对应于 32.70 Hz 和 1975.5 Hz

JS implementation 具有将 360 间隔映射到 0 - 1997Hz 范围的映射:

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

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


编辑:

睡个好觉后,我找到了一个简单的解决方案,适用于我的简单应用程序。

本质上,它是对我的音频缓冲区重新采样,使其音调降低 2 倍。 CREPE 将 440Hz 的音高检测为 220Hz,我只需将其乘以 2。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?