大采集处理技术 2_第1页
大采集处理技术 2_第2页
大采集处理技术 2_第3页
大采集处理技术 2_第4页
大采集处理技术 2_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据采集与预处理技术*

*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Librosa等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:任务二语音直播数据预处理一、任务目标1、根据模型训练要求,对语音数据进行降噪处理减少背景干扰,完成语音数据的预加重、去除静音片段等操作。2、利用语音数据常见的特征提取方法提取语音特征,并根据要求完成特征降维、特征拼接、特征平滑等处理。3、完成直播语音数据分帧与加窗,对语音数据进行增强,如时间伸缩、频率移位、加噪声、随机时间屏蔽和频率屏蔽。4、完成语音数据重采样,将时域信号转换为频域表示,更好捕捉语音频率特征,并进行归一化、标准化处理。二、Librosa语音预处理(1)librosa的主要功能1)音频文件加载与保存:支持多种格式的音频文件(如WAV、MP3、OGG等)加载与保存,使用简单且灵活。2)音频预处理:可以对音频进行常见的预处理操作,如降采样、去噪、分帧、加窗、预加重等,方便后续特征提取和模型输入。3)特征提取:支持提取多种音频特征,包括梅尔频率倒谱系数(MFCC)、对数梅尔频率能量谱图(log-MelSpectrogram)、音高(Pitch)、节奏(Rhythm)等,这些特征广泛应用于语音识别、音乐分类、情感分析等任务。4)傅里叶变换与频谱图:提供短时傅里叶变换(STFT)、功率谱图、语谱图等工具,将时域信号转换为频域表示,帮助分析音频的频率特性。5)时间和频率变换:可以进行时间伸缩、频率偏移、音高移调等操作,用于数据增强或音频信号的变换处理。6)可视化工具:librosa.display提供了可视化功能,方便查看音频信号、频谱图、MFCC、对数梅尔频谱图等,帮助用户更直观地理解音频数据。7)音频效果处理:支持多种音频效果,如回声、噪声去除、静音切除、动态范围压缩等,能够模拟和增强不同场景下的音频数据。8)节奏分析:提供了节奏特征提取工具,支持节拍检测、节拍位置估计、时间脉冲等功能,广泛应用于音乐分析。9)数据增强:可以在音频信号上进行多种数据增强操作,如加噪声、时间伸缩、移调等,以增加训练数据的多样性,提高模型的鲁棒性。(2)librosa的典型应用场景1)语音识别:在语音识别任务中,librosa经常用于音频特征提取,如MFCC、频谱图等,然后将这些特征输入深度学习模型进行训练。2)音乐信息检索:librosa支持音乐特征提取、节奏分析、音高估计等,可以用于音乐分类、推荐系统、节奏检测等领域。3)音频分类:librosa可以提取音频的时域和频域特征,用于训练机器学习模型来进行音频的分类,如环境声音分类、情感分析等。4)数据增强:通过对音频信号的时频变换、加噪声等操作,librosa可以生成新的数据样本,帮助提高模型的泛化能力。(3)安装librosa在已经安装python和pip工具的情况下,可以通过以下命令安装librosa:pipinstalllibrosa(4)常见功能 #1、加载音频文件代码:importlibrosa#加载音频文件,默认采样率为22050Hzaudio_path='example.wav'y,sr=librosa.load(audio_path,sr=22050)#2、

