Advertisement

语音信号处理(1)

阅读量:

#语音信号处理(1)
在语音增强与语音合成领域的深度学习应用中,作为整个系统的重要组成部分之一的语音预处理环节具有决定性作用,在此基础上就个人研究工作做一个简明扼要的总结。

语音的预处理

在对语音信号进行分析与处理之前,在此之前,则必须对其实施预加重处理、分块处理以及加窗处理等必要的预处理步骤。这些步骤的目的在于消除由于人类发声器官自身特性以及采集语音信号设备所导致的混叠失真以及高次谐波失真等现象所造成的干扰因素对语音信号质量的影响以及其它高频成分等干扰因素的影响

预加重

该技术旨在对语音信号中的高频段进行增强处理以减去唇部辐射影响从而提高语音细节。该过程通常通过采用一阶前向递归型数字滤波器来实现具体而言设第n时刻的语音采样值为x(n)经过处理后的输出结果为y(n)=x(n)-ax(n-1)其中a为预加重系数取值范围通常在0.9至1.0之间一般取值为0.98。

本人毕设中预加重的实现:`

复制代码
    def emphasis(signal_batch, emph_coeff=0.95, pre=True):
    """
    Pre-emphasis or De-emphasis of higher frequencies given a batch of signal.
    
    Args:
        signal_batch: batch of signals, represented as numpy arrays
        emph_coeff: emphasis coefficient
        pre: pre-emphasis or de-emphasis signals
    
    Returns:
        result: pre-emphasized or de-emphasized signal batch
    """
    result = np.zeros(signal_batch.shape)    #语音信号的batch_sized的shape用0填充
    for sample_idx, sample in enumerate(signal_batch): #enumerate()函数,同时列出数据和数据下标
        for ch, channel_data in enumerate(sample):#预加重公式y(n)=x(n)-ax(n-1)
            if pre:
                result[sample_idx][ch] = np.append(channel_data[0], channel_data[1:] - emph_coeff * channel_data[:-1])  #将channel_data[1:] - emph_coeff * channel_data[:-1]的值赋给channel_data[0],得到一个新的列表
            else:
                result[sample_idx][ch] = np.append(channel_data[0], channel_data[1:] + emph_coeff * channel_data[:-1])
    return result

分帧

在整个语音分析过程中始终发挥关键作用的是“短时分析技术”。由于语音信号本身具有时间可变性,在短暂时间段内(通常取值范围为1030ms),其特性基本保持稳定状态即相对稳定,在此时间段内我们可以将其视为一个准稳态过程因此,在此时间段内我们可以将其视为一个准稳态过程即所谓的“短时平稳性”。基于这一理论基础任何语音信号的特征提取与处理都必须基于“短时域”这一前提条件即将整个语音信号划分为多个帧段后分别提取每段特征参数其中每个帧段的时间长度通常设定为1030ms这种划分方法能够有效反映声音信息随时间的变化规律从而实现对声音信息的有效捕捉与处理通过这种方法我们能够获得一段声音信息在其生命周期内各个时刻所具有的特征参数序列这正是本节研究的核心内容

复制代码
    def slice_signal(file, window_size, stride, sample_rate):
    """
    Helper function for slicing the audio file
    by window size and sample rate with [1-stride] percent overlap (default 50%).
    """
    wav, sr = librosa.load(file, sr=sample_rate)  #以16k进行采样,sr=None时默认为22050
    hop = int(window_size * stride)
    slices = []
    for end_idx in range(window_size, len(wav), hop):  #以百分之五十的帧移对语音切片
        start_idx = end_idx - window_size
        slice_sig = wav[start_idx:end_idx]
        slices.append(slice_sig)
    return slices

加窗

基于语音信号的短时平稳特性,在实际应用中我们通常会对信号进行分帧处理

在这里插入图片描述

参考博客:

全部评论 (0)

还没有任何评论哟~