截取歌曲中的某一部分
这里呢,我使用的是wav(无损高清)格式的音乐。
#导入我们需要的包
import numpy as np
import wave
#打开保存好的音乐
like = wave.open('./陈一发儿 - 宝贝 - 陈一发儿.wav')
p1 = like.getparams()#查看属性
获取到的音乐属性
开始进行音频的截取
like_data = like.readframes(nframes=6439727)#读取数据,且数据只能读取一次
type(like_data)#查看一下数据属于什么类型
nd1 = np.frombuffer(like_data,dtype = np.int16)#转化成numpy类型
like = nd1.reshape(6439727,2)#reshape进行数据进行重塑,6439727是指的音频长度,2是指双声道
pre = like[:44100*30]#截取前三十秒的音频
pre1 = like[44100*30:44100*60]#截取30秒到60秒的音频
保存截取的音乐并进行属性的设置
f = wave.Wave_write('./宝贝-30秒.wav')
#设置参数
f.setframerate(44100)
f.setnchannels(2)
f.setsampwidth(2)
f.setnframes(30*44100)
f.writeframes(pre.tobytes())#转换字节类型
f.close()
f2 = wave.Wave_write('./宝贝30-60秒.wav')
f2.setframerate(44100)
f2.setnchannels(2)
f2.setsampwidth(2)
f2.setnframes(30*44100)
f2.writeframes(pre1.tobytes())#转换字节类型
f2.close()
将截取到的音频进行倒放,而将音乐进行倒放往往能产生意想不到的魔性效果,而倒放却只需要一行代码就能搞定
f3.writeframes(pre[::-1].tobytes())#将音乐倒放,实则就是进行了切片
最后运行得到的结果:
将两段音频链接在一起
两段音频的连接的操作其实和上面的代码差不多,其实就是多了一个级联的方法,那就直接放总代码了。有看不懂的地方代码后面都有注释的
import numpy as np
import wave
y1 = wave.open('./邓紫棋 - 喜欢你.wav')
y2 = wave.open('./陈一发儿 - 宝贝 - 陈一发儿.wav')
p1 = y1.getparams()
p2 = y2.getparams()
like1 = y1.readframes(nframes=10776444)
like2 = y2.readframes(nframes=6439727)
like1 = np.frombuffer(like1,dtype = np.int16)
like1 = like1.reshape(10776444,2)
like2 = np.frombuffer(like2,dtype = np.int16)
like2 = like2.reshape(6439727,2)
pre = like1[:44100*30]
pre1 = like2[-30*44100:]
mix_music = np.concatenate([pre1,pre])#将两段音频合二为一,级联方法
f4 = wave.Wave_write('./宝贝+喜欢你.wav')
f4.setframerate(44100)
f4.setnchannels(2)
f4.setsampwidth(2)
f4.setnframes(2646000)
f4.writeframes(mix_music.tobytes())#转换字节类型
f4.close()
效果图:
总结
对音频的处理,其实大多也就是进行一些切片的操作。向上面的那些代码,需要注意的也就是reshape的操作。当时我忘记使用reshape对数据进行重塑,这导致我多花了一些时间,所以说在打代码时需要严谨,因为当时的一点粗心,又需要花时间去检查代码。对了,进行reshape时,要记得reshape只改变形状,不改变数据。