基于 librosa和soundfile对音频进行重采样
一、前言
在玩bert-vits2的时候有对音频进行重采样的需求,故写了一下批量对音频进行重采样的脚本。
优化点:
- 根据机器自适应线程数为最多,保证充分利用机器资源,提高速度>30%。
- 支持多级文件夹结构的处理
运行结果如下·:
输出文件夹:
二、具体代码
具体代码如下:
import os
import time
import librosa
import soundfile as sf
import concurrent.futures
from tqdm import tqdm
def resampleAudio(params):'''Parameters----------params
audioPath, outpath,target_sr #音频地址,重采样后的输出地址,目标音频的采样率Returns-------'''audioPath, outpath,target_sr=paramstry:src_sig,sr = sf.read(audioPath) #name是要 输入的wav 返回 src_sig:音频数据 sr:原采样频率dst_sig = librosa.resample(src_sig,orig_sr=sr,target_sr=target_sr) #resample 入参三个 音频数据 原采样频率 和目标采样频率sf.write(outpath,dst_sig,target_sr) #写出数据 参数三个 : 目标地址 更改后的音频数据 目标采样数据return Trueexcept Exception as e:print(e)return Falsedef Getsr(audioPath):'''查询音频的采样率是否更改Returns-------'''src_sig, sr = sf.read(audioPath) # name是要 输入的wav 返回 src_sig:音频数据 sr:原采样频率return srdef main(dirpath,target_sr):'''Parameters----------dirpath :包含要修改采样率的音频文件夹地址target_sr:目标采样率Returns-------'''outdir=dirpath+'_'+str(target_sr)if not os.path.exists(outdir):os.mkdir(outdir)cpuNum=min(1,os.cpu_count()-2)with concurrent.futures.ThreadPoolExecutor(max_workers=cpuNum) as excutor:futures=[]for ret,dirs,files in os.walk(dirpath):for fileName in files:filepath=os.path.join(ret,fileName)outfile=filepath.replace(dirpath,outdir)if not os.path.exists(os.path.dirname(outfile)): #如果没有输出的这个文件夹则新建一个os.mkdir(os.path.dirname(outfile))params=filepath,outfile,target_srtask=excutor.submit(resampleAudio,params)futures.append(task)prad=tqdm(total=len(futures))for future in concurrent.futures.as_completed(futures):res=future.result()prad.update(1)prad.close()if __name__=="__main__":dirpath = r'I:\audioData\UVR\test9' #更改为你的文件夹target_sr=44100preTime=time.time()audioNum=len(os.listdir(dirpath))isshow=True #是否显示过程if isshow:print('开始对文件夹:{}下的{}个音频的采样率都更改为:{}HZ'.format(dirpath,audioNum,target_sr))main(dirpath,target_sr)if isshow:print('重采样完成,保存地址:{}\n耗费时间:{:.2f} min'.format(dirpath+'_'+str(target_sr),(time.time()-preTime)/60))try:audioPath = dirpath+'_'+str(target_sr)+'/'+os.listdir(dirpath)[0]sr=Getsr(audioPath) #查询音频的采样率是否更改print('抽样查询更改后输出文件:{}的采样率'.format(audioPath))if sr==target_sr:print('该音频更改成功')except Exception as e:print(e)