asr学习系列(二:特征提取)

背景:

报了深蓝学院的语音识别课程,这里做学习记录

第二课:语音信号处理-->特征提取

1.数字信号处理

  • 1)傅立叶变换

2.常用特征提取

  • 1)Fbank特征一般用于DNN训练
  • 2)MFCC特征一般用于对角GMM训练,各维度之间相关性小
Step1.预加重(pre-emphasis)

• 为什么需要预加重?

提高信号高频部分的能量,高频信号在传递过程中,衰减较快,
但是高频部分又蕴含很多对语音识别有利的特征,
因此,在特征提取部分,需要提高高频部分能量

预加重滤波器是一个一阶高通滤波器,给定时域输入信号𝑥[𝑛],预加重之后的信号为:
𝑦 [𝑛] = 𝑥[𝑛] − 𝛼𝑥[𝑛 − 1]

import librosa
import numpy as np
from scipy.fftpack import dct

#preemphasis config 
alpha = 0.97

# Enframe config
frame_len = 400      # 25ms, fs=16kHz
frame_shift = 160    # 10ms, fs=15kHz
fft_len = 512

# Mel filter config
num_filter = 23
num_mfcc = 12

# Read wav file
wav, fs = librosa.load('./test.wav', sr=None)

def preemphasis(signal, coeff=alpha):
    """perform preemphasis on the input signal.

        :param signal: The signal to filter.
        :param coeff: The preemphasis coefficient. 0 is no filter, default is 0.97.
        :returns: the filtered signal.
    """
    return np.append(signal[0], signal[1:] - coeff * signal[:-1])
Step2.加窗(windowing)分帧
  • 为什么需要分帧?

语音信号为非平稳信号,其统计属性是随着时间变化的,以汉语为例,一句话中包含很多声母和韵母,不同的拼音,发音的特点很明显是不一样的;

  • 但是!语音信号又具有短时平稳的属性,比如汉语里一个声母或者韵母,往往只会持续几十到几百毫秒,在这一个发音单元里,语音信号表现出明显的稳定性,规律性(可以自己使用Audition观察一段语音)
    •在进行语音识别的时候,对于一句话,识别的过程也是以较小的发音单元(音素、字、字节)为单位进行识别,因此用滑动窗来提取短时片段,

• 帧长、帧移、窗函数的概念,对于采样率为16kHz的信号,帧长、帧移一般为25ms、10ms,即400和160个采样点

def enframe(signal, frame_len=frame_len, frame_shift=frame_shift, win=np.hamming(frame_len)):
    """Enframe with Hamming widow function.

        :param signal: The signal be enframed
        :param win: window function, default Hamming
        :returns: the enframed signal, num_frames by frame_len array
    """
    
    num_samples = signal.size
    num_frames = np.floor((num_samples - frame_len) / frame_shift)+1
    frames = np.zeros((int(num_frames),frame_len))
    for i in range(int(num_frames)):
        frames[i,:] = signal[i*frame_shift:i*frame_shift + frame_len] 
        frames[i,:] = frames[i,:] * win

    return frames
Step3.傅里叶变换
  • 将上一步分帧之后的语音帧,由时域变换到频域,取DFT系数的模,得到谱特征
def get_spectrum(frames, fft_len=fft_len):
    """Get spectrum using fft
        :param frames: the enframed signal, num_frames by frame_len array
        :param fft_len: FFT length, default 512
        :returns: spectrum, a num_frames by fft_len/2+1 array (real)
    """
    cFFT = np.fft.fft(frames, n=fft_len)
    valid_len = int(fft_len / 2 ) + 1
    spectrum = np.abs(cFFT[:,0:valid_len])
    return spectrum
Step4.梅尔滤波器组和对数操作

• DFT得到了每个频带上信号的能量,但是人耳对频率的感知不是等间隔的,近似于对数函数
• 将线性频率转换为梅尔频率,梅尔频率和线性频率转换关系

mel(f) = 2595 * log(1 + f /700)

• 梅尔三角滤波器组:根据起始频率、中间频率和截止频率,确定各滤波器系数


三角滤波图示(采样率为16k,对应的fbank的滤波外形)

filter_bank_m(k) = [ k - f(m-1) ] / [ f(m) - f(m-1)] , f(m-1) < k < f(m)
filter_bank_m(k) = [ f(m+1) - k] / [ f(m) - f(m-1)] , f(m) < k < f(m+1)


def fbank(spectrum, num_filter = num_filter):
    """Get mel filter bank feature from spectrum
        :param spectrum: a num_frames by fft_len/2+1 array(real)
        :param num_filter: mel filters number, default 23
        :returns: fbank feature, a num_frames by num_filter array 
        DON'T FORGET LOG OPRETION AFTER MEL FILTER!
    """

    feats=np.zeros((spectrum.shape[0], num_filter))
    freq_h = fs // 2 # 最大截止频率
    mel_h = f_mel(freq_h) # 最大梅尔刻度
    mel_lst = np.linspace(0, mel_h, num_filter+2) # mel刻度等间隔
    freq_lst = mel_f(mel_lst) # mel对应的频率
    fft_mel = np.floor((fft_len + 1) * freq_lst / fs) # mel对应fft的位置
    
    bank = np.zeros((num_filter, int(fft_len//2)+1))
    for i in range(1, num_filter+1):
        left = int(fft_mel[i-1]) # 三角波左侧
        center = int(fft_mel[i]) # 三角波顶点
        right = int(fft_mel[i+1]) # 三角波右侧
        for j in range(left, center):
            bank[i-1, j] = (j - left) / (center -left)
        for j in range(center, right):
            bank[i-1, j] = (right - j) / (right - center)

    feats = np.dot(spectrum, bank.T) # 频谱与滤波器点乘
    feats = np.where(feats == 0, np.finfo(float).eps, feats) # 避免log(0)
    return np.log(feats)
Step5.动态特征计算
  • 一阶差分(Delta,Δ),类比速度,最简单的一阶差分计算方法
    Δ t = [c(t + 1) − c(t − 1)]/2
def mfcc(fbank, num_mfcc = num_mfcc):
    """Get mfcc feature from fbank feature
        :param fbank: a num_frames by  num_filter array(real)
        :param num_mfcc: mfcc number, default 12
        :returns: mfcc feature, a num_frames by num_mfcc array 
    """

    feats = dct(fbank, type=2, axis=1, norm="ortho")[:, 1 : (num_mfcc + 1)] 

    return feats
  • 二阶差分(Delta delta, ΔΔ),类比加速度,简单计算方法
    ΔΔ t = [Δ(t + 1) − Δ(t − 1)]/2

3. 代码实践

主要代码在上面有详细实现,以下是一些实现的感想:

  • 1)主要是写fbank的滤波器,mfcc就是在fbank的基础上做了一个离散余弦变换,可以直接调用scipy;

  • 2)对于fbank,核心是三角滤波器, 直接按照公式,循环计算就可以了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容