假设我们有一个录制了一些吉他音乐的wav文件。声音非常干净,没有额外的声音只有吉他本身,可能还有节拍器滴答声。
找到在Python中播放的每个音符(或和弦)的时间戳的最佳方法是什么?我不需要识别注释本身,只需要识别它发生时的时间戳。
我之前从未做过这种事情,所以我有点困惑。我正在维基百科上阅读有关短时傅立叶变换的内容,看起来很有希望,但我找不到任何相关的例子。非常感谢有关如何开始的任何帮助/提示。
答案 0 :(得分:2)
一般问题称为onset detection,您可以尝试许多方法。我会提供一个超级天真的解决方案,可能不适用于您的用例:
from scipy.io import wavfile
from scipy.signal import argrelmax
from matplotlib.mlab import specgram
sr, x = wavfile.read(path) # read in a mono wav file
spec, freqs, time = specgram(x, NFFT=4096, Fs=sr, mode='psd') # compute power spectral density spectogram
spec2 = np.diff(spec, axis=1) # discrete difference in each frequency bin
spec2[spec2<0] = 0 # half-wave rectification
diff = np.sum(spec2, axis=0) # sum positive difference in each time bin
for peak in argrelmax(diff)[0]: # find peaks
print("onset between %f and %f." % (time[peak], time[peak+1]))