资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
如何实现音频切割 用声振法进行结构或材料的无损检测,收到的音频是连续敲击的声音信号,需要识别每次敲 击,并切割成时常相等的音频片段。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 + 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.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 = librosa.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(lambda 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, axis=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 segementtestcutresultsForm_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
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号