使用librosa库实现100行代码制作音乐卡点视频

本文介绍了一种使用LibROSA库进行音频分析的方法,以实现音乐与视频的精确同步。该过程包括音频加载、时频处理、特征提取、节奏点检测,并最终将音频片段与图片转换为视频。文章详细解释了如何运用peak_pick和beat_track等函数,以及后续的图片处理和视频合成步骤。
摘要由CSDN通过智能技术生成

平台:windows 10 家庭中文版

ide:pycharm

环境:3.7

数字信号处理技术:≈0

 

librosa库

LibROSA is a python package for music and audio analysis. It provides the building blocks necessary to create music information retrieval systems.

librosa是处理音频的python库,可以进行时频处理、特征提取、绘制声音图形等

官方地址:http://librosa.github.io/librosa

 

生产流程

1.音频分析:通过对音频的一系列分析取得需要更换图片的时值组(重要,但对于没接触过数字信号处理的小白来说毫无思路

很不幸,数字信号处理技术≈0,因此在本人深耕数字信号处理技术好几个小时后,有了这不太成熟的代码片段,文中代码因本人基础不好可能有部分错误,望指正

音频分析一般流程

主要函数:

peak_pick

beat_track

 

    # 音频路径
    music_path = ''
    # 音频开始截取时间
    start_time = 67
    # 截取时长
    duration = 15
    # 采样率
    sr=44100
    # 加载音频文件
    y ,sr= librosa.load(music_path, offset=start_time, duration=duration,sr=sr)
    onset_env = librosa.onset.onset_strength(y=y, sr=sr,
                                             hop_length=512,
                                             aggregate=np.median)
    # 获取信号中的峰值
    # delta参数对取值影响较大
    # 这个方法参数较为重要,可以写一个公式计算出部分参数的取值
    peaks = librosa.util.peak_pick(onset_env, 1, 1, 1, 1, 0.8, 5)
    # 使用beat_track函数得到速度和节拍点
    tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
    # # 使用plp函数得到脉冲曲线
    # pulse = librosa.beat.plp(onset_envelope=onset_env, sr=sr)
    # # 得到局部脉冲的最大值
    # beats_plp = np.flatnonzero(librosa.util.localmax(pulse))
    # 创建一个节拍值1/4、2/4、3/4、4/4的数组
    M = beats * [[1 / 4], [2 / 4], [3 / 4]]
    M = M.flatten()
    M = np.sort(M)
    # 局部脉冲与节拍点做10%的去误差,得到节奏点
    L = []
    for i in M:
        for j in peaks:
            if i * 0.9 < j < i * 1.1:
                L.append(j)
    L = list(set(L))
    L.sort()
    # 节奏点转化为时间
    # 取前30个点,不够30个则全取
    if len(L) > 30:
        point_list = librosa.frames_to_time(L[:30], sr=sr)
    else:
        point_list = librosa.frames_to_time(L[:len(L)], sr=sr)
    # 音乐裁剪,设置开始结束时间
    end_time = point_list[len(point_list) - 1] + start_time
    start_time = start_time * 1000
    end_time = end_time * 1000
    sound = AudioSegment.from_mp3(music_path)
    word = sound[start_time:end_time]
    # 音乐储存路径
    word.export('movie/music.wav', format="wav")
    movie_cut(point_list)

2.图片处理,转换视频:此处选择先将图片处理成指定大小,然后根据时值将图片转换为特定时长的视频片段,最后将视频合成

 

遗留问题

1.不能通过代码判断出哪段音乐更适合卡点

2.人声影响较大,尤其是连续的节奏较快的高音

解决思路

深耕数字信号处理技术

 

librosa:http://librosa.github.io/librosa

源代码:https://github.com/LaoADe/music_point

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值