降采样(Resampling),如果采集的音频文件的采样率过高,降采样可以降低计算复杂度#将音频从原采样率重新采样到16kHzy_resampled=librosa.resample(y,orig_sr=sr,target_sr=16000)#3、降噪,可以通过减去静音段来消除背景噪声,Librosa可以使用librosa.effects.trim()来去除静音部分。#去除音频中的静音部分y_trimmed,_=librosa.effects.trim(y)#4、预加重,一种高通滤波器,可以增强高频部分。#预加重处理pre_emphasis=0.97y_preemphasized=numpy.append(y[0],y[1:]-pre_emphasis*y[:-1])#5、分帧与加窗,在语音预处理中,可以将语音信号分成短时帧,并为每一帧应用窗函数。importnumpyasnpimportlibrosa.display#分帧和加窗frame_length=2048hop_length=512window=np.hanning(frame_length)#获取帧frames=librosa.util.frame(y,frame_length=frame_length,hop_length=hop_length)#对每一帧应用窗函数windowed_frames=frames*window[:,np.newaxis]#6、傅里叶变换与语谱图,语音预处有时候需要计算语谱图(Spectrogram),以频域方式表示语音信号#计算短时傅里叶变换(STFT)D=librosa.stft(y,n_fft=2048,hop_length=512)#转换为幅值谱图S_db=librosa.amplitude_to_db(np.abs(D),ref=np.max)#可视化语谱图importmatplotlib.pyplotaspltplt.figure(figsize=(10,4))librosa.display.specshow(S_db,sr=sr,hop_length=hop_length,x_axis='time',y_axis='log')plt.colorbar(format='%+2.0fdB')plt.title('Spectrogram')plt.show()#7、梅尔频率倒谱系数#MFCC是一种广泛用于语音识别的特征,这种特征是通过离散余弦变换(DCT)对梅尔滤波器组的输出进行压缩实现,是常见的语音提取特征。#提取MFCC特征mfccs=librosa.feature.mfcc(y=y,sr=sr,n_mfcc=13)#可视化MFCCplt.figure(figsize=(10,4))librosa.display.specshow(mfccs,sr=sr,x_axis='time')plt.colorbar()plt.title('MFCC')plt.tight_layout()plt.show()#8、对数梅尔滤波能量#MFCC是一种广泛用于语音识别的特征,这种特征是通过离散余弦变换(DCT)对梅尔滤波器组的输出进行压缩实现,是常见的语音提取特征。#提取MFCC特征mfccs=librosa.feature.mfcc(y=y,sr=sr,n_mfcc=13)#可视化MFCCplt.figure(figsize=(10,4))librosa.display.specshow(mfccs,sr=sr,x_axis='time')plt.colorbar()plt.title('MFCC')plt.tight_layout()plt.show()#9、数据归一化,数据归一化将特征的数值范围标准化y_normalized=librosa.util.normalize(y)#10、计算一阶和二阶差分,为了捕捉语音特征的时间变化,通常会计算一阶和二阶差分delta_mfcc=librosa.feature.delta(mfccs) #计算一阶差分(Delta)delta2_mfcc=librosa.feature.delta(mfccs,order=2) #计算二阶差分(Delta-Delta)综合示例使用librosa处理语音数据往往需要进行多种操作组合,比如加载数据,然后去除静音,再进行预加重,最后提取特征。importlibrosaimportlibrosa.displayimportnumpyasnpimportmatplotlib.pyplotasplt#加载音频文件y,sr=librosa.load('example.wav',sr=16000)#去除静音部分y_trimmed,_=librosa.effects.trim(y)#预加重pre_emphasis=0.97y_preemphasized=np.append(y_trimmed[0],y_trimmed[1:]-pre_emphasis*y_trimmed[:-1])#提取MFCC特征mfccs=librosa.feature.mfcc(y=y_preemphasized,sr=sr,n_mfcc=13)#可视化MFCCplt.figure(figsize=(10,4))librosa.display.specshow(mfccs,sr=sr,x_axis='time')plt.colorbar()plt.tight_layout()plt.show()谢谢!大数据采集与预处理技术*

*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Librosa等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:三、Scipy语音预处理(1)Scipy简介

