librosa.clicks 返回的信号不正确

Posted

技术标签:

【中文标题】librosa.clicks 返回的信号不正确【英文标题】:Incorrect signal returned by librosa.clicks 【发布时间】:2021-04-08 09:59:11 【问题描述】:

我正在尝试用 librosa.clicks 编写一个简单的节拍器

import librosa
import numpy as np

bpm = 200
exercise_duration = 10
sr = 22050

seconds_per_beat = 60/bpm
beats_number = round(bpm/ (60/exercise_duration))

metronome_clicks = [0]

for i in range(beats_number - 1):
    metronome_clicks.append(seconds_per_beat + metronome_clicks[i])

click = librosa.clicks(times=metronome_clicks,sr=sr, length=22050 * exercise_duration, click_duration=0.1)

hop_length = 512
onset_samples = librosa.onset.onset_detect(y=click, sr=sr, units='samples', hop_length=hop_length)

onset_diff = np.diff(onset_samples)

print(onset_samples)
print(onset_diff)

我在测试 librosa.clicks 的结果时注意到一个明显的不准确之处 - 我的机器上 np.diff 的打印结果如下所示:

[6144 6656 6656 6656 6656 6656 6656 6656 6656 6656 6656 6656 6656 6144
 6656 6656 6656 6656 6656 6656 6656 6656 6656 6656 6656 6144 6656 6656
 6656 6656 6656]

这基本上意味着 23 毫秒的延迟。我还注意到样本中的延迟量 = 512,如果我将 hop_length 调整为 256,则延迟为 256 个样本,因此它似乎与跳跃长度相关 - 但老实说,我不真的知道如何,以及解决这个问题的方法是什么。此外,当您将 bpm 调整为 60 时,结果会很好:

[22016 22016 22016 22016 22016 22016 22016 22016]

但并不完美,因为 60bpm 应该等于 1 秒,这应该给我们 22050 个样本。在 120 bpm 时,它看起来像这样:

[11264 10752 11264 10752 11264 10752 11264 10752 11264 11264 10752 11264
 10752 11264 10752 11264 10752 11264]

这是另一种我不太了解的行为。如果我是正确的,那么增加采样率或减少跳跃长度应该可以最大限度地减少问题,但我希望获得一个完美的节拍器计时,因为这对我正在构建的应用程序至关重要。

【问题讨论】:

【参考方案1】:

我已将 click as wav 文件导入音频编辑器,发现它在 1-2 个样本内是准确的。

起始检测算法并不完美,并且非常依赖于信号的瞬态。

我已经根据 onset_samples 绘制了波形,即使在鸟瞰图上,您也可以看出开始时间并不一致。

底线:点击很好。它的发病检测已关闭。

【讨论】:

你不觉得这有点奇怪吗,因为它不是任何真实世界的录音,而是由相同功能产生的完全相同的数字信号?你认为 librosas 起始检测网格是指帧而不是样本吗?

以上是关于librosa.clicks 返回的信号不正确的主要内容,如果未能解决你的问题,请参考以下文章

判赔腾讯108万,科技公司为公众号“刷量”构成不正当竞争

K哥爬虫普法微信公众号爬虫构成不正当竞争,爬虫er面对金山,如何避免滥用爬虫?

深圳中院:利用爬虫技术抓取他人数据构成不正当竞争(判决书全文)

赔腾讯70万,QQ“自动抢红包”软件被判不正当竞争

asdf

案例:利用爬虫技术抓取他人数据构成不正当竞争