精华内容
下载资源
问答
  • 语音增强

    千次阅读 2020-09-28 15:11:20
    随着人们对语音增强知识的认识和发展,各种各样的语音增强算法都相应的发展起来。如前所述,由于噪声特性各异,总的来说,现在比较流行的算法主要有以下几种: 小波分解法; 听觉屏蔽法; 噪声对消法; 谐波增强...

    随着人们对语音增强知识的认识和发展,各种各样的语音增强算法都相应的发展起来。如前所述,由于噪声特性各异,总的来说,现在比较流行的算法主要有以下几种:

    1. 小波分解法;
    2. 听觉屏蔽法;
    3. 噪声对消法;
    4. 谐波增强法;
    5. 基于语音生成模型的增强算法;
    6. 基于短时谱估计的增强算法;

    以上的各种语音增强算法虽然在具体实现上是有差别的,但从另一个方面来说,它们都不得不在语音的可懂度和主观度量这两个方向上做一番权衡。至于到底侧重与哪一方面,就要看算法内部的参数选取了。

           其中,噪声对消法的基本原理是从带噪语音中减去噪声。这一原理是显而易见的,但问题是如何得到噪声的复制品。如果可以用两个麦克风(或多个麦克风)的信号采集系统,一个采集带噪语音,另一个(或多个)采集噪声,则这一任务比较容易得到解决。并且在强噪声环境下,这种方法可以得到很好的消除噪声结果。如果采集到的噪声足够“逼真”,甚至可以与带噪语音在时域上直接进行相减。噪声对消法可以用于平稳噪声相消,也可以用于准平稳噪声。采用噪声对消法时,两个话筒之间必须要有相当的隔离度,但采集到的两路信号之间不可避免地会有时间差,因此实时采集到的两路信号中所包含的噪声段是不同的,回声及其它可变衰减特性也将影响所采集噪声的“纯净”性。因而,采集到的噪声必须经过数字滤波器,以得到尽可能接近带噪语音中的噪声。通常,这就需要采用自适应滤波器曰,使相减噪声与带噪语音中的噪声一致,其原理类似于回波抵消器。自适应滤波器通常采用FIR滤波器,其系数可以采用最小均方(LMS)法进行估计,使如下信号的能量最小。

    语音的声音按照其激励形式的不同可以分为三类:第一类是浊音,当气流通过声门时,如果声带的张力刚好使声带发生张弛振荡式的振动,那么就可以产生准周期的空气脉冲,这一空气脉冲激励声道得到浊音,对应于图中就是u(n)为间隔是基音周期T的脉冲串;第二类是摩擦音或清音,如果声道在某处发生收缩,同时迫使空气以高速冲过这一收缩部分而产生湍流,就得到这种音,此时建立的宽带噪声源激励了声道,对应于图中就是u(n)为宽带噪声;如果使声道完全闭合,在闭合后产生气压,然后突然释放,这就得到爆破音。一般而言,语音信号可以看作是由浊音、清音以及它们之间的过渡组成的。

    1.语音信号的频谱分量比较集中

    通过对语音信号发声过程的研究以及观察记录的各种语音波形,人们发现语音信号的频谱分量主要集中在300~3400Hz的范围内,这是因为人的声道的变化不可能太快。这一点给我们的语音研究和计算带来了很大的便利,我们只要把注意力放在这一区域就可以了。

    2.语音是一个时变的、非平稳的随机过程

    人类发声系统的生理结构的变化速度是有一定的限度的,在一段短时间内(5-50ms)人的声带和声道形状有相对稳定性,可近似认为其特征不变,因而语音的短时谱分析也有相对稳定性。短时谱的这种平稳性是很多语音处理算法和技术的基础。

    3.语音大体上可以分为清音和浊音两大类

    一般而言,人类的语音信号往往在有些时段表现出明显的周期性(浊音),这种语段在频域上有共振峰结构,其能量大部分集中在较低频段内;而在另一些时段表现出完全的随机性(清音),这种语段在频域上没有明显的共振峰结构,其频谱类似于白噪声;其余的就是由两者相混合而成。这一点反映在图2-1就是:激励源u(n)要么就是由脉冲发生器发出,要么就是由白噪声发生器发出,要么就是由两者按一定比例混合后发出。

    4.作为一个随机过程,语音信号可以用统计分析特性来描述

    在高斯模型假设下,傅立叶展开系数被认为是独立的高斯随机变量,均值为0,而方差是时变的。这种高斯模型应用于有限帧长时只是一种近似的描述,在宽带噪声污染的带噪语音的语音增强中,这种假设可用于分析的前提。

    1)初始操作:

    x=wavread('samples.wav');

    n=wavread('white.wav');

    [p,q]=size(x);

    [a,b]=size(n);

    x1=x(150000:250000,1);

    n1=n(1:length(x1),1);

    y=x1+n1;

    其中,wavread('filename.wav',k)函数把文件名为filename的.wav文件的前k个采样点读入当前工作空间中。在未说明情况下,读入全部数值。分别用数组x、n储存纯净语音与高斯白噪声数据。size( )函数返回数组维数大小p,q。在这之前,由于我们引入的是双通道语音,所以q=2,p=语音长度。为了在计算机仿真时,算法程序不至于因为占用过多内存而导致系统瘫痪,我们截取数组x的第150000~250000个点进行操作,同样为了保证数组间操作的维数的一致性,对噪音数据采取同类操作。

    2)核心谱减部分:

           aa=2;

    bb=6;

    anglen=angle(fft(n1));

    ampn=abs(fft(n1));

    ampy=abs(fft(y));

    angley=angle(fft(y));

    cn=bb*(ampn.^aa);

    xx=(ampy.^aa-cn).^(1/aa);

    ifftx=real(ifft(xx.*exp(j*angley)));

    本段程序是对基本谱减法的改进程序,其中aa、bb分别相当于式2-10中的和。当前值是经过反复实验后得到的经验值。程序中主要用到的函数说明如下:

    y为纯净语音信号,fft(y,N)为快速傅立叶变换函数,其中y为操作对象信号,N为进行多少点傅立叶变换系数(默认情况下,N取256)。abs和 angle函数分别对256点傅立叶变换后的y取绝对值和相角,ifft (x,N)为逆傅立叶变换的标准函数,x为操作对象,N为逆变换点数。real对傅立叶反变换后的复数进行取实部操作所得ifftx即为增强结果,采用soundview(‘filename’,Fs)回放。Fs为采样频率。

           整个语音信号的端点检测可以分为4段:静音、过度段、语音段、结束。程序中使用一个变量status来表示当前所处的状态。在静音段,由于参数的数值比较小,不能确信是否处于真正的语音段,因此只要两个参数的数值都回落到低门限以下,就将当前状态恢复到静音状态。而如果在过渡段中两个参数中的任一个超过了高门限,就可以确定进入语音段了。

    三种定义的短时能量分别用下面三行MATLAB命令实现:

    amp1=sum(abs(y),2);

    amp2=sum(y.*y,2);

    amp3=sum(log(y.*y+eps),2);%加上浮点小数eps,是为了防止log运算中可能出现的溢出。

    过零率的计算:

    zcr=zeros(size(y,1),1);

    delta=0.02;

    for  i=1:size(y,1)

           x=y(i,:);

           for  j=1:length(x)-1

                  if     x(j)*x(j+1)<0&abs(x(j)-x(j+1))>delta

                         zcr(i)=zcr(i)+1;

                  end

           end

    end

    其中,delta=0.02为门限,这个值是我们经过许多实验得到的经验值,可以进行细微的调整。由于毕业设计的时间所限,目前的端点检测仅能针对单个数字发音的识别,应用到整段较长数据的话会引入较大失真,还需要对算法做进一步改进。

    原始纯净语音波形如下图所示:

    当加载2倍白噪声信号,即系统输入信号为Y=x1+2*n1时,采用各算法后所得波形依次如下(显示先后顺序:带噪语音、基本谱减、STFT谱减、维纳滤波、小波变换):

    图4-2  带噪语音波形

    图4-3     基本谱减法操作后波形

    图4-4     STFT谱减操作后波形

    图4-5     维纳滤波后波形

    图4-6   小波处理后波形

    同样是在系统输入信号为Y=x1+2*n1时,采用各算法后所得语谱图依次如下(显示先后顺序:纯净语音、带噪语音、基本谱减、STFT谱减、维纳滤波、小波变换):

    纯净语音的语谱图

    带噪语音的语谱图

    基本谱减后的语谱图

    STFT谱减后的语谱图

    维纳滤波后的语谱图

    小波变换后的语谱图

    展开全文
  • 适合新学习语音增强人员学习
  • 谱减法语音增强的几个实例MATLAB 其中有运行文档,请看readme
  • MATLAB语音增强

    2016-03-29 10:23:22
    语音增强
  • MATLAB 子空间语音增强,输入一个wav,生成一个增强语音wav
  • 语音增强
  • Android 语音增强

    2016-04-03 12:10:44
    Android 语音增强
  • MATLAB 实现子空间语音增强 (频域估计器)输入一个wav,生成一个增强wav
  • 语音增强算法

    2018-05-14 22:20:23
    MATLAB语音增强代码,有需要的可以看下。该算法是利用Matlab进行仿真的。通过对时域波形的观察,表明MMSE的语音增强算法能够有效地滤除背景噪声,在用了有声/无声判断后,“音乐噪声”也大幅度降低。
  • 语音增强】基于GUI维纳滤波之语音增强matlab 源码.md
  • 这是基于segan的语音增强代码,值得下载
  • 语音增强】谱减法、最小均方和维纳滤波语音增强matlab源码.md
  • omlsa 语音增强算法

    2019-02-20 13:56:09
    omlsa 语音增强算法
  • 卡尔曼语音增强

    2018-11-08 15:06:46
    基于卡尔曼kalman滤波方法的语音增强matlab代码
  • NOIZEUS语音增强数据库

    2018-06-15 16:08:14
    NOIZEUS语音增强数据压缩包。包括clean 语音数据,和各种加噪数据。
  • 一个关于语音增强算法的代码-语音增强源码.zip 本代码来自pudn,可以给做毕设的给位同仁们提供参考,直接打开main就行了。
  • 基于时频相关的语音增强语音估计
  • 语音增强去噪声

    2018-08-11 12:24:04
    语音增强去噪声 很好的资源 大家分享下 大家一起交流学习
  • 语音增强就是从带噪语音信号中提取尽可能纯净的原始语音。但是由于环境的多样化,噪声的不稳定性和随机性,并且基本不可能得到所有样本数据,在实际应用中,这些方法很难取得较好的效果。另外,传统的增强方法会对...

    摘要
    环境噪声会影响语音质量,严重的情况下语音将完全淹没到噪声中,无法分辨。语音增强就是从带噪语音信号中提取尽可能纯净的原始语音。但是由于环境的多样化,噪声的不稳定性和随机性,并且基本不可能得到所有样本数据,在实际应用中,这些方法很难取得较好的效果。另外,传统的增强方法会对语音信号进行一些分布性的假设,不准确的假设会使增强后的语音与纯净语音信号差别比较大,语音的失真度相对比较高,结果就导致语音的可懂度不高,质量下降。针对这些问题,本文在总结传统单通道语音增强方法的基础上,进一步研究和总结基于机器学习的语音增强方法,特别是基于深度神经网络和生成对抗神经网络的方法。本文的主要工作包括以下两个方面:
    (1)本文对在单通道语音增强领域涉及的技术背景、研究意义等进行了阐述,对在实验与结果评估过程中所涉及到的常用数据集、常见特征、学习目标与评估指标等进行了整理与介绍,以及对传统的与基于机器学习的单声道语音增强方法的已有研究工作进行了回顾和梳理分类,并简要介绍了这些方法的原理和研究思路。
    (2)本文对对传统的与基于机器学习的单声道语音增强方法进行复现,并对得出的实验结果进行了综合比较,分析了各种方法的优缺点。在实际应用时,要根据具体的噪声情况和特定环境,选用不同的语音增强方法或语音增强方法的组合,来达到最好的语音增强的效果。最后对目前单声道语音增强仍然面临的主要问题与挑战进行了总结以及进一步的展望。

    关键词: 单通道语音增强,机器学习,深度神经网络,生成对抗神经网络

    目 录
    第一章 绪论 6
    1.1 语音增强技术定义 6
    1.2 语音增强技术的研究背景和意义 6
    1.3 单通道语音增强算法的分类 7
    1.4 单声道语音增强技术的研究历史与现状 8
    1.4.1 传统单声道语音增强技术 8
    1.4.2 基于机器学习的单声道语音增强技术 10
    1.5 本文主要研究内容与拟解决的问题 12
    1.6 论文组织结构 13
    第二章 单通道语音增强的基本理论 14
    2.1 语音信号及噪声的特点 14
    2.1.1 语音信号的特征 14
    2.1.2 噪声的特性及其对语音信号的干扰原理 15
    2.1.3 语音的听觉机理和感知特性 15
    2.2 语音增强评价指标 16
    2.2.1 语音质量的感知评价方法PESQ 18
    2.2.2 分段信噪比segSNR 18
    2.2.3 短时客观可懂度STOI 19
    2.2.4 对数似然比测度LLR 19
    2.3 数据集和实验环境 20
    3.1.1 实验数据集 20
    3.1.2 实验环境 22
    第三章 传统单声道语音增强技术 23
    3.1 传统单声道语音增强技术中噪声功率谱的估计算法 23
    3.1.1 基于语音活动性检测的噪声估计算法 23
    3.1.2 最小统计递归平均的噪声估计算法 25
    3.1.3 最小值控制递归平均算法 27
    3.2 谱减法 28
    3.1.4 原理 28
    3.1.5 谱减法建立的假设 30
    3.1.6 谱减法存在的音乐噪声 30
    3.1.7 算法实施流程 31
    3.1.8 实验结果及讨论 32
    3.3 维纳滤波法 33
    3.2.1 原理 33
    3.2.2 算法实施流程 35
    3.2.3 实验结果及讨论 35
    3.4 最小均方误差估计法 37
    3.3.1 原理 37
    3.3.2 算法实施流程 38
    3.3.3 实验结果及讨论 39
    第四章 基于机器学习的单声道语音增强技术 41
    4.1 基于非负矩阵分解的语音增强算法 41
    4.1.1 原理 41
    4.1.2 实验结果及讨论 42
    4.2 基于卷积神经网络的单通道语音增强 44
    4.2.1 卷积神经网络 44
    4.2.2 基于卷积神经网络的单通道语音增强实现方法 46
    4.2.3 实验结果及讨论 48
    4.3 基于具有梯度惩罚的相对论生成对抗网络的语音增强 50
    4.3.1 生成对抗网络 50
    4.3.2 基于具有梯度惩罚的相对论生成对抗网络的语音增强实现方法 52
    4.3.3 实验结果及讨论 53
    第五章 实验结果与综合分析 56
    5.1 不同噪声、不同信噪比下各方法的效果与分析 56
    5.2 综合分析 59
    第六章 总结与展望 60
    6.1 研究与工作总结 60
    6.2 数字语音处理课程总结 60
    6.3 进一步展望 60
    参考文献 61

    传统单通道语音增强算法:

    1. 谱减法实现结果
      谱减法实验中,采用来自TIMIT语料库的纯音信号,女声,时长0.027s,采样率为 8kHz,采样精度16bits。噪声信号为来自Niosex92的白噪声。合成的带噪语音的初始信噪比分别为0dB、5dB、10dB。帧长为256,帧间重叠为50%。此小节为在时域上对谱减法时域波形、语谱图去噪效果的单独讨论,客观评价结果及综合方法对比结果于本文第五章进行讨论。
      在这里插入图片描述

    2. 维纳滤波法实现结构
      在这里插入图片描述

    3. 最小均方误差估计法

    基于机器学习的单声道语音增强技术
    在这里插入图片描述

    1. 非负矩阵结果:
      在这里插入图片描述

    2. 基于卷积神经网络的单通道语音增强

    3. 基于具有梯度惩罚的相对论生成对抗网络的语音增强

    在这里插入图片描述

    在这里插入图片描述

    综合分析

    5.1 不同噪声、不同信噪比下各方法的效果与分析
    在本小节中将选择PESQ、segSNR、STOI和LLR评估语音增强算法的性能。
    如表5-1所示,对平稳高斯白噪声进行评估。在所有PESQ等性能指标中,SERGAN均优于其他基准算法。此外,大部分情况下,CNN是性能第二好的方法,说明具有编解码器架构的深度网络CNN优于浅层的NMF。与CNN和SERGAN相比,NMF的性能指标提升在低 SNR条件下比高SNR的提升更大,该提升是指经过模型处理后的语音指标与原始带噪语音指标之差。例如,在-0dB的SNR时,PESQ,segSNR,STOI,LLR 的改进分别为 0.45、0.55、-0.23、,而在10dB SNR 时,改进分别为 0.25、0.03、0.37。这表明 RNSE 更加适用于低 SNR 下的语音增强。
    在这里插入图片描述
    在这里插入图片描述
    实现代码(如基于具有梯度惩罚的相对论生成对抗网络的语音增强)
    model.py

    生成器代码:

    def generator(opts):
        kwidth=opts['filterlength']
        strides= opts['strides']
        pool = strides
        g_enc_numkernels = opts ['g_enc_numkernels']
        g_dec_numkernels = opts ['g_dec_numkernels']
        window_length = opts['window_length']
        featdim = opts ['featdim']
        batch_size = opts['batch_size']
                
        use_bias = True
        skips = []
        #kernel_init = keras.initializers.TruncatedNormal(stddev=0.02)
        kernel_init = 'glorot_uniform'
     
        wav_in = Input(shape=(window_length, featdim)) 
        enc_out = wav_in
    
        # Defining the Encoder
        for layernum, numkernels in enumerate(g_enc_numkernels):
            enc_out = Conv1D(numkernels, kwidth, strides=pool,
                                   kernel_initializer=kernel_init, padding="same", 
                                       use_bias=use_bias)(enc_out)
          
            # for skip connections
            if layernum < len(g_enc_numkernels) - 1:
                skips.append(enc_out)
            if opts['applyprelu']:
                enc_out = PReLU(alpha_initializer='zero', weights=None)(enc_out)
            else:
                enc_out = LeakyReLU(alpha=opts['leakyrelualpha'])(enc_out)
    
        num_enc_layers = len(g_enc_numkernels)
        z_rows = int(window_length/ (pool ** num_enc_layers))
        z_cols = g_enc_numkernels[-1]
    
        # Adding the intermediate noise layer
        if not opts['z_off']:
            z = Input(shape=(z_rows,z_cols), name='noise_input')
            dec_out = keras.layers.concatenate([enc_out, z])
        else :
            dec_out = enc_out
    
        # Now to the decoder part
        nrows = z_rows
        ncols = dec_out.get_shape().as_list()[-1]
        for declayernum, decnumkernels in enumerate(g_dec_numkernels):
            # reshape for the conv2dtranspose layer as it needs 3D input
            indim = dec_out.get_shape().as_list()
            newshape = (indim[1], 1 , indim[2])
            dec_out = Reshape(newshape)(dec_out)
            # add the conv2dtranspose layer
            dec_out = Conv2DTranspose(decnumkernels, [kwidth,1], strides=[strides, 1],
                         kernel_initializer=kernel_init, padding="same", use_bias=use_bias)(dec_out)
            # Reshape back to 2D
            nrows *= strides # number of rows get multiplied by strides
            ncols = decnumkernels # number of cols is the same as number of kernels
            dec_out.set_shape([None, nrows, 1 , ncols]) # for correcting shape issue with conv2dtranspose
            newshape = (nrows, ncols)
            if declayernum == len(g_dec_numkernels) -1:
                dec_out = Reshape(newshape, name="g_output")(dec_out) # name the final output as  g_output
            else:
                dec_out = Reshape(newshape)(dec_out)
    
           # add skip and prelu until the second-last layer
            if declayernum < len(g_dec_numkernels) -1 :
                if opts['applyprelu']:
                    dec_out = PReLU(alpha_initializer='zero', weights=None)(dec_out)
                else:
                    dec_out = LeakyReLU(alpha=opts['leakyrelualpha'])(dec_out)
                # Now add the skip connection
                skip_ = skips[-(declayernum + 1)]
                dec_out = keras.layers.concatenate([dec_out, skip_])
     
        # Create the model graph
        if opts ['z_off']:
            G = Model(inputs=[wav_in], outputs=[dec_out])
        else :
            G = Model(inputs=[wav_in, z], outputs=[dec_out])
         
        if opts ['show_summary'] :
            G.summary()
    
        return G
    

    判别器代码:

    def discriminator(opts):
        print('*** Building Discriminator ***')
        window_length = opts['window_length']
        featdim = opts ['featdim']
        batch_size = opts['batch_size']
        d_fmaps = opts ['d_fmaps']
        strides = opts['strides']
        activation = opts['d_activation']
        kwidth = opts['filterlength']
            
        wav_in_clean = Input(shape=(window_length, featdim), name='disc_inputclean')
        wav_in_noisy = Input(shape=(window_length, featdim), name='disc_inputnoisy')
    
        use_bias= True
        #kernel_init = keras.initializers.TruncatedNormal(stddev=0.02)
        kernel_init = 'glorot_uniform'
        
        d_out = keras.layers.concatenate([wav_in_clean, wav_in_noisy])
    
        for layer_num, numkernels in enumerate(d_fmaps):
            d_out = Conv1D(numkernels, kwidth, strides=strides, kernel_initializer=kernel_init, 
                            use_bias=use_bias, padding="same")(d_out)
    
            if opts['applybn']:
                d_out = BatchNormalization()(d_out)
            elif opts['applyinstancenorm'] :
                d_out = InstanceNormalization(axis=2)(d_out)
    
            if activation == 'leakyrelu':
                d_out = LeakyReLU(alpha=opts['leakyrelualpha'])(d_out)
            elif activation == 'relu':
                d_out = tf.nn.relu(d_out)
    
        d_out = Conv1D(1, 1, padding="same", use_bias=use_bias, kernel_initializer=kernel_init, 
                        name='logits_conv')(d_out)
        d_out = Flatten()(d_out)
        d_out = Dense(1, activation='linear', name='d_output')(d_out)
        D = Model([wav_in_clean, wav_in_noisy], d_out)
      
        if opts ['show_summary']:
            D.summary()
        return D
    

    完整的代码实现如下:
    https://download.csdn.net/download/weixin_39589455/18660959
    包含

    1. 传统方法:NMSE、SS、WF
    2. 基于机器学习:CNN、NMF、serGAN
    3. 加噪处理代码
    4. 评价指标代码:LLR、PESQ_STOI、segSNR
    5. 时域图、语谱图绘制的MATLAB代码
      在这里插入图片描述

    详细的论文设计报告如下:
    https://download.csdn.net/download/weixin_39589455/18660991

    word格式,可编辑,标准论文形式3w+字数论述和实验结果

    在这里插入图片描述

    展开全文
  • 可用的语音增强代码

    2016-08-18 09:50:08
    语音增强代码类
  • 语音增强测试用例

    2015-09-02 09:51:23
    用于语音增强等语音处理算法测试用例,包括car、train、clean等
  • 利用MATLAB实现了基于谱减法的语音增强算法,对语音信号处理的过程有一定的帮助,能够更好地了解关于语音增强的知识
  • 语音增强程序

    2012-10-26 14:29:05
    这是一个利用维纳滤波实现语音增强的matlab程序.在输入语音信噪比不是很低的情况下,效果不错.
  • 在基于先验信噪比的维纳滤波语音增强算法的基础上,结合语音端点检测算法,本文提出一种新算法。新算法在语音端点检测的基础上,通过平滑处理更新噪声信号功率谱以适应噪声不稳定的环境;通过计算有声段噪声信号估计...
  • 语音增强简介

    千次阅读 2019-04-21 17:17:01
    语音增强简介
                   

            大四上研究过一段时间NLMS,之后直到研一上做的都是关于麦克风阵列的语音增强,感觉时间久了又会记不太清楚,所以稍微整理下。

    1  单麦克风语音增强

            麦克风,又称话筒或传声器,是一种将模拟声音信号转换成数字电子信号的换能器。按声场作用力麦克风可分为压强式麦克风、压差式麦克风和压强压差组合式麦克风。我们常用的麦克风就是压强式麦克风。用单麦克风对语音进行增强,可通过物理结构和设计滤波器两种方法实现。

    (1) 物理结构实现

            指向性描述了麦克风对来自不同方向声音的灵敏度,可分为全指向性麦克风、双指向性麦克风和单一指向性麦克风。

            全指向性麦克风是压强式麦克风,是最普遍的麦克风。它只有一个入声口,传声器膜片压强的变化产生相应的输出电压。由于压强是一个标量,因而它对不同方向上的声音的灵敏度是相同的。所以这种麦克风采集四周环境的所有声音,不能增强期望语音。

            双指向性麦克风是压差式麦克风,它有两个入声口,通过其传声器膜片两侧压强差的变化产生相应的输出电压。这种麦克风可接受来自麦克风前方和后方的声音,因而如果期望信号在这两个方向上时,即可实现语音增强。

            单一指向性麦克风是压强与压差复合式麦克风,其结构上是在麦克风管的一端和管侧开口,形成一个声干涉管,如图1-1所示。来自管开口端的声音信号同时到达传声器膜片,没有相位干涉,可获得最大输出;而来自管侧的声音信号到达传声器膜片的路径不同,产生相位干涉,输出被抑制,从而可增强麦克风前端的语音信号。常见的单一指向性麦克风有心型指向性麦克风、超心型指向性麦克风和枪型指向性麦克风。
                                

                                                        图1-1 声干涉管原理示意图

            规格上常用极性图来表示麦克风的指向性,如图1-2所示,每个图中虚线圆形的上方表示麦克风的前方,下方则表示麦克风的后方。

              

                                                                图 1-2 各种麦克风的极性图

            这种利用物理结构特点增强后的语音在人的主观感受上有所改善,但对于语音人机交互系统来说仍达不到要求,即使是超指向性麦克风,来自管侧的干扰语音还是会严重影响语音识别的识别率。

    (2) 设计滤波器实现

            将单个麦克风采集到的信号通过特别设计的滤波器,过滤掉非期望的噪声,实现语音增强。按处理域的不同可分为时域、频域和Karhunen-Loeve展开域(KLE)方法。时域方法就是设计一个最优时域滤波器来尽可能衰减噪音。频域方法是将信号变换到频域,在每个频率点上设计一个最优滤波器来衰减噪声。KLE域方法是先将麦克风采集到的数据的相关矩阵进行QR分解,利用得到的特征向量和特征值来衰减噪声。

            这种方法能提高语音的信噪比,但是也引起语音信号的失真,从而影响语音信号的可懂度。

    2 麦克风阵列语音增强

         麦克风阵列通过其拓扑结构排列来捕获空时信息,并运用这些信息来估计一些参数或提取感兴趣的信号。虽然窄带天线阵列问题已得到很好的解决,但实际上麦克风阵列遇到的问题则要复杂得多,因为语音是宽带信号,室内声场混响很高,环境和信号是非统计的,噪声可能和期望信号具有相同的空间谱特征。

          许多麦克风阵列处理算法都是基于窄带的或是由窄带阵列简单扩展而来。这些算法的优点是已经广泛应用于天线阵列,因而仅需简单扩展就可以运用于麦克风阵列。但这些算法没有一个能适用于真实声学环境,因而简单的将这些算法应用于宽带语音处理效果并不理想。

            麦克风阵列语音增强主要需解决的问题有:噪声衰减,回声消除,去混响,声源定位,声源数估计,声源分离和“鸡尾酒会效应”。与单麦克风语音增强算法不同,运用麦克风阵列要在保证期望信号不失真的情况下尽可能衰减噪声。

    3  盲源分离

            盲源分离问题起源于20世纪80年代,最早应用于数字通信系统。它是要在不知道输入信号任何信息和信道传播特性的情况下对混合输出信号进行分离,估计出输入信号。在生物医学及图像处理方面,盲源分离已有了很好的应用。

            在盲源分离问题中,独立成分分析是应用最为广泛的工具,因为它充分利用了输入信号的独立性。当各输入信号是瞬时线性混合时,独立成分分析能很好的将信号分离开来,然而在室内混响环境中,独立成分分析效果则不理想。尽管最近很多基于独立成分分析的理论方法被提出,但现在仍然不知道它怎样运用于语音声学环境中。因此基于卷积模型的盲源分离方法应运而生,它优化了输入信号的混合模型,更符合现实语音混合模型,但是基于此模型的相关算法有待进一步完善,以更好的应用。

    4  麦克风阵列语音增强的研究进展

            语音增强和阵列技术的研究开展较早,虽然随着数字信号处理领域相关理论的完善和成熟,这两项技术也取得了一定的成果,但最早的语音增强重点研究单个麦克风语音增强,最早的阵列技术也是利用窄带天线阵列进行探测,而将阵列技术运用到语音增强中来,则始于20世纪80年代,并在90年代成为研究热点。国内的相关研究则更晚。每年国际国内重要期刊和会议上都会有大量相关的文献文章。

    (1) 固定波束形成法

            固定波束形成法又称延迟-相加波束形成法,最早是由Flanagan于1985年提出的。它先对麦克风阵列各阵元接收到的声音信号进行时延补偿,使各阵元的信号同步,然后设计一个有限长度滤波器进行加权求和,输出的信号就是增强后的信号。因为设计的滤波器系数在处理过程中是固定不变的,所以称这种方法为固定波束形成法。

            这种方法的实现比较简单,但它需要较多的麦克风阵元才能达到较好的语音增强效果。

    (2) 自适应波束形成法

            最早的自适应波束形成法是Frost于1972年提出的线性约束最小方差(Linearly Constrained Minimum Variance,LCMV)算法。该方法也称为Frost波束形成法,它在保证注视方向(Look direction)上期望信号频率响应不变的同时,通过约束条件使得阵列输出功率最小,即等价于使阵列输出噪声功率最小,从而实现噪声抑制。在此算法的基础上,Griffths和Jim于1982年提出广义旁瓣抵消(Generalized Sidelobe Canceler,GSC)算法,通过引入阻塞矩阵,将有约束的Frost滤波器扩展为无约束的GSC滤波器。GSC算法将阵列输出通过上下两个通道,上通道产生语音参考信号,下通道产生噪声参考信号,然后用语音参考信号减去噪声参考信号,从而得到增强信号。这种方法最大的问题在于噪声参考信号中并不仅仅都是噪声信号,也可能包含一些语音信号,这样在相减时可能抵消部分语音信号,造成语音信号失真。为了解决这一问题,许多学者对算法进行了改进,比如Hoshuyma于1996年提出的韧性自适应波束形成法,改进了阻塞矩阵,使得噪声参考信号中的语音成分最小,从而减小了信号失真。因为设计的滤波器系数在处理过程中是随着输入信号的变化而变化的,所以称这种方法为自适应波束形成法。

            自适应波束形成法能有效衰减相干噪声,在麦克风阵元数大于声源数时有较好的处理效果。

    (3) 后置滤波法

            在麦克风阵列中运用后置滤波器进行波束形成的方法是由Zelinski于1988年提出的。该方法以维纳滤波器为基础,在延时-相加波束形成器的输出端加一个滤波器,通过求解Wiener-Hopf方程来求得滤波器系数。在此基础上,许多学者通过不同的方法提出许多不同的后置滤波器,比如McCowan于2002年提出的广义后置滤波器法,就是将噪声场中相关理论模型扩展到后置滤波器的转移函数中,从而改善滤波器性能。

            后置滤波器法一般不单独使用,而是与固定波束形成器或自适应波束形成器结合使用,这样通过自适应波束形成器衰减相干噪声,通过后置滤波器衰减非相干噪声,从而更好的抑制了噪声。

    (4) 子空间法

            子空间法是先对每个麦克风阵元的信号使用单通道子空间或利用输入信号的相关矩阵子空间构建信号子空间,然后采用固定波束形成或自适应波束形成实现语音增强。这种算法分别由Hansen和Asano于1997年提出,并在之后的几年里被其他学者不断完善,比如Doclo等提出的基于广义奇异值分解的波束形成法。

            子空间法最大的缺点是计算复杂度太大,难于实时应用于数字信号处理。

    (5) 子带波束形成法

            针对语音信号是宽带信号这一特点,许多学者于21世纪初提出了子带波束形成法。这种方法先将麦克风采集到的声音信号从时域经过傅里叶变换到频域,然后将频带分段,在每一段运用窄带波束形成法产生输出,然后逆傅里叶变换到时域,从而得到增强后的语音信号。比如McCowan于2001年,Grbic于2003年提出的基于均匀DFT子带波束形成法。

            子带波束形成法具有噪声抑制能力强,收敛速度快等优点。

    (6) 频率不变波束形成法

            一般波束形成法在不同频段的波束形成效果不同,实际应用中男声的频率一般低于女声的频率,导致一般的波束形成法对男声和女声的增强效果不同。针对这一问题,许多学者提出了频率不变波束形成法,即波束形成效果不随频率的改变而改变。这一方法的关键在于频率不变波束形成器的设计,如1970年Hixson和Au等提出利用谐波嵌套法,1988年Doles和Benedict提出的利用非均匀阵列的渐近理论设计法,2002年Weiss等提出的倍频分解法。

            在线性阵列的基础上,Chan和Chen于2002年提出了圆阵频率不变波束形成器,于2005年到2007年扩展到同轴圆阵和同轴球型阵,从而将波束形成由一维扩展到二维和三维。

               
    展开全文
  • 语音增强理论与实践

    2018-06-03 15:39:50
    这本书里面对语音增强进行了详细的描述,还有各种评价方法等。
  • 最先进的语音增强方法 名称 邹海章 电子邮件 深度学习 2017年 卷积神经网络的单通道语音增强[ ] SEGAN:语音增强生成对抗网络[ ] 用于语音增强和强噪声说话者验证的条件生成对抗网络[] 用于语音增强的全卷积神经...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,102
精华内容 17,640
关键字:

语音增强