Scipy是一个强大的科学计算库,提供了各种信号处理功能,包括滤波器设计、卷积、傅里叶变换等。适合做更深入的信号分析,如低通滤波、去噪等。SciPy偏向于低级别的处理,需要配合其他库(如numpy)直接对音频数据进行计算,适合进行数据分析、特征提取等任务,主要用于科研、数据处理或机器学习场景下的音频数据分析。(2)安装pipinstallscipy(3)音频信号的加载和保存fromscipy.ioimportwavfile#读取音频文件sample_rate,data=wavfile.read('example.wav')#保存音频文件wavfile.write('output.wav',sample_rate,data)(4)滤波SciPy的signal模块支持多种滤波器(如低通、高通、带通滤波器),可用于去除噪声、频带选择等。创建并应用数字滤波器(Butterworth、Chebyshev等),支持FIR和IIR滤波。适用于消除音频信号中的噪声、隔离特定频段(如语音或乐器频段),函数如下:scipy.signal.butter(N,Wn,btype='low',analog=False,output='ba',fs=None)参数:N(int):滤波器的阶数;Wn(array_like):截止频率,对于低通和高通滤波器是标量,对于带通和带阻滤波器,长度为2的序列。数字滤波器,相对于奈奎斯特频率(fs/2)归一化,范围[0,1]。对于模拟滤波器表示角频率(如rad/s);btype(str,optional):滤波器类型,‘low’:低通滤波器(默认),‘high’:高通滤波器,‘band’:带通滤波器,‘bandstop’:带阻滤波器;analog(bool,optional):False:返回数字滤波器(默认),True:返回模拟滤波器;output(str,optional):输出类型,‘ba’:返回分子/分母系数(默认),‘zpk’:返回零点、极点、增益,‘sos’:返回二阶节表示;fs(float,optional):采样频率(数字滤波器时使用);返回值:根据output参数的不同,返回不同形式的滤波器系数: ‘ba’(默认):(b,a)分子和分母多项式;‘zpk’:(z,p,k)零点、极点和系统增益;‘sos’:二阶节表示。(4)滤波#读取音频文件sample_rate,data=wavfile.read('audio/example1.wav')#设计一个4阶低通Butterworth数字滤波器,截止频率为0.2倍奈奎斯特频率b,a=signal.butter(4,0.2)#用于存储处理后的数据filtered_data=numpy.zeros_like(data)#处理多声道(如果是立体声)iflen(data.shape)==2:#如果是立体声

forchinrange(data.shape[1]):#处理每个声道

filtered_data[:,ch]=signal.filtfilt(b,a,data[:,ch])else:filtered_data=signal.filtfilt(b,a,data)#保存音频文件wavfile.write('audio/output.wav',sample_rate,filtered_data)(5)傅里叶变换(频谱分析)SciPy的fft模块支持快速傅里叶变换(FFT),用于将时域信号转换到频域,用于频谱分析。用于计算音频信号的频谱,显示各个频率成分的幅度,适用于音频特征提取、频谱可视化、音调检测等。fromscipy.fftimportfft,fftfreqimportnumpyasnp#计算傅里叶变换N=len(data)yf=fft(data)xf=fftfreq(N,1/sample_rate)#可视化频谱importmatplotlib.pyplotaspltplt.plot(xf,np.abs(yf))plt.xlabel("Frequency(Hz)")plt.ylabel("Amplitude")plt.show()(6)卷积卷积可用于模拟混响、延迟等效果,适用于一些简单的音效设计。通过卷积操作对信号进行时域处理,适合基础的混响或延迟模拟。适用于音频混响、声学效果模拟。#创建一个简单的脉冲响应impulse_response=np.zeros(500)impulse_response[0]=1impulse_response[50]=0.5impulse_response[100]=0.3#分别处理左右声道left_channel=data[:,0]right_channel=data[:,1]#对每个声道进行卷积convolved_left=signal.convolve(left_channel,impulse_response,mode='same')convolved_right=signal.convolve(right_channel,impulse_response,mode='same')#合并处理后的声道convolved_stereo=np.column_stack((convolved_left,convolved_right))#保存音频文件wavfile.write('audio/output_conv.wav',sample_rate,convolved_stereo)(7)窗函数(短时傅里叶变换、频率分辨率)SciPy的signal模块支持窗函数(如汉宁窗、海明窗等),可以用于短时傅里叶变换或信号的平滑处理(“滤镜”,平滑开启结束),用于创建和应用窗函数,优化频谱分辨率,减少频谱泄漏,适用短时频谱分析、动态信号的特征提取。短时傅里叶变换STFT,就像音乐的“心电图”:把声音切成小段时间片段,对每一段做傅里叶变换,最后得到一张“时间-频率-能量”的热力图,能精确显示每个频率的声音(如C调、G调等)什么时候开始结束。用于音乐频谱可视化,语音特征提取。普通傅里叶变换,能把混杂在一起的不同频率信号(比如一首歌)拆解成单独的音高成分(如C调、G调等),每个音高分别有多大声。f,t,Zxx=signal.stft(x, #输入信号(单声道/多声道)

fs=1.0, #采样率

window='hann', #窗函数(默认汉宁窗)

nperseg=256, #每段长度

