tensorflow - 在使用 crepe 模型的 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 类中是否有一些东西我可以修改、配置(可能是不同的模型)以使用 crepe 模型检测高于 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 算法更一致。
推荐阅读
- java - android从图库中获取图像并保存另一个活动
- javascript - 我认为 Splice(remove) 方法的工作方式与其实际工作完全相反
- python - 使用 Python 请求向 ASP 提交表单的 MAC 验证错误
- angular - 模型变异时未调用 Angular ControlValueAccessor writeValue()
- apache - apache tika 内部使用什么模型 - TensorflowRESTCaptioner
- bash - 如何以有效的方式将多个大型 .gz 文件合并为一个?
- scala - 逐步使用正则表达式
- google-search - 我可以将谷歌搜索 API 嵌入到我的网站中,以便它搜索我的数据库吗?
- php - 如何使用 eloquent 关系获取列数据
- c# - 我的控制台突然出现这个错误,这是什么意思,我该如何解决?