广告
返回顶部
首页 > 资讯 > 后端开发 > Python >分析语音数据增强及python实现
  • 299
分享到

分析语音数据增强及python实现

python语音数据 2022-06-02 22:06:48 299人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、概述二、加噪2.1、第一种:控制噪声因子2.2、第二种:控制信噪比三、加混响3.1、方法一:PyrooMacoustics实现音频加混响3.2、方法二:Image Source Method 算法讲解四、生成

目录
  • 一、概述
  • 二、加噪
    • 2.1、第一种:控制噪声因子
    • 2.2、第二种:控制信噪比
  • 三、加混响
    • 3.1、方法一:PyrooMacoustics实现音频加混响
    • 3.2、方法二:Image Source Method 算法讲解
  • 四、生成指定SER的混响
    • 五、波形位移
      • 六、波形拉伸
        • 七、音高修正(Pitch Shifting)

          一、概述

          音频时域波形具有以下特征:音调,响度,质量。我们在进行数据增强时,最好只做一些小改动,使得增强数据和源数据存在较小差异即可,切记不能改变原有数据的结构,不然将产生“脏数据”,通过对音频数据进行数据增强,能有助于我们的模型避免过度拟合并变得更加通用。

          我发现对声波的以下改变是有用的:Noise addition(增加噪音)、Add reverb(增加混响)、Time shifting(时移)、Pitch shifting(改变音调)和Time stretching(时间拉伸)。

          本章需要使用的python库:

          • matplotlib:绘制图像
          • librosa:音频数据处理
          • numpy:矩阵数据处理

          使用先画出原始语音数据的语谱图和波形图

          
          import librosa
          import numpy as np
          import matplotlib.pyplot as plt
          
          plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
          plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示符号
          fs = 16000
          
          wav_data, _ = librosa.load("./p225_001.wav", sr=fs, mono=True)
          
          # ########### 画图
          plt.subplot(2, 2, 1)
          plt.title("语谱图", fontsize=15)
          plt.specgram(wav_data, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")
          plt.xlabel('秒/s', fontsize=15)
          plt.ylabel('频率/Hz', fontsize=15)
          
          plt.subplot(2, 2, 2)
          plt.title("波形图", fontsize=15)
          time = np.arange(0, len(wav_data)) * (1.0 / fs)
          plt.plot(time, wav_data)
          plt.xlabel('秒/s', fontsize=15)
          plt.ylabel('振幅', fontsize=15)
          
          plt.tight_layout()
          plt.show()

          二、加噪

          添加的噪声为均值为0,标准差为1的高斯白噪声,有两种方法对数据进行加噪

          2.1、第一种:控制噪声因子

          
          def add_noise1(x, w=0.004):
              # w:噪声因子
              output = x + w * np.random.nORMal(loc=0, scale=1, size=len(x))
              return output
          
          Augmentation = add_noise1(x=wav_data, w=0.004)

          2.2、第二种:控制信噪比

          通过信噪比的公式推导出噪声。

          
          def add_noise2(x, snr):
              # snr:生成的语音信噪比
              P_signal = np.sum(abs(x) ** 2) / len(x)  # 信号功率
              P_noise = P_signal / 10 ** (snr / 10.0)  # 噪声功率
              return x + np.random.randn(len(x)) * np.sqrt(P_noise)
          
          Augmentation = add_noise2(x=wav_data, snr=50)

          三、加混响

          我这里使用的是Image Source Method(镜像源方法)来实现语音加混响,我想用两种方法来给大家实现,第一种是直接调用Python库——Pyroomacoustics来实现音频加混响,第二种就是按照公式推导一步一步来实现,两种效果一样,想看细节的可以参考第二种方法,只想开始实现效果的可以只看第一种方法:

          3.1、方法一:Pyroomacoustics实现音频加混响

          首先需要安装Pyroomacoustics,这个库非常强大,感兴趣也可以多看看其他api接口

          pip install  Pyroomacoustics

          步骤:

          创建房间(定义房间大小、所需的混响时间、墙面材料、允许的最大反射次数、)

          在房间内创建信号源

          在房间内放置麦克风

          创建房间冲击响应

          模拟声音传播

          
          # -*- coding:utf-8 -*-
          import pyroomacoustics as pra
          import numpy as np
          import matplotlib.pyplot as plt
          import librosa
          
          # 1、创建房间
          # 所需的混响时间和房间的尺寸
          rt60_tgt = 0.5  # 所需的混响时间,秒
          room_dim = [9, 7.5, 3.5]  # 我们定义了一个9m x 7.5m x 3.5m的房间,米
          
          # 我们可以使用Sabine's公式来计算壁面能量吸收和达到预期混响时间所需的ISM的最大阶数(RT60,即RIR衰减60分贝所需的时间)
          e_absorption, max_order = pra.inverse_sabine(rt60_tgt, room_dim)    # 返回 墙壁吸收的能量 和 允许的反射次数
          # 我们还可以自定义 墙壁材料 和 最大反射次数
          # m = pra.Material(energy_absorption="hard_surface")    # 定义 墙的材料,我们还可以定义不同墙面的的材料
          # max_order = 3
          
          room = pra.ShoeBox(room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=max_order)
          
          # 在房间内创建一个位于[2.5,3.73,1.76]的源,从0.3秒开始向仿真中发出wav文件的内容
          audio, _ = librosa.load("speech.wav",sr=16000)  # 导入一个单通道语音作为源信号 source signal
          room.add_source([2.5, 3.73, 1.76], signal=audio, delay=0.3)
          
          # 3、在房间放置麦克风
          # 定义麦克风的位置:(ndim, nmics) 即每个列包含一个麦克风的坐标
          # 在这里我们创建一个带有两个麦克风的数组,
          # 分别位于[6.3,4.87,1.2]和[6.3,4.93,1.2]。
          mic_locs = np.c_[
              [6.3, 4.87, 1.2],  # mic 1
              [6.3, 4.93, 1.2],  # mic 2
          ]
          
          room.add_microphone_array(mic_locs)     # 最后将麦克风阵列放在房间里
          
          # 4、创建房间冲击响应(Room Impulse Response)
          room.compute_rir()
          
          # 5、模拟声音传播,每个源的信号将与相应的房间脉冲响应进行卷积。卷积的输出将在麦克风上求和。
          room.simulate()
          
          # 保存所有的信号到wav文件
          room.mic_array.to_wav("./guitar_16k_reverb_ISM.wav", norm=True, bitdepth=np.float32,)
          
          # 测量混响时间
          rt60 = room.measure_rt60()
          print("The desired RT60 was {}".format(rt60_tgt))
          print("The measured RT60 is {}".format(rt60[1, 0]))
          
          
          plt.figure()
          # 绘制其中一个RIR. both can also be plotted using room.plot_rir()
          rir_1_0 = room.rir[1][0]    # 画出 mic 1和 source 0 之间的 RIR
          plt.subplot(2, 1, 1)
          plt.plot(np.arange(len(rir_1_0)) / room.fs, rir_1_0)
          plt.title("The RIR from source 0 to mic 1")
          plt.xlabel("Time [s]")
          
          # 绘制 microphone 1 处接收到的信号
          plt.subplot(2, 1, 2)
          plt.plot(np.arange(len(room.mic_array.signals[1, :])) / room.fs, room.mic_array.signals[1, :])
          plt.title("Microphone 1 signal")
          plt.xlabel("Time [s]")
          
          plt.tight_layout()
          plt.show()
          
          room = pra.ShoeBox(
              room_dim,
              fs=16000,
              materials=pra.Material(e_absorption),
              max_order=3,
              ray_tracing=True,
              air_absorption=True,
          )
          
          # 激活射线追踪
          room.set_ray_tracing()
          
          
          room.simulate(reference_mic=0, snr=10)      # 控制信噪比

          3.2、方法二:Image Source Method 算法讲解

          从这里要讲算法和原理了,

          代码参考:matlab版本:RIR-Generator,python版本:rir-generator

          镜像源法简介:

          将反射面等效为一个虚像,或者说镜像。比如说,在一个开放空间里有一面平整墙面,那么一个声源可以等效为2两个声源;一个开放空间里有两面垂直的平整墙面,那么一个声源可以等效为4个;同理三面的话是8个。原理上就是这样,但是封闭的三维空间里情况有那么点复杂,

          一般来说,家里的空房间可以一定程度上近似为矩形盒子,假设房间尺寸为:

          元素大小分别代表长宽高,而声源的三维坐标为

          麦克风的三维坐标为

          镜像声源$(i,j,k)$到麦克风距离在三个坐标轴上的位置为

          那么声源$(i,j,k)$距离麦克风的距离为

          相对于直达声的到达延迟时间为

          其中$c$为声速,$r$为声源到麦克风的直线距离。那么,混响效果等效为不同延迟的信号的叠加,即混响效果可以表示为一个FIR滤波器与信号源卷积的形式,此滤波器可写为如下形式

          滤波器的抽头系数与镜面的反射系数与距离相关,如果每个面的反射系数不同则形式略复杂。详细代码还是要看RIR-Generator,我这里只做抛转引玉,写一个最简单的。

          模拟镜像源:

          房间尺寸(m):4 X 4 X 3

          声源坐标(m):2 X 2 X 0

          麦克风坐标(m):2 X 2 X 1.5

          混响时间(s):0.2

          RIR长度:512

          
          clc;clear;
          c = 340;                    % 声速 (m/s)
          fs = 16000;                 % Sample frequency (samples/s)
          r = [2 2 1.5];              % 麦克风位置 [x y z] (m)
          s = [2 2 0];              % 扬声器位置 [x y z] (m)
          L = [4 4 3];                % 房间大小 [x y z] (m)
          beta = 0.2;                 % 混响时间 (s)
          n = 512;                   % RIR长度
          
          h = rir_generator(c, fs, r, s, L, beta, n);
          disp(size(h))   % (1,4096)
          
          [speech, fs] = audioread("./test_wav/p225_001.wav");
          disp(size(speech)); % (46797,1)
          
          y = conv(speech', h);
          disp(length(y))
          
          
          % 开始画图
          figure('color','w');    % 背景色设置成白色
          subplot(3,1,1)
          plot(h)
          title("房间冲击响应 RIR","FontSize",14)
          
          subplot(3,2,3)
          plot(speech)
          title("原语音波形","FontSize",14)
          
          subplot(3,2,4)
          plot(y)
          title("加混响语音波形","FontSize",14)
          
          subplot(3,2,5)
          specgram(speech,512,fs,512,256);
          title("原语音频谱","FontSize",14)
          
          subplot(3,2,6)
          specgram(y,512,fs,512,256);
          title("加混响语音频谱","FontSize",14)
          
          audiowrite("./test_wav/matlab_p225_001_reverber.wav",y,fs)
          

          四、生成指定SER的混响

          SER的公式为

          其中E是统计 期望操作,$s(n)$是近端语音,$d(n)$是远端回声,

          由于我们需要根据指定的SER求混响信号,并且近端语音和远端混响都是已知的,我们只需要求得一个系数,来调整回声信号的能量大小,与远端混响相乘即可得我们想要的混响语音,即调整后的回声信号为$kd(n)$

          根据以上公式,可以推导出$k$的值

          最终$kd(n)$即我们所求的指定SER的混响。

          
          def add_echo_ser(near_speech, far_echo, SER):
              """根据指定的SER求回声
              :param near_speech: 近端语音
              :param far_echo: 远端回声
              :param SER: 指定的SER
              :return: 指定SER的回声
              """
              p_near_speech = np.mean(near_speech ** 2)  # 近端语音功率
              p_far_echo = np.mean(far_echo ** 2)  # 远端回声功率
          
              k = np.sqrt(p_near_speech / (10 ** (SER / 10)) / p_far_echo)
          
              return k * far_echo

          五、波形位移

          语音波形移动使用numpy.roll函数向右移动shift距离

          numpy.roll(a,shift,axis=None)

          参数:

          • a:数组
          • shift:滚动的长度
          • axis:滚动的维度。0为垂直滚动,1为水平滚动,参数为None时,会先将数组扁平化,进行滚动操作后,恢复原始形状
          
          x = np.arange(10)
          # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
          
          print(np.roll(x, 2))
          # array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])

          波形位移函数:

          
          def time_shift(x, shift):
              # shift:移动的长度
              return np.roll(x, int(shift))
          
          Augmentation = time_shift(wav_data, shift=fs//2)

          六、波形拉伸

          在不影响音高的情况下改变声音的速度 / 持续时间。这可以使用librosa的time_stretch函数来实现。

          
          def time_stretch(x, rate):
              # rate:拉伸的尺寸,
              # rate > 1 加快速度
              # rate < 1 放慢速度
              return librosa.effects.time_stretch(x, rate)
          
          Augmentation = time_stretch(wav_data, rate=2)

          七、音高修正(Pitch Shifting)

          音高修正只改变音高而不影响音速,我发现-5到5之间的步数更合适

          
          def pitch_shifting(x, sr, n_steps, bins_per_octave=12):
              # sr: 音频采样率
              # n_steps: 要移动多少步
              # bins_per_octave: 每个八度音阶(半音)多少步
              return librosa.effects.pitch_shift(x, sr, n_steps, bins_per_octave=bins_per_octave)
          
          # 向上移三音(如果bins_per_octave为12,则六步)
          Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=6, bins_per_octave=12)
          # 向上移三音(如果bins_per_octave为24,则3步)
          Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=3, bins_per_octave=24)
          # 向下移三音(如果bins_per_octave为12,则六步)
          Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=-6, bins_per_octave=12)

          还有写没有跑通,但是总感觉有些价值的代码,记录在这里:

          py-RIR-Generator(没跑通的原因是我是window系统)gpuRIR(这个我跑通了,但是需要较大的计算资源)去GitHub找代码的时候,不一定要搜索“回声”,“混响”,也可以通过搜索"RIR"同样可以得到想要的结果

          本文画图代码:

          
          # Author:凌逆战
          # -*- coding:utf-8 -*-
          import matplotlib.pyplot as plt
          import librosa
          import numpy as np
          
          plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
          plt.rcParams['axes.unicode_minus']=False #用来正常显示符号
          
          
          y1, _ = librosa.load("./speech.wav", sr=16000)
          y2, _ = librosa.load("./guitar_16k_reverb_ISM.wav", sr=16000)
          
          
          plt.subplot(2, 2, 1)
          plt.specgram(y1, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")
          plt.title("语谱图", fontsize=13)
          plt.xlabel('时间/s', fontsize=13)
          plt.ylabel('频率/Hz', fontsize=13)
          
          plt.subplot(2, 2, 2)
          plt.plot(np.arange(len(y1)) / 16000, y1)
          plt.title("波形图", fontsize=13)
          plt.xlabel('时间/s', fontsize=13)
          plt.ylabel('振幅', fontsize=13)
          
          plt.subplot(2, 2, 3)
          plt.specgram(y2, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")
          plt.title("语谱图(加混响)", fontsize=13)
          plt.xlabel('时间/s', fontsize=13)
          plt.ylabel('频率/Hz', fontsize=13)
          
          
          plt.subplot(2, 2, 4)
          plt.plot(np.arange(len(y2)) / 16000, y2)
          plt.title("波形图(加混响)", fontsize=13)
          plt.xlabel('时间/s', fontsize=13)
          plt.ylabel('振幅', fontsize=13)
          
          plt.tight_layout()
          plt.show()

          以上就是分析语音数据增强及python实现的详细内容,更多关于语音数据增强 python实现的资料请关注编程网其它相关文章!

          --结束END--

          本文标题: 分析语音数据增强及python实现

          本文链接: https://www.lsjlt.com/news/10942.html(转载时请注明来源链接)

          有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

          本篇文章演示代码以及资料文档资料下载

          下载Word文档到电脑,方便收藏和打印~

          下载Word文档
          猜你喜欢
          • 分析语音数据增强及python实现
            目录一、概述二、加噪2.1、第一种:控制噪声因子2.2、第二种:控制信噪比三、加混响3.1、方法一:Pyroomacoustics实现音频加混响3.2、方法二:Image Source Method 算法讲解四、生成...
            99+
            2022-06-02
            python 语音数据
          • R语言 vs Python对比:数据分析哪家强?
            什么是R语言? R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的罗斯·伊哈卡和罗伯特·杰特曼开发(也因此称为R),现在由“R开发核心团队”...
            99+
            2022-06-04
            哪家 语言 数据
          • python数据分析及可视化(十五)数据分析可视化实战篇(抖音用户数据分析、二手房数据分析)
            python数据分析的实战篇,围绕实例的数据展开分析,通过数据操作案例来了解数据分析中的频繁用到的知识内容。 抖音用户数据分析 1.理解数据 数据字段含义 了解数据内容,确保数据来源是正常的,安全合法...
            99+
            2023-09-02
            python 数据分析 开发语言
          • python实现Mysql数据库批量新增数据的场景分析
            一、批量插入数据的场景 在进行数据压力时需要进行大数据量的测试比如登录要进行千人用户同时登录比如数据加工由于源数据没有,需要我们进行数据库数据的插入选择方法使用Jmeter进行接口数...
            99+
            2022-11-13
          • Python实现微信好友数据爬取及分析
            目录前言1.数据分析2.好友性别3.好友头像4.好友签名5.好友位置前言 随着微信的普及,越来越多的人开始使用微信。微信渐渐从一款单纯的社交软件转变成了一个生活方式,人们的日常沟通需...
            99+
            2022-11-12
          • 利用python实现数据分析
            1:文件内容格式为json的数据如何解析 import json,os,sys current_dir=os.path.abspath(".") filename=[file for file in...
            99+
            2022-06-04
            数据 python
          • C语言数据结构之堆、堆排序的分析及实现
            目录 1.堆的概念结构及分类1.2堆的分类1.2.1 大堆1.2.2 小堆2. 堆的主要接口3.堆的实现3.1 堆的初始化 HeapInit3.2 堆的销毁 HeapDes...
            99+
            2022-11-13
          • Python中怎么实现数据分析
            今天就跟大家聊聊有关Python中怎么实现数据分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为什么选择Python进行数据分析?Python是一门动态的、面向对象的脚本语言,同时...
            99+
            2023-06-20
          • C语言详解strcmp函数的分析及实现
            目录1.函数介绍1.1.函数接口1.2.函数分析1.3.函数的简单使用1.4.函数使用结果分析2.库函数strcmp源代码2.1.库函数源代码2.2.库函数分析3.模拟实现 strc...
            99+
            2022-11-13
          • python皮尔逊相关性数据分析分析及实例代码
            目录前言数值类型皮尔逊系数使用场景皮尔逊相关系数(Pearson correlation)1.定义2.线性关系判定3.正态检验1.KS检验4.计算代码前言 相关性分析算是很多算法以...
            99+
            2023-02-15
            python皮尔逊相关性 python 数据分析
          • Python数据可视化正态分布简单分析及实现代码
            Python说来简单也简单,但是也不简单,尤其是再跟高数结合起来的时候。。。 正态分布(Normaldistribution),也称“常态分布”,又名高斯分布(Gaussiandistribution),最...
            99+
            2022-06-04
            正态分布 代码 简单
          • 用Python实现网易云音乐的数据进行数据清洗和可视化分析
            目录Python实现对网易云音乐的数据进行一个数据清洗和可视化分析对音乐数据进行数据清洗与可视化分析对音乐数据进行数据清洗与可视化分析歌词文本分析总结Python实现对网易云音乐的数据进行一个数据清洗和可视化分析 对...
            99+
            2022-06-02
            Python 数据清洗 数据可视化分析
          • Python数据分析斜率图怎么实现
            要实现Python数据分析中的斜率图,可以使用numpy和matplotlib库来进行绘图。首先,需要导入需要的库:```pytho...
            99+
            2023-10-12
            Python
          • Python实现数据可视化案例分析
            目录1. 问题描述2. 实验环境3. 实验步骤及结果1. 问题描述 对右图进行修改: 请更换图形的风格请将 x 轴的数据改为-10 到 10请自行构造一个 y 值的函数将直方图上的数...
            99+
            2022-11-11
          • Python中怎么实现数据分析功能
            本篇文章给大家分享的是有关Python中怎么实现数据分析功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1)数据获取一般有数据分析师岗位需求的公司都会有自己的数据库,数据分析...
            99+
            2023-06-16
          • python怎么使用dabl实现数据处理分析及ML自动化
            这篇文章主要讲解了“python怎么使用dabl实现数据处理分析及ML自动化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python怎么使用dabl实现数据处理分析及ML自动化”吧!dab...
            99+
            2023-06-25
          • Python获取江苏疫情实时数据及爬虫分析
            目录1.引言2.获取目标网站3.爬取目标网站4.解析爬取内容4.1. 解析全国今日总况4.2. 解析全国各省份疫情情况4.3. 解析江苏各地级市疫情情况5.结果可视化6. 代码 7....
            99+
            2022-11-12
          • 汇编语言功能实现数据复制实例分析
            这篇文章主要讲解了“汇编语言功能实现数据复制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“汇编语言功能实现数据复制实例分析”吧!问题1:将内存ffff:0~ffff:b单元中的数据复...
            99+
            2023-06-25
          • Python对中国500强排行榜数据进行可视化分析实战
            目录🥩数据采集🍖确定网址🍖获取数据🍖解析数据🍖保存数据🥩数据可视化🍖代码🍖效果🥩总结🥩数据采集 🍖确定网址 首先,我们对目标网址进行数据采集。我们可以清楚的看到,在2022年中新财富...
            99+
            2023-05-16
            Python排行榜数据可视化 Python 数据可视化
          • Python Sweetviz轻松实现探索性数据分析
            Sweetviz 是一个开源 Python 库,它只需三行代码就可以生成漂亮的高精度可视化效果来启动EDA(探索性数据分析)。输出一个HTML。文末提供技术交流群,喜欢点赞支持,收藏...
            99+
            2022-11-12
          软考高级职称资格查询
          编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
          • 官方手机版

          • 微信公众号

          • 商务合作