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

本文主要总结了使用Python扩充音频数据的方法,包括仅适用于稳态音频的切分方法,通过改变采样速度实现时间延长(拉伸),改变音高、音高偏移,以及添加如高斯噪声这类背景噪声等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一:音频切分

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

#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

### 使用Python扩充数据集的方法及工具 在机器学习和深度学习项目中,数据增强是一种有效的方式,用于扩展有限的数据集并改善模型性能。以下是几种常用方法及其对应的Python工具。 #### 方法一:基于图像处理的增强方式 对于图像数据,可以通过旋转、翻转、缩放等方式来生成新样本。这些操作通常由专门的库支持完成。例如,在PyTorch框架下,`torchvision.transforms`模块提供了丰富的功能来进行数据增强[^1]: ```python import torch from torchvision import transforms transform = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转 transforms.RandomRotation(degrees=(0, 360)), # 随机旋转角度 transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), # 调整颜色参数 transforms.Resize((224, 224)), # 改变图片尺寸 transforms.ToTensor() # 将图片转换为张量 ]) ``` 上述代码展示了如何定义一组组合变换,并将其应用于输入图像数据上。 --- #### 方法二:利用高级API简化流程 除了手动编写复杂的预处理逻辑外,还可以借助更高级别的封装工具如 `imgaug`, `albumentations` 或者 TensorFlow 的 Keras API 来快速实现复杂的数据增强策略。下面是一个使用 `imgaug` 库的例子: ```python import imgaug.augmenters as iaa seq = iaa.Sequential([ iaa.Fliplr(0.5), # 水平翻转的概率设为50% iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, rotate=(-45, 45)), iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255)) ]) images_augmented = seq(images=[image]) # 对单幅或多幅图像应用增强序列 ``` 此段脚本实现了多种几何与像素级变化相结合的效果[^3]。 --- #### 方法三:针对特定场景定制方案 当标准方法无法满足需求时,则需探索更加精细控制手段。比如音频信号可能涉及时间拉伸/压缩、音高偏移;自然语言则可通过同义词替换、句子重组等形式创造额外语料。而对于标注质量较差的情况,应特别注意避免因不当增广而引入过多干扰因素影响最终效果[^2]。 如果发现某些增强后的样例反而降低了整体表现力,那么可以尝试采用半监督学习(Pu-learning)理念筛选出真正有益部分作为补充材料参与后续训练过程。 --- ### 总结 综上所述,无论是基础还是进阶层面的操作都可以依靠现有的成熟软件包轻松达成目标——既简单又高效地扩增原始资料集合大小的同时还能兼顾到维持原有分布特性不变这一重要原则之上。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值