本文总结了扩充音频数据的一些方法
一:音频切分
提示:仅针对稳态音频可以用此方法
代码如下:
#coding:utf-8
from pydub import AudioSegment
import numpy as np
audio = AudioSegment.from_file("C:/sounds/M6CF4 rattle noise_bench test/NG800rpm Dyn45rpm 20Hz_32_上近场_S.wav", "wav")
audio_time = len(audio)#获取待切割音频的时长,单位是毫秒
print(audio_time)
cut_parameters = np.arange(1,audio_time/1000,0.5) #np.arange()函数第一个参数为起点,第二个参数为终点,第三个参数为步长(10秒)
start_time = int(0)#开始时间设为0
#根据数组切割音频
for t in cut_parameters:
stop_time = int(t * 1000) # pydub以毫秒为单位工作
print("split at [{}:{}] ms".format(start_time, stop_time))
audio_chunk = audio[start_time:stop_time] #音频切割按开始时间到结束时间切割
audio_chunk.export("C:/sounds02/M6CF4 rattle noise_bench test/NG800rpm Dyn45rpm 20Hz_32_上近场_S-{}.wav".format(int(t/0.5)), format="wav") # 保存音频文件,t/1只是为了计数,根据步长改变。步长为5就写t/5
start_time = stop_time - 500 #开始时间变为结束时间前4s---------也就是叠加上一段音频末尾的4s
print('finish')
二、时间延长(拉伸)
减慢或加快音频采样速度(同时保持音高不变),每个样本的时间拉伸的尺度: [0.81, 0.93, 1.07, 1.23]
#coding:utf-8
import librosa
import cv2
from scipy.io import wavfile
import os
import numpy as np
n_path = os.path.dirname(input_audio)
out_path = os.path.dirname(output_audio)
if not os.path.isdir(out_path): # 判断目标路径是否存在,不存在则创建
os.mkdir(out_path)
y, sr = librosa.load(input_audio, sr=None)
for rate in [0.81, 0.93, 1.07, 1.23]: # 拉伸速率
y_shift = librosa.effects.time_stretch(y, rate=rate) # 使用TS生成新数据
#数据导出为文件 replace('.ogg', '_no-{}.wav'.format(step))) (old,new)
librosa.output.write_wav(os.path.join(out_path,
os.path.basename(input_audio).replace('.wav', '_ts-{}.wav'.format(rate))), y_shift, sr)
index = 0
file_path = "./sounds02//" # 输入文件夹路径
save_path = "./kuochongsound/" # 增强后数据(输出)文件夹路径[无文件夹会自动创建]
for filename in os.listdir(r"./" + file_path):
print(filename)
in_path = file_path + filename
out_path = save_path + filename
data_augmentation(in_path, out_path) # 数据增强 4*4
index = index + 1
print(index)
print()
cv2.waitKey(200)
三、音高变化(ps1)
提高或降低音频的音高(保持持续时间不变),每个样本音高偏移了四个值(以半音为单位): [-2, -1, 1, 2]
代码如下(示例):
替换上述代码循环部分即可
for step1 in [-2, -1, 1, 2]:
y_shift = librosa.effects.pitch_shift(y, sr, n_steps=step1) # 使用PS1生成新数据
librosa.output.write_wav(os.path.join(out_path,
os.path.basename(input_audio).replace('.wav', '_ps1-{}.wav'.format(step1))), y_shift, sr)
四:音高偏移(ps2)
for step2 in [-3.5, -2.5, 2.5, 3.5]:
y_shift = librosa.effects.pitch_shift(y, sr, n_steps=step2) # 使用PS2生成新数据
librosa.output.write_wav(os.path.join(out_path,
os.path.basename(input_audio).replace('.wav', '_ps2-{}.wav'.format(step2))), y_shift, sr)
五:加背景噪声(BG)
以高斯噪声为例
for step3 in [1, 2, 3, 4]:
wn = np.random.normal(0, 1, len(y)) # 从高斯分布(正态分布)提取样本
y_noise = np.where(y != 0.0, y.astype('float64') + 0.02 * wn, 0.0).astype(np.float32)
librosa.output.write_wav(os.path.join(out_path,
os.path.basename(input_audio).replace('.wav', "_no-{}.wav".format(step3))), y_noise, sr)
#若报错librosa无output模块,解决方法:https://blog.csdn.net/zkw_1998/article/details/112015654?ops_request_misc=&request_id=&biz_id=102&utm_term=%2520module%2520%27librosa%27%2520has%2520no%2520attri&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-112015654.nonecase