music_analyze.py 文件源码

python
阅读 21 收藏 0 点赞 0 评论 0

项目:MusicNet 作者: vidursatija 项目源码 文件源码
def calculateFeatures(filename):
    y, sr = librosa.load(filename)
    hop_length = 512
    section_length = 30
    permit_length = 0 #No overlap
    n_paras = 4

    tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
    n_beats = len(beat_frames)
    y_harmonic, _ = librosa.effects.hpss(y)
    beat_times = librosa.frames_to_time(beat_frames, sr=sr)
    mfcc = librosa.feature.mfcc(y=y, sr=sr, hop_length=hop_length, n_mfcc=1)
    mfcc_delta = librosa.feature.delta(mfcc)
    beat_mfcc_delta = librosa.util.sync(np.vstack([mfcc, mfcc_delta]), beat_frames)

    chromagram = librosa.feature.chroma_cqt(y=y_harmonic, sr=sr)
    beat_chroma = librosa.util.sync(chromagram, beat_frames, aggregate=np.median)

    delta_rms = np.square(beat_mfcc_delta[1])

    prev_delta_sums = np.empty((n_beats-section_length+1))
    total_sum = np.sum(delta_rms[:section_length])
    prev_delta_sums[0] = total_sum
    for pos in range(n_beats-section_length):
        total_sum = total_sum - delta_rms[pos] + delta_rms[pos+section_length]
        prev_delta_sums[pos+1] = total_sum

    prev_delta_sums_delta = librosa.feature.delta(prev_delta_sums)
    para_init_locs = []
    for n_p in range(n_paras):
        lowest = 50
        lowest_loc = 0
        for loc, each_sum_delta in enumerate(prev_delta_sums_delta):
            #Check valid loc
            valid_loc = True
            for each_loc in para_init_locs:
                if loc > each_loc - (section_length - permit_length) and loc < each_loc + (section_length - permit_length):
                    valid_loc = False
                    break

            if each_sum_delta <= lowest and valid_loc:
                lowest = each_sum_delta
                lowest_loc = loc

        para_init_locs.append(lowest_loc)

    para_init_locs.sort()
    #print(para_init_locs)

    all_features = np.empty((n_paras*section_length, 2)) #0 - mfcc, 1 - chroma
    for n_p in range(n_paras):
        all_features[n_p*section_length:(n_p+1)*section_length, 0] = beat_mfcc_delta[0][para_init_locs[n_p]:para_init_locs[n_p]+section_length] / 250
        all_features[n_p*section_length:(n_p+1)*section_length, 1] = np.argmax(beat_chroma[:, para_init_locs[n_p]:para_init_locs[n_p]+section_length], axis=0)/11

    return all_features.reshape((n_paras*section_length*2))
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号