平台: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,因此在本人深耕数字信号处理技术好几个小时后,有了这不太成熟的代码片段,文中代码因本人基础不好可能有部分错误,望指正
音频分析一般流程
主要函数:
# 音频路径
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