【发布时间】: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]
这是另一种我不太了解的行为。如果我是正确的,那么增加采样率或减少跳跃长度应该可以最大限度地减少问题,但我希望获得一个完美的节拍器计时,因为这对我正在构建的应用程序至关重要。
【问题讨论】:
标签: python audio signal-processing librosa sample-rate