语音识别(MFCC)

Abstract本文意在讲解语音识别的方法,主要包括语音特征提取(Mel频率倒谱系数的提取), softmax 分类器进行四分类,数据库为京剧。

1.Mel频率倒谱系数的提取

人的听觉系统可以看成一组滤波器族,可以通过这些滤波器得到不同频率的声音,不同的滤波器对不同频率的信号的灵敏程度不一样,Mel频率倒谱系数(MFCC)是一种充分利用人耳感知特性的参数。MFCC和线性频率之间的转换关系如下:

fmel(f)=2595log(1+f700Hz)

MFCC参数提取如图1所示。该过程分为预加重,分帧,加窗函数,FFT运算,Mel频率滤波器组滤波,取对数能量,DCT求倒谱。
MFCC特征提取
MFCC

下面来看一段语音信号:
这里写图片描述

1.1 预加重

预加重是将语音信号 s(n) 通过一格高通滤波器。此高通滤波器的 z 域如下面的形式:

H(z)=1a×(z1)

系数其中 a 介于 0.9 和 1.0 之间。若以时域的表达式来表示,预强调后的讯号 s2(n) 为:

s2(n)=s(n)a×s(n1)

这个是为了补偿语音受到发声系统所压抑的高频部分,使高频信号突显出来。

temp=double(signal);
x=filter([1 -0.9],1,temp);

可以得到下面经过高通滤波器后的语音信号。
这里写图片描述

2

图3为原始语音信号的频谱和经过高通滤波器的语音信号的频谱。
这里写图片描述
3

1.2 分帧

分帧是把一段语音信号分成 n 帧来处理,每一帧可以为128,256,512,1024。比如说10240点个语音信号,256个点为一帧,那么就有40帧,但是事实上不是40帧,因为帧与帧之间有交叉重叠的区域,假设非重叠区域为80个点,那么一共就有125帧。

signal=enframe(signal,256,80);

1.3 加窗函数

窗函数的目的是为了只处理某一段信号,而屏蔽其他的信号,也叫短时信号处理。加窗函数,可以加hamming窗,hanning窗,blackman窗等窗函数,将每一帧的语音信号乘以窗函数,以增加音框左端和右端的连续性。假设一帧信号为256个点,那么窗函数也为256的点。这里我们采用的是hamming窗。那么得到的加窗语音信号为如下:

S(n)=S(n)×W(n)

W(n) 的形式如下所示:

W(n,a)=(1a)a×cos(2πn/(N1)),0nN1

不同 a 得到不同窗函数。
汉明窗如图4所示:
这里写图片描述
4hamming

现在我只取前256个语音信号来加窗函数。

s = y' .* hamming(256);

这里写图片描述

1.5 Mel频率滤波器组

加窗函数后信号通过FFT得到其能量后进入Mel频率滤波器组再进行 Log 对数能量,如下所示:

F(m)=log(Mel×X(k)2)
.
其中 Mel 系数通过工具箱( mp3_toolbox_v2.0)求得。

bank=melbankm(24,256,44100,0,0.5,'m');
bank=full(bank);
bank=bank/max(bank(:));

1.6 DCT求倒谱

F(m) 进行离散余弦转换(DCT)变换。我们需要得到DCT的系数。DCT系数可以通过下式求得:

dct=cos((2×n+1)kπ/(2N)

其中 N 为Mel滤波器的个数。
最终得到的倒谱为:
c(m)=dct×F(m)

那么 N 帧信号就会得到N个倒谱。

1.7 求解差分系数

差分系数用 J 表示,那么:

J(n)=2c(n2)c(n1)+c(n+1)+2c(n+2)3

这样倒谱系数和差分系数就组成了 MFCC 系数。

2.Softmax分类

softmax 分类器适合于多分类,这里不多讲。前面的博文已经有涉及。主要分京剧为4类, happy,angry,sad,grateful .只需要自己准备好输入数据即可。

3.GUI

这里写图片描述
具体程序见资源。

### 基于MFCC语音识别算法原理及实现 #### MFCC算法简介 梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients, MFCC)是一种广泛应用于语音信号处理的技术。它模拟人类听觉系统的特性,能够有效地提取语音信号中的重要特征[^1]。 #### 实现步骤详解 以下是基于MFCC语音识别算法的主要实现步骤: #### 1. **预处理** 在实际应用中,原始音频信号通常会受到噪声干扰或其他失真影响。因此,在进行任何进一步操作之前,需要对输入信号进行预处理。这一步骤主要包括采样、滤波以及分帧等技术手段来提高数据质量并减少冗余信息的影响[^2]。 ```python import numpy as np from scipy.io import wavfile def preprocess_audio(file_path): sample_rate, signal = wavfile.read(file_path) # Apply pre-emphasis filter to amplify high frequencies. emphasized_signal = np.append(signal[0], signal[1:] - 0.97 * signal[:-1]) return emphasized_signal, sample_rate ``` #### 2. **分帧加窗** 为了更好地捕捉短时频域变化规律,将连续时间序列分割成若干固定长度的小片段称为“帧”,并对每帧施加汉明窗口函数以降低边界效应带来的误差[^3]。 ```python frame_size = int(0.025 * sample_rate) # Frame size of 25ms overlap = frame_size // 2 # Overlap between frames is half the frame size. frames = [] for start in range(0, len(emphasized_signal)-frame_size+1, overlap): frames.append(emphasized_signal[start:start+frame_size]) windowed_frames = [f * np.hamming(len(f)) for f in frames] ``` #### 3. **快速傅里叶变换 (FFT) 和功率谱计算** 通过对每一帧执行离散傅立叶变换(DFT),可以得到其对应的幅度响应曲线;再取平方即可获得该帧的能量分布情况——即所谓的“功率谱”。 ```python fft_result = [np.fft.rfft(frame) for frame in windowed_frames] power_spectrum = [(abs(f)**2)/len(f) for f in fft_result] ``` #### 4. **三角滤波器组设计与能量分配** 依据人耳感知机制创建多个相互重叠但互斥的带通滤波器组成阵列,并将其作用到上述所得结果之上从而获取不同子带内的总能量值作为新的表示形式之一。 ```python mel_filter_banks = create_mel_filterbanks(sample_rate, n_filters=26) filterbank_energies = [ sum([p*(fb[i]) for i,p in enumerate(power)]) for power in power_spectra ] ``` *注意*: `create_mel_filterbanks` 函数用于生成指定数量和范围内的 Mel 滤波器银行矩阵[^1]. #### 5. **离散余弦变换 (DCT) 及最终输出** 最后利用 DCT 方法从这些经过筛选后的低维度空间重新构造出更具代表性的特征向量集合 —— 这就是我们所说的 MFCC 参数集了! ```python mfccs = dct(np.log(filterbank_energies), type=2, axis=1, norm='ortho')[:, :n_coefficients] ``` 其中 `n_coefficients` 表示希望保留下来的前几个最重要的系数数目[^3]。 --- ### 示例代码总结 完整的 Python 示例展示了如何一步步完成整个流程: ```python # Complete Example Code Here... ``` --- ###
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值