语音特征提取: 梅尔频谱(Mel-spectrogram)与梅尔倒频系数(MFCCS)

语音识别:梅尔语谱图与MFCC解析
本文围绕语音识别展开,介绍了语音信号、频谱、梅尔语谱图和梅尔倒频系数(MFCCs)等核心概念。详细阐述了获取梅尔语谱图的代码实现,包括获取音频信号、信号预加重、分帧、加窗等步骤。最后总结了Mel频谱和MFCC在音频处理和语音识别中的应用及优势。

1 核心概念

1.1 语音信号

语音信号是一个非平稳的时变信号,但语音信号是由声门的激励脉冲通过声道形成的,经过声道(人的三腔,咽口鼻)的调制,最后由口唇辐射而出。认为“短时间”(帧长/窗长:10~30ms)内语音信号是平稳时不变的。由此构成了语音信号的“短时分析技术”。帧移一般为帧长一半或1/4。

语音特征提取:声音信号本是一维的时域信号,直观上很难看出频率变化规律。傅里叶变换可把它变到频域上,虽然可看出信号的频率分布,但是丢失了时域信息,无法看出频率分布随时间的变化。为了解决这个问题,很多时频分析手段应运而生,如短时傅里叶,小波,Wigner分布等都是常用的时频域分析方法。

1.2 频谱

傅里叶变换的意义就是任意信号都可以分解为若干不同频率的正弦波的叠加。语音信号中,这些正弦波中,频率最低的称为信号的基波,其余称为信号的谐波。基波只有一个,可以称为一次谐波,谐波可以有很多个,每次谐波的频率是基波频率的整数倍。谐波的大小可能互不相同。以谐波的频率为横坐标,幅值(大小)为纵坐标,绘制的系列条形图,称为频谱。频谱能够准确反映信号的内部构造。

1.2 梅尔语谱图

语音的时域分析和频域分析是语音分析的两种重要方法,但是都存在着局限性。时域分析对语音信号的频率特性没有直观的了解,频域特性中又没有语音信号随时间的变化关系。

语谱图综合了时域和频域的特点,明显的显示出来了语音频率随时间的变化情况,语谱图的横轴为时间,纵轴为频率,颜色深表示能量大小,也就是|x|^2。语谱图上不同的黑白程度形成不同的纹路,称为声纹,不用讲话者的声纹是不一样的,可以用做声纹识别。

机器学习的第一步都是要提取出相应的特征(feature),如果输入数据是图片,例如28*28的图片,那么只需要把每个像素(pixel)作为特征,对应的像素值大小(代表颜色的强度)作为特征值即可。那么在音频、语音信号处理领域,我们需要将信号转换成对应的语谱图(spectrogram),将语谱图上的数据作为信号的特征。语谱图的横轴x为时间,纵轴y为频率,(x,y)对应的数值代表在时间x时频率y的幅值。通常的语谱图其频率是线性分布的,但是人耳对频率的感受是对数的(logarithmic),即对低频段的变化敏感,对高频段的变化迟钝,所以线性分布的语谱图显然在特征提取上会出现“特征不够有用的情况”,因此梅尔语谱图应运而生。梅尔语谱图的纵轴频率和原频率经过如下公式互换:

其中f代表原本的频率,m代表转换后的梅尔频率,显然,当f很大时,m的变化趋于平缓。

1.3 梅尔倒频系数(MFCCs)

梅尔倒频系数(MFCCs)是在得到梅尔语谱图之后进行余弦变换(DCT,一种类似于傅里叶变换的线性变换),然后取其中一部分系数即可。提取流程总结如下:

通过librosa提取mfcc:


 

2 获取梅尔语谱图代码实现

2.1 获取音频信号

python可以用librosa库来读取音频文件,这里我们首先读取音频文件,并作出0-20秒的波形。现在的音乐文件采样率通常是44.1kHz。用y和sr分别表示信号和采样率。代码和图形如下:

import librosa
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib.ticker as ticker


# 图形绘制
def personal_plot(x, y):
    plt.figure(dpi=200, figsize=(12, 6))
    rcParams['font.family'] = 'Comic Sans MS'
    plt.plot(x, y)
    plt.xlim(x[0], x[-1])
    plt.xlabel('time/s', fontsize=20)
    plt.ylabel('Amplitude', fontsize=20)
    plt.xticks(fontsize=16)
    plt.yticks(fontsize=16)
    plt.grid()
    plt.show()


y, sr = librosa.load('../data/mel001.wav', sr=None, duration=30)

# 获取0-20秒的部分
tmax, tmin = 20, 0
t = np.linspace(tmi
Librosa库是一个广泛用于音信号处理的Python库,其中`librosa.feature.mfcc()`函数用于提取Mel系数Mel-frequency cepstral coefficients, MFCCs)。MFCC是一种常用的音特征表示方法,它将原始频谱转换成一组离散的、人类语音更易识别的特征。 每个MFCC系数对应的是一个连续的音频谱范围通过Mel滤波器组(Mel filterbank)得到的。Mel滤波器组是一系列线性间隔的低通滤波器,其率间距基于人耳对率感知的变化而设计。在实际计算过程中,首先对音信号做短时傅立叶变换(STFT),然后对STFT的结果应用Mel滤波器,最后取每个滤波器的对数能量作为MFCC系数。 以下是一个简单的Python代码示例,说明如何使用librosa提取MFCC并计算对应段: ```python import librosa import numpy as np def get_mfcc_freq_range(audio_path, n_mfcc=13): # 加载音文件 y, sr = librosa.load(audio_path) # 提取MFCC mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=n_mfcc) # 获取Mel滤波器中心mel_frequencies = librosa.filters.mel(sr, fmax=np.max(librosa.fft_frequencies(sr)), n_mels=n_mfcc + 1)[1:-1] # 计算每个MFCC系数对应的段 freq_bands = (mel_frequencies[:-1] + mel_frequencies[1:]) / 2 return freq_bands, mfcc # 使用方法 audio_path = 'your_audio_file.wav' freq_bands, mfcc_features = get_mfcc_freq_range(audio_path) print("MFCC系数对应的:", freq_bands) ``` 在这个例子中,`n_mfcc`参数指定了要提取的MFCC系数的数量。`freq_bands`变量就是你想要的答案,它是所有MFCC系数所对应的段列表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源启智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值