librosa.clicks 返回的信号不正确

Incorrect signal returned by librosa.clicks

我正在尝试用 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]

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

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

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

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

底线:点击没问题。它的起始检测已关闭。