《2 用Python 实现音频切割和数据增强》由会员分享,可在线阅读,更多相关《2 用Python 实现音频切割和数据增强(3页珍藏版)》请在金锄头文库上搜索。
1、如何实现音频切割 用声振法进行结构或材料的无损检测,收到的音频是连续敲击的声音信号,需要识别每次敲 击,并切割成时常相等的音频片段。Python 代码如下:import osimport numpy as npimport waveimport librosaimport matplotlib.pyplot as pltpath = E:/Winter vocation task/Guided wade/MC of Timber/3 Detection/1 Data/Data segement/WAV Form_Yw/files = os.listdir(path)files = path +
2、 f for f in files if f.endswith(.wav)#定义一个函数,实现对音频在特定位置处的切割def CutFile():#遍历该文件夹下所有音频文件for i in range(len(files):FileName = filesi print(CutFile File Name is ,FileName) f = wave.open(r + FileName, rb) params = f.getparams() print(params)nchannels, sampwidth, framerate, nframes = params:4str_data = f
3、.readframes(nframes) #将波形转化为数组 f.close()wave_data = np.fromstring(str_data, dtype=np.short) wave_data.shape = -1, 2 wave_data = wave_data.T temp_data = wave_data.T#加载音频,获得每次敲击的起始时间(onset),将帧数位置转化为采样点的位置 (*512)y, sr 二 librosa.load(filesi,sr二None)# 通过 load 加载音频,得到的是单声道 mono, 数据类型为浮点onset_frames = libr
4、osa.onset.onset_detect(y=y, sr=sr) onset_location_sample = onset_frames*512#以每次敲击的起始时间为中心点,分别向前向后取0.5s;每0.5s的采样数二sr/2start_point = onset_location_sample-int(sr/2) #音频切割起始位置en d_poi nt = on set_locatio n_sample+i nt(s r/2)#音频切割终点位置# 删除截取起始点小于0的元素,并相应删除截取终止点对应索引位置处的值 start_point_new = list(filter(lamb
5、da x : x=0,start_point)n = np.where(start_point = 0)0 end_point_new = np.delete(end_point,n,0)for i in ran ge(1): #len( sta rt_po int_new)temp_dataTemp = temp_datastart_point_newi:end_point_newi temp_dataTemp.shape = 1, -1crop_wave = ystart_point_newi:end_point_newiAmax_Crop = np.amax(crop_wave, axi
6、s=0) # 检测该片段是否是非人为敲击带 来的on set检测结果if Amax_Crop 0.1:pass # 删除非人为敲击带来的 onset 检测结果,0.1 这个幅度是根据 waveplot原信号估算的阈值,根据不同的试验该值有所不同else:print(FileName) save_name = FileName-9:-4+-+str(i)+.wav print(save_name)save_path = E:Winter vocation taskGuided wadeMC of Timber3 Detection1 DataData segementtestcutresults
7、Form_Ywtemp_dataTemp = temp_dataTemp.astype(np.short) #将波形数据转换为 数组plt.plot(temp_dataTemp)f = wave.ope n( save_path+save _n ame, wb)#扌丁开 WAV 文档# 配置声道数、量化位数和取样频率 f.setnchannels(nchannels) f.setsampwidth(sampwidth)f.setframerate(framerate)#将wav_data转换为二进制数据写入文件f.writeframes(temp_dataTemp.tostring() f.close()if _name_ =CutFile()main