noverlap=None, #重叠样本数(默认50%)

nfft=None, #FFT点数(默认=nperseg)

detrend=False, #是否去趋势

return_onesided=True, #是否返回单边谱

boundary='zeros', #边界处理

padded=True #是否填充)(7)窗函数importmatplotlib.pyplotasplt#对称窗(默认,适合滤波器设计)sym_win=signal.windows.hann(64,sym=True)#周期窗(适合频谱分析)per_win=signal.windows.hann(64,sym=False)plt.figure(figsize=(10,4))plt.plot(sym_win,label='SymmetricWindow')plt.plot(per_win,label='PeriodicWindow')plt.title('ComparisonofSymmetricandPeriodicHanningWindows')plt.legend()plt.grid(True)plt.show()(7)窗函数#应用窗口函数到信号,非立体音直接使用汉宁窗进行傅里叶变换STFTiflen(data.shape)==1:f,t,Zxx=signal.stft(data,fs=sample_rate,window='hann',nperseg=128)plt.figure(figsize=(10,6))plt.pcolormesh(t,f,np.abs(Zxx),shading='gouraud')plt.ylabel('Frequency[Hz]')plt.xlabel('Time[sec]')plt.colorbar(label='Magnitude')plt.show()#否则对左右声道分别加窗处理else:#获取左右声道

left_ch=data[:,0]right_ch=data[:,1]#对左右声道分别计算STFTf_left,t_left,Z_left=signal.stft(left_ch,fs=sample_rate,window='hann',nperseg=128)f_right,t_right,Z_right=signal.stft(right_ch,fs=sample_rate,window='hann',nperseg=128)(7)窗函数#绘制左右声道频谱

plt.figure(figsize=(15,6))plt.subplot(1,2,1)plt.pcolormesh(t_left,f_left,np.abs(Z_left),shading='gouraud')plt.title('LeftChannelSTFT(HanningWindow)')plt.ylabel('Frequency[Hz]')plt.xlabel('Time[sec]')plt.colorbar()plt.subplot(1,2,2)plt.pcolormesh(t_right,f_right,np.abs(Z_right),shading='gouraud')plt.title('RightChannelSTFT(HanningWindow)')plt.ylabel('Frequency[Hz]')plt.xlabel('Time[sec]')plt.colorbar()(8)插值和采样率转换SciPy的interpolate模块可以对音频信号做插值处理,适合于改变采样率。通过插值对音频信号进行重采样,以改变采样率,适用于音频的上采样或下采样,兼容不同设备的采样率。重采样就是改变音频的“时间刻度”,就像把一首歌从“慢速播放”调成“快速播放”,或者反过来。但和单纯变速不同,重采样要保证音高不变,只改变声音的“密度”。#读取音频文件original_rate,audio_data=wavfile.read('audio/example1.wav')target_rate=48000#例如从44.1kHz转到48kHz#创建时间轴original_length=len(audio_data)original_time=np.arange(original_length)/original_rate#创建插值函数interp_func=erp1d(original_time,audio_data,kind='cubic',#立方插值质量较好

axis=0,fill_value="extrapolate")#计算新的时间点new_length=int(original_length*target_rate/original_rate)new_time=np.arange(new_length)/target_rateresampled_audio=interp_func(new_time) #执行重采样wavfile.write('audio/output_rhz.wav',target_rate,resampled_audio.astype(16))谢谢!大数据采集与预处理技术*

