数据扩充(音频)方法总结

本文总结了扩充音频数据的一些方法

一:音频切分

提示:仅针对稳态音频可以用此方法
代码如下:

#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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值