遍历文件夹实现音频切割Python代码

开课吧开课吧小西2021-03-16 18:17

如何实现音频切割?

用声振法进行结构或材料的无损检测,收到的音频是连续敲击的声音信号,需要识别每次敲击,并切割成时常相等的音频片段。

实现目标:将连续敲击的音频(wav)切割成1s的音频片段。

Python教程

切割完结果如下:

Python教程

Python代码如下:

import os

import numpy as np

import wave

import librosa

import matplotlib.pyplot as plt

path = 'E:/xxx/xxx/' 

files = os.listdir(path)

files = [path + f for f in files if f.endswith('.wav')]

#定义一个函数,实现对音频在特定位置处的切割

def CutFile(): 

 #遍历该文件夹下所有音频文件

 for i in range(len(files)):

 FileName = files[i]

 print("CutFile File Name is ",FileName)

 f = wave.open(r"" + FileName, "rb")

 params = f.getparams()

 print(params)

 nchannels, sampwidth, framerate, nframes = params[:4] 

 str_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(files[i],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/2

 start_point = onset_location_sample-int(sr/2) #音频切割起始位置

 end_point = onset_location_sample+int(sr/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 range(1): #len(start_point_new)

 temp_dataTemp = temp_data[start_point_new[i]:end_point_new[i]]

 temp_dataTemp.shape = 1, -1

 crop_wave = y[start_point_new[i]:end_point_new[i]] 

 Amax_Crop = np.amax(crop_wave, axis=0) # 检测该片段是否是非人为敲击带来的onset检测结果

 if Amax_Crop < 0.1: 

 pass # 删除非人为敲击带来的onset检测结果

 else: 

 print(FileName) 

 save_name = FileName[-9:-4]+'-'+str(i)+'.wav'

 print(save_name)

 save_path = "E:xxxxx" 

 temp_dataTemp = temp_dataTemp.astype(np.short) #将波形数据转换为数组

 plt.plot(temp_dataTemp)

 f = wave.open(save_path+save_name, "wb")#打开WAV文档

 # 配置声道数、量化位数和取样频率

 f.setnchannels(nchannels)

 f.setsampwidth(sampwidth)

 f.setframerate(framerate)

 # 将wav_data转换为二进制数据写入文件

 f.writeframes(temp_dataTemp.tostring())

 f.close()

if __name__ == '__main__' :

 CutFile() 

以上就是Python语音识别的全部内容,如果你想把技术和面试技巧相结合,不妨点击下方图片领取课程

Python教程

当有捷径的时候,为什么不走捷径,最后到达的地点都是一样,少费点力气何乐而不为呢?

有用
分享