*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Noisereduce等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:三、常见降噪方法分析(1)基于频谱的降噪把声音变成频谱图(类似声音的“指纹图”),在图上标出噪音部分(比如没人说话时的背景声),把噪音对应的频率能量减弱。例如:你录了一段语音,但有空调嗡嗡声,频谱图显示空调声集中在200Hz,把200Hz的声音能量调低→空调声变小了优点:简单直接,适合恒定噪音(如风扇声)缺点:可能误伤有用声音(比如人声低频也被削弱)(2)Wiener滤波降噪Wiener滤波降噪像“智能调音量”,核心思想“噪音大的地方多降,噪音小的地方少降”。做法:先估算噪音的频谱特征(比如录音开头几秒纯噪音),计算每个频率点的信噪比(SNR),信号强/噪音弱→基本保留,信号弱/噪音强→大幅削弱,根据这个比例动态调整音量。例如:语音中500Hz人声比噪音大10倍→保留90%,3000Hz人声和噪音一样大→只保留50%。优点:比简单频谱降噪更精准。缺点:需要提前知道噪音特征(3)自适应噪声抑制这种方法像“实时噪音跟随”,核心思想:“边走边听边降噪”,动态跟踪噪音变化。做法:实时监测背景噪音(比如突然的车鸣声),快速计算噪音和语音的差异,瞬间压低当前噪音,但不影响人声。例如:你正在打电话,突然有狗叫,系统0.1秒内检测到狗叫频率,只降低狗叫的频率段,人声几乎不变。优点:适合变化噪音(如街头、咖啡馆)。缺点:计算复杂,需要高性能处理器四、Noisereduce语音预处理(1)Noisereduce简介专注于音频降噪的Python库,基于信号处理和深度学习方法进行噪声抑制,适合处理语音、乐器和环境音频等。(2)常用功能noisereduce提供了多种降噪功能,主要包括:1)基于频谱的降噪:通过频谱分析去除音频信号中的背景噪声。2)Wiener过滤:使用Wiener滤波器对音频进行降噪处理。3)自适应降噪:利用多种算法的组合,针对不同的音频环境自适应调整降噪效果。(3)适用场景1)语音增强:提高语音的清晰度和可懂度,适用于语音识别、语音传输和通话音质优化。2)乐器音频降噪:在音乐录制或演奏中去除背景噪声,提升音质。3)环境音频处理:在录音或环境声音分析中去除不必要的噪声,使信号更加纯净。(4)安装pipinstallnoisereduce(5)基于频谱的降噪noisereduce中最常用的功能是基于频谱的降噪方法。例子如下:importnoisereduceasnrfromscipy.ioimportwavfileimportnumpyasnp#读取音频文件rate,audio_data=wavfile.read("audio/example1.wav")#统一转为立体声处理(单声道转双声道)iflen(audio_data.shape)==1:audio_data=np.column_stack((audio_data,audio_data))#转为双声道#提取噪音样本(取开头1秒作为噪音参考)noise_sample=audio_data[:int(1*rate)]#分别处理左右声道reduced_audio=np.zeros_like(audio_data)forchinrange(audio_data.shape[1]):reduced_channel=nr.reduce_noise(y=audio_data[:,ch],sr=rate,y_noise=noise_sample[:,ch],#降噪强度(1.0为最大)prop_decrease=1.0,#FFT窗口大小,数值越大,频率分析越准,但时间定位越模糊(适合稳态噪音如空调声),数值越小,时间定位越准,但频率分析越粗糙(适合突发噪音如关门声)

n_fft=1024,#窗口长度,通常设为n_fft的一半或相等,实际分析时的"切片长度",较短的窗口更适合瞬态声音(如鼓点)

win_length=512,#帧移,控制"分析步长",影响计算量和流畅度,越小计算量越大

hop_length=256)#将结果存入对应声道

reduced_audio[:,ch]=reduced_channel

#保存结果wavfile.write("audio/reduced_example1.wav",rate,reduced_audio)(6)使用Wiener滤波进行降噪Wiener滤波是一种经典的降噪方法,noisereduce提供了相应的接口进行Wiener滤波处理。#应用Wiener滤波进行降噪,注意最新版noisereduce的reduce_noise接口没有use_wiener参数reduced_noise=nr.reduce_noise(y=data,sr=rate,use_wiener=True)(7)自适应噪声抑制noisereduce通过自适应参数调整降噪效果,可以自动根据输入信号的噪声水平进行优化。 #自适应降噪reduced_noise=nr.reduce_noise(y=data,sr=rate,n_std_thresh_stationary=1.5,prop_decrease=0.8)(8)对特定噪声片段进行降噪如果已知音频中的特定噪声片段,可以通过该片段作为噪声参考进行降噪。#选择噪声片段(例如前10000个采样点)noise_clip=data[0:10000]#基于噪声片段进行降噪reduced_noise=nr.reduce_noise(y=data,sr=rate,y_noise=noise_clip)(9)降噪参数的自定义调整可以调整降噪过程中的参数,如阈值、降噪比例等,以优化降噪效果。#读取音频文件rate,data=wavfile.read("example.wav")#自定义参数进行降噪reduced_noise=nr.reduce_noise(y=data,sr=rate,n_fft=2048,#FFT点数

