首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用aubio找到.wav的节奏?

如何用aubio找到.wav的节奏?
EN

Stack Overflow用户
提问于 2017-03-22 01:49:29
回答 2查看 3.6K关注 0票数 3

我希望在python 3.6中检测音频文件的节奏,但我并不真正理解有关aubio的文档。谁能告诉我如何用aubio或其他库来提取节拍?

EN

回答 2

Stack Overflow用户

发布于 2017-03-23 00:31:07

已更新

此命令将为您提供整个文件的速度估计(在0.4.5中可用):

代码语言:javascript
复制
aubio tempo foo.wav

aubiopython/demos中有一个简单的演示:demo_bpm_extract.py

最重要的部分是以下两行,它们计算每个连续节拍之间的周期(np.diff),将这些周期转换为bpm (60./),并将中位数(np.median)作为此系列节拍最可能的bpm候选:

代码语言:javascript
复制
#!/usr/bin/env python
import numpy as np
bpms = 60./np.diff(beats)
median_bpm = np.median(bpms)

请注意,这里的中位数比平均值更适合,因为它总是给出存在于原始总体bpms中的估计值。

票数 6
EN

Stack Overflow用户

发布于 2017-03-22 02:04:30

我找到了这个Paul Brossier的code,它可以帮助你,这就是:

代码语言:javascript
复制
#! /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))

这是关键部分:

代码语言:javascript
复制
bpms = 60./np.diff(beats)
median_bpm = np.median(bpms)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42934617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档