import numpy as np
import array
from pydub import AudioSegment
# 读取音频文件
path = r'E:MLprojectmusicdataDelacey-Dream-It-Possible.mp3'
song = AudioSegment.from_file(file=path)
# 写音频文件
song.export(out_f=r'E:MLprojectmusicdata est.wav', format='wav')
# 获取相关属性
# 长度
size = len(song)
print("音频文件的长度信息(毫秒):{}".format(size))
channel = song.channels
# 通道数据,音频文件有单通道和双通道
print("音频文件的通道数据:{}".format(channel))
# 音频文件的抽样频率
frame_rate = song.frame_rate
print("音频文件的抽样频率:{}".format(frame_rate))
# 设置相关属性
# 如果降低音乐的通道、抽样频率等特征的值会带来音频的损失
# 但是增加不会带来损失
song = song.set_channels(channels=2)
song = song.set_frame_rate(frame_rate=44100)
song = song.set_sample_width(sample_width=2)
print("=" * 50)
print("音频文件的长度信息(毫秒):{}".format(len(song)))
print("音频文件的通道数目:{}".format(song.channels))
print("音频文件的样本宽度:{}".format(song.sample_width))
print("音频文件的抽样频率:{}".format(song.frame_rate))
song.export(out_f=r'E:MLprojectmusicdata est01.wav', format='wav')
# 音频文件的截断处理
# 后去前两分钟的数据保存
song[:120000].export(out_f=r'E:MLprojectmusicdata est02.wav', format='wav')
# 获取前10s数据保存
song[:10000].export(out_f=r'E:MLprojectmusicdata est03.wav', format='wav')
# 获取中间十秒
mid = len(song) // 2
song[mid - 5000:mid + 5000].export(out_f=r'E:MLprojectmusicdata est04.wav',
format='wav')
# 填充保存
# 将song兑现装换为numpy的array对象
# 数组的大小 = 音频数据长度(秒为单位)* 通道数 * 抽样频率
samples = np.array(song.get_array_of_samples()).reshape(-1)
print("形状:{}".format(samples.shape))
print("前10个数字:{}".format(samples[:10]))
print("中间10个数字:{}".format(samples[20000:20010]))
# 填充操作(填充一分钟)
append_size = 60 * song.channels * song.frame_rate
"""
数组填充api为numpy中的pad
pad_with: 给定在什么位置填充,以及填充多少个数据,eg:当前参数在samples这个数组
前面填充append_size个值
mode: 填充方式,一般使用constant, 表示常量填充
constant_value: 填充常数的时候,常数值是什么
"""
samples = np.pad(samples, pad_width=(append_size, 0), mode='constant', constant_values=(0, 0))
print(samples.shape)
# 将填充后的数值转换成AudioSegment对象
song = song._spawn(array.array(song.array_type, samples))
song.export(out_f=r'E:MLprojectmusicdata est05.wav', format='wav')
# 音频的增加,减小操作
(song + 10).export(out_f=r'E:MLprojectmusicdata est06.wav', format='wav')
(song - 10).export(out_f=r'E:MLprojectmusicdata est07.wav', format='wav')
# 循环
(song * 2).export(out_f=r'E:MLprojectmusicdata est08.wav', format='wav')