我希望在python 3.6中检测音频文件的节奏,但我并不真正理解有关aubio的文档。谁能告诉我如何用aubio或其他库来提取节拍?
发布于 2017-03-23 00:31:07
已更新
此命令将为您提供整个文件的速度估计(在0.4.5中可用):
aubio tempo foo.wav在aubio的python/demos中有一个简单的演示:demo_bpm_extract.py。
最重要的部分是以下两行,它们计算每个连续节拍之间的周期(np.diff),将这些周期转换为bpm (60./),并将中位数(np.median)作为此系列节拍最可能的bpm候选:
#!/usr/bin/env python
import numpy as np
bpms = 60./np.diff(beats)
median_bpm = np.median(bpms)请注意,这里的中位数比平均值更适合,因为它总是给出存在于原始总体bpms中的估计值。
发布于 2017-03-22 02:04:30
我找到了这个Paul Brossier的code,它可以帮助你,这就是:
#! /usr/bin/env python
from aubio import source, tempo
from numpy import median, diff
def get_file_bpm(path, params = None):
""" Calculate the beats per minute (bpm) of a given file.
path: path to the file
param: dictionary of parameters
"""
if params is None:
params = {}
try:
win_s = params['win_s']
samplerate = params['samplerate']
hop_s = params['hop_s']
except KeyError:
"""
# super fast
samplerate, win_s, hop_s = 4000, 128, 64
# fast
samplerate, win_s, hop_s = 8000, 512, 128
"""
# default:
samplerate, win_s, hop_s = 44100, 1024, 512
s = source(path, samplerate, hop_s)
samplerate = s.samplerate
o = tempo("specdiff", win_s, hop_s, samplerate)
# List of beats, in samples
beats = []
# Total number of frames read
total_frames = 0
while True:
samples, read = s()
is_beat = o(samples)
if is_beat:
this_beat = o.get_last_s()
beats.append(this_beat)
#if o.get_confidence() > .2 and len(beats) > 2.:
# break
total_frames += read
if read < hop_s:
break
# Convert to periods and to bpm
if len(beats) > 1:
if len(beats) < 4:
print("few beats found in {:s}".format(path))
bpms = 60./diff(beats)
b = median(bpms)
else:
b = 0
print("not enough beats found in {:s}".format(path))
return b
if __name__ == '__main__':
import sys
for f in sys.argv[1:]:
bpm = get_file_bpm(f)
print("{:6s} {:s}".format("{:2f}".format(bpm), f))这是关键部分:
bpms = 60./np.diff(beats)
median_bpm = np.median(bpms)https://stackoverflow.com/questions/42934617
复制相似问题