语音信号处理(1)

#语音信号处理(1)
在基于深度学习的语音增强和语音合成中,语音的预处理部分是十分重要的,在此,结合自己的毕设做一个简单的总结。

语音的预处理

在对语音信号进行分析和处理之前,必须对其进行预加重、分帧、加窗等预处理操作。这些操作的目的是消除因为人类发声器官本身和由于采集语音信号的设备所带来的混叠、高次谐波失真、高频等等因素,对语音信号质量的影响。

预加重

预加重,其目的是为了对语音的高频部分进行加重,去除口唇辐射的影响,增加语音的高频分辨率。一般是通过传递函数是一阶FIR高通数字滤波器来实现。设第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

加窗

由于语音信号具有短时平稳性,我们可以对信号进行分帧处理。紧接着还要对其加窗处理。窗的目的是可以认为对抽样n附近的语音波形加以强调而对波形的其余部分加以减弱。对语音信号的各个短段进行处理,实际上就是对各个短段进行某种变换或施以某种运算。用得最多的三种窗函数是矩形窗、汉明窗(Hamming)和汉宁窗(Hanning),其定义分别为:
在这里插入图片描述

参考博客:https://blog.csdn.net/cwfjimogudan/article/details/71112171

发布了2 篇原创文章 · 获赞 1 · 访问量 67

猜你喜欢

转载自blog.csdn.net/weixin_43936357/article/details/103152325