hop_length=512,#跳跃长度

prop_decrease=0.85,#降噪比例

n_std_thresh_stationary=1.2#噪声阈值)#保存降噪后的音频wavfile.write("custom_reduced_example.wav",rate,reduced_noise)综合应用在实际应用中,通常会结合多个库来处理语音数据。例如,可以使用librosa进行音频加载和特征提取,Noisereduce用于去噪,Scipy用于信号滤波。importlibrosaimportnoisereduceasnrfromscipyimportsignal#加载音频文件y,sr=librosa.load('audio_file.wav',sr=16000)#降噪处理reduced_noise=nr.reduce_noise(y=y,sr=sr)#提取MFCC特征mfccs=librosa.feature.mfcc(y=reduced_noise,sr=sr,n_mfcc=13)#创建低通滤波器b,a=signal.butter(4,0.1,'low')#应用滤波器到音频数据filtered_data=signal.filtfilt(b,a,reduced_noise)谢谢!大数据采集与预处理技术*

*项目三语音直播数据采集与预处理序号软件配置要求1OBS最新版本2Librosa等最新版本一、项目目标:1、根据应用需求确定语音数据采集方法,并完成语音数据采集;2、对采集的语音数据进行去噪、归一化、采样频率转换、语音特征提取、静音去除、语音切分、信号增强等预处理操作;3、根据训练模型要求完成语音数据文本转录、音频分割、标签标注等,为不同模型准备训练数据。二、环境要求:音频预处理目标是通过一系列处理任务提高数据质量、减少噪声和干扰、增强特征的可分性,使其更适用于机器学习和深度学习模型。对于自行采集的音频数据需要进行一系列的处理,保证音频数据的质量。importnoisereduceasnrfromscipy.ioimportwavfilefromscipy.signalimportwienerimportlibrosaimportnumpyasnp#读数据并做基本处理rate,audio_data=wavfile.read("audio/example1.wav")#统一转为立体声处理(单声道转双声道)iflen(audio_data.shape)==1:audio_data=np.column_stack((audio_data,audio_data))reduced_audio,rate=noiseReduce1(audio_data,rate)#保存结果wavfile.write("audio/reduced_example.wav",rate,reduced_audio)#去除噪音,audio_data是读取的音频数据,sr是采样率defnoiseReduce1(audio_data,sr=None):#分别处理左右声道

reduced_audio=np.zeros_like(audio_data)#自适应降噪

forchinrange(audio_data.shape[1]):reduced_channel=nr.reduce_noise(y=audio_data[:,ch],sr=sr,n_std_thresh_stationary=1.5)#将结果存入对应声道

reduced_audio[:,ch]=reduced_channelreturnreduced_audio,sr(2)多重去噪#多重降噪处理方法二,audio_data是音频数据,sr是采样率defnoiseReduce2(audio_data,sr=None):#转换为float类型处理(避免整数运算问题)

audio_float=audio_data.astype(np.float32)/32768.0#假设原始是int16#分别处理左右声道

reduced_audio=np.zeros_like(audio_float)forchinrange(audio_float.shape[1]):#使用Wiener滤波进行降噪,mysize类似滤波核大小,越大降噪越好,但是声音细节会越模糊

filtered_data=wiener(audio_float[:,ch],mysize=15)reduced_channel=nr.reduce_noise(y=filtered_data,sr=sr)#限制数值范围并存入结果

reduced_audio[:,ch]=np.clip(reduced_channel,-1.0,1.0)#返回去噪后的音频

return(reduced_audio*32767).astype(16),sr(3)静音消除可以通过设置音量阈值检测静音区段,利用信号幅值低于阈值的特征,将静音部分删除以减小数据冗余。#去除静音,top_db是设置的声压级阈值,默认值为20defremove_silence(audio_data,sr=None,top_db=20):trimmed_channels=[]forchinrange(audio_data.shape[1]):#检测非静音区间,返回每个非静音区间的起始和结束位置。

non_silent_intervals=librosa.effects.split(audio_data[:,ch],top_db=top_db)#拼接非静音区间,将所有非静音区间拼接成一个新的音频数据数组

