python 进行音频处理 【Mp3 —> Wav & Wav slice】
注 :pip 安装ffmpy 在运行时可能会遇到报错 ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
解决方法见
https://blog.csdn.net/qq_44275213/article/details/110796818
如果找不到ffmpeg.exe 的安装地址,可直接点击这里 下载合适版本,然后放到任意地址即可
音频处理代码
from ffmpy import FFmpeg as mpy # 音频格式转换对象
import os
from pydub import AudioSegment
from pydub.utils import make_chunks
def read_folder(mp3_folder, wav_folder):
'''
文件夹读取函数
:param mp3_folder:
:param wav_folder:
:return:
'''
# 遍历需要转换的MP3文件夹中的MP3文件
for a in os.listdir(mp3_folder):
# 创建MP3文件的绝对路径
mp3_file = os.path.join(mp3_folder, a)
# 调用格式转换函数
trans_to_wav(mp3_file, wav_folder)
def trans_to_wav(mp3_file, wav_folder):
'''
格式转换格式
:param mp3_file:
:param wav_folder:
:return:
'''
# 格式化文件
file_fmt = os.path.basename(mp3_file).strip()
# 获取文件格式
file_fmt = file_fmt.split('.')[-1]
# 校验文件格式
if file_fmt.strip() != 'mp3':
raise Exception('改文件不是MP3格式,请检查!')
elif file_fmt.strip() == '':
raise Exception('文件格式出现异常,请检查!')
# 创建wav的文件以供转换完成后输出
wav_file_path = os.path.join(wav_folder)
wav_file_path = os.path.join(wav_file_path, '{}.{}'.format(
os.path.basename(mp3_file).strip().split('.')[0], 'wav'
))
# 创建转换时的命令行参数字符串
cmder = '-f wav -ac 1 -ar 16000'
# 创建转换器对象
mpy_obj = mpy(
executable='D:/Anaconda/envs/music_recommend/Lib/ffmpeg.exe',
inputs={
mp3_file: None
},
outputs={
wav_file_path: cmder
}
)
print('执行CMDER 命令:{}'.format(mpy_obj.cmd))
# 执行转换
mpy_obj.run()
if __name__ == '__main__':
'''
Mp3 -> Wav
'''
# # 输入MP3文件夹
type_list=['Classical','Country','HipHop','Jazz','Mental','Pop','Rnb','Rock']
for type in type_list:
slice_num=0
mp3_folder="D:/Final_assay/GTZAN/separate/music/"+type+"/"#输入MP3文件夹路径
wav_folder="D:/Final_assay/GTZAN/separate/music/"+type+"_wav/"# 输出wav文件夹路径
wav_slice_folder="D:/Final_assay/GTZAN/separate/music/"+type+"_wav_slice/{}"# 输出wav_slice文件夹路径
# # 校验MP3文件夹是否存在
if mp3_folder.strip() == '':
raise Exception('输入空值,请检查!')
elif mp3_folder.strip() != '':
if os.path.exists(mp3_folder) is False:
raise Exception('文件路径不存在')
if wav_folder.strip() == '':
raise Exception('输入空值,请检查!')
elif wav_folder.strip() != '':
if os.path.exists(wav_folder) is False:
raise Exception('文件路径不存在')
# 调用文件夹读取批量文件
read_folder(mp3_folder, wav_folder)
'''
Wav slice per 30s
'''
for a in os.listdir(wav_folder):
# 创建Wav文件的绝对路径
Wav_file = os.path.join(wav_folder, a)
print(a)
if a:
wav= AudioSegment.from_file(Wav_file) # 打开wav文件
size = 30000 # 切割的毫秒数 10s=10000
chunks = make_chunks(wav, size) # 将文件切割为30s一块
for i, chunk in enumerate(chunks[1:-1]):
slice_num=slice_num+1
chunk_name = "{}-{}.wav".format(a.split(".")[0], i)
print(chunk_name)
chunk.export(wav_slice_folder.format(chunk_name), format="wav")
print(type+"_total_slice_num",slice_num)
借鉴以下blog,感谢大佬们!
https://blog.csdn.net/weixin_44649780/article/details/132672659?ops_request_misc=&request_id=&biz_id=102&utm_term=python%20%20wav%E5%88%87%E7%89%87&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-132672659.142v99pc_search_result_base2&spm=1018.2226.3001.4187
https://blog.csdn.net/liming89/article/details/122394771?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171081099216800184155788%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171081099216800184155788&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-6-122394771-null-null.142v99pc_search_result_base2&utm_term=python%20MP3%E5%88%87%E7%89%87&spm=1018.2226.3001.4187