trimmed_channel=np.concatenate([audio_data[start:end,ch]forstart,endinnon_silent_intervals])#返回处理后的音频

trimmed_channels.append(trimmed_channel)#统一长度(取最短的声道长度)

min_length=min(len(ch)forchintrimmed_channels)trimmed_data=np.zeros((min_length,audio_data.shape[1]),dtype=audio_data.dtype)forchinrange(audio_data.shape[1]):trimmed_data[:,ch]=trimmed_channels[ch][:min_length]returntrimmed_data,sr(4)特征提取

对于音频分类、情感识别、语音识别等任务,需要将音频信号转换为能够表达其特性的数值形式,通常包括频谱、MFCC(梅尔频率倒谱系数)、能量、零过率等。可以计算频域或时域特征,例如频谱、MFCC、能量、零过率和Chroma特征,帮助模型提取和识别音频的关键特性。#特征提取defextract_features(audio_data,sr=None):#确保是单声道(Librosa要求)iflen(audio_data.shape)==2:audio_data=np.mean(audio_data,axis=1)#合并声道或取左声道#检查并转换数据类型为浮点类型,librosa归一化

ifnotnp.issubdtype(audio_data.dtype,np.floating):audio_data=librosa.util.normalize(audio_data.astype(np.float32))#将提取的特征存入字典

features={#计算梅尔频率倒谱系数(MFCC),声音的指纹,把声音分解成不同频率成分“配方表”,n_mfcc是要提取多少层,越大包含的细节越多

'mfccs':librosa.feature.mfcc(y=audio_data,sr=sr,n_mfcc=13),#计算Chroma特征,只看声音属于哪个音符(忽略高低音区)

'chroma_stft':librosa.feature.chroma_stft(y=audio_data,sr=sr),#计算频谱质心,像"声音的亮度指标",告诉你声音是"低沉"还是"尖锐"'spectral_centroid':librosa.feature.spectral_centroid(y=audio_data,sr=sr),#计算带宽,像"声音的胖瘦程度",测量频率分布的分散程度

'spectral_bandwidth':librosa.feature.spectral_bandwidth(y=audio_data,sr=sr),#计算零交叉率,像"声音的抖动次数",数一秒钟内声音波形穿过零点的次数

'zero_crossing_rate':librosa.feature.zero_crossing_rate(y=audio_data),#计算能量(RootMeanSquare),像是"声音的力气大小",测量声音的响度

'rms':librosa.feature.rms(y=audio_data)}returnfeatures#读取音频文件rate,audio_data=wavfile.read("audio/example1.wav")#统一转为立体声处理(单声道转双声道)iflen(audio_data.shape)==1:audio_data=np.column_stack((audio_data,audio_data))reduced_audio1,rate=noiseReduce1(audio_data,rate)reduced_audio2,rate=noiseReduce2(reduced_audio1,rate)trimmed_data,rate=remove_silence(reduced_audio2,rate)print(trimmed_data.shape)#保存结果wavfile.write("audio/trimmed_example.wav",rate,reduced_audio2)features=extract_features(trimmed_data,rate)print(features)(6)时间伸缩对于语音识别、音频分类、数据增强、音乐节奏调整等任务,需要改变音频的时长而不改变频率,用于数据增强或节奏调整。时间伸缩可以通过调整音频信号的播放速度实现,在保持频率不变的同时增加或减少时长。#时间伸缩,audio_data是读取的音频数据,sr是采样率#stretch_factor是时间伸缩因子,大于1表示加速,小于1表示减速deftime_stretch_audio(audio_data,sr=None,stretch_factor=1.2):#确保是单声道(Librosa要求)iflen(audio_data.shape)==2:audio_data=np.mean(audio_data,axis=1)#合并声道或取左声道

#对音频数据进行时间伸缩

stretched_data=librosa.effects.time_stretch(audio_data,rate=stretch_factor)returnstretched_data,sr(7)频率偏移频率偏移通常是用于语音识别数据增广、音乐分类、乐器识别等任务,预处理需要改变音频信号的频率而保持时长不变,主要用于数据增广和适应音高差异。可以使用FFT频率平移、音高平移或变调算法,使信号的音高上下偏移,从而创造新的数据样本。#频率偏移,audio_data是读取的音频数据,sr是采样率#n_steps是音高偏移的步长(正数表示升高音高,负数表示降低音高)defpitch_shift_audio(audio_data,sr=None,n_steps=2):#确保是单声道(Librosa要求)iflen(audio_data.shape)==2:audio_data=np.mean(audio_data,axis=1)#合并声道或取左声道

#对音频数据进行音高平移

shifted_data=librosa.effects.pitch_shift(audio_data,sr=sr,n_steps=n_steps)returnshifted_data,sr(8)规范化和降维对于大规模数据集预处理进行数据压缩,可以加速模型训练,需要对音频进行特征提取,对提取的特征归一化并使用降维方法简化特征空间,提升计算效率。可以使用MinMaxScaler或StandardScaler进行特征归一化,并使用PCA等降维方法减少特征维度。fromsklearn.preprocessingimportMinMaxScaler,StandardScalerfromsklearn.decompositionimportPCA#频率偏移处理,audio_data是读取的音频数据,sr是采样率#n_mfcc是提取的MFCC特征数量,n_components是PCA降维后的特征维度数,scaling_method是归一化方法,默认"minmax"defpreprocess_audio_features(audio_data,sr=None,n_mfcc=13,scaling_method='minmax',n_components=10):#确保是单声道(Librosa要求)iflen(audio_data.shape)==2:audio_data=np.mean(audio_data,axis=1)#合并声道或取左声道

#提取MFCC特征,并进行转置,以适应每行一条特征的格式

mfccs=librosa.feature.mfcc(y=audio_data,sr=sr,n_mfcc=n_mfcc).T#选择归一化方法

ifscaling_method=='minmax':scaler=MinMaxScaler()elifscaling_method=='standard':scaler=StandardScaler()else:raiseValueError("Invalidscalingmethod.Choose'minmax'or'standard'.")#归一化特征

normalized_features=scaler.fit_transform(mfccs)#使用PCA进行降维

pca=PCA(n_components=n_components)reduced_features=pca.fit_transform(normalized_features)returnreduced_features(9)数据增广对于语音识别、情感识别、环境音分类等任务,需要通过各种变换(如加噪、时间伸缩、频率偏移)增加数据集的样本量,改善模型的泛化能力。数据增广技术可以通过加噪声、时间伸缩、频率偏移等生成新的音频样本,从而增强数据多样性。参照前面代码案例.defadd_noise(data,noise_factor=0.005):"""为音频数据添加随机噪声"""noise=np.random.randn(len(data))augmented_data=data+noise_factor*noisereturnnp.clip(augmented_data,-1.0,1.0)#限制音频幅值范围deftime_stretch(data,rate=1.0):"""改变音频的播放速度(时间伸缩)"""returnlibrosa.effects.time_stretch(data,rate=rate)defpitch_shift(data,sr,n_steps=2):"""调整音频的音高(频率偏移)"""returnlibrosa.effects.pitch_shift(data,sr=sr,n_steps=n_steps)defaugment_audio(audio_data,sr=None,noise_factor=0.005,stretch_rate=1.0,pitch_steps=2):#加噪音增广

noisy_data=add_noise(audio_data,noise_factor)#时间伸缩增广

stretched_data=time_stretch(audio_data,rate=stretch_rate)#频率偏移增广

shifted_data=pitch_shift(audio_data,sr,n_steps=pitch_steps)returnnoisy_data,stretched_data,shifted_data(10)归一化对于大多数深度学习模型,需要进行数据前处理、音频特征提取、增强数据一致性。将音频数据的幅值归一化到同一范围,以便特征的分布一致,提高模型的训练稳定性。常用的归一化方法包括将数据缩放到[0,1]或[-1,1]区间,这样可以避免音频数据幅值差异过大对模型的影响。#归一化处理,audio_data是librosa.load读取的音频数据,sr是采样率,默认使用差值标准化minmaxdefnormalize_audio(audio_data,sr=None,norm_type="minmax"):#归一化处理

ifnorm_type=="minmax":#将数据缩放到[0,1]或[-1,1]区间

normalized_data=audio_data/np.max(np.abs(audio_data))elifnorm_type=="standard":#使用Z-score标准化,将数据调整为均值为0,标准差为1mean=np

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论