语音处理中 常常需要用到mel spectrogram,比如在语音分类中常常会把把信号signal变成图片spectrogram的形式, 然后用分类图片的算法(比如CNN)来分类语音。 本文主要介绍什么是mel specgrogram以及如何通过librosa来获取spectrogram 和mel spectrogram
信号signal
常说一个信号是多少多少赫兹的,指的是 这个信号
每秒有多少个取值点
。44.1kHZ的声音就是 这个声音每秒有44100个取值。
读取声音:
import librosa
import matplotlib.pyplot as plt
%matplotlib inline
y, sr = librosa.load('./sample.wav')
plt.plot(y)
plt.title('Signal')
plt.title('Signal')
plt.xlabel('samples')
plt.ylabel('Amplitude')
傅里叶变换(Fourier Transform)
每个信号都可以看成不同频率的sine或者cosine的信号单元合成, 通过
快速傅里叶变换
(Fast Fourier Transform)可以分解一个信号到不同频率的信号单元:
import numpy as np
n_fft=2048
ft = np.abs(librosa.stft(y[:n_fft], hop_length=n_fft+1))
plt.plot(ft)
plt.title('Spectrum')
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
短时傅里叶变换
声音的频率可能会随着时间而变化,所以对长信号来说直接用FFT来分解整个信号会不妥, 所以用到短时傅里叶变换(short time fourier transform), 只是把
信号分成很多小段, 在每小段上进行FFT运算
。
window length 是每小段的长度, 某一小段计算完以后,会计算下一小段,hop lenth就是两个小段之间的跳跃间隔。
最后得到的STFT就是这些小段FFT的堆加, 每一小段有 Amplitude 和Frequency信息,以及这一小段所在的Time信息。把这些信息汇总到图片上 就得到了Spectrogram.
Spectrogram
由于人类会对低频低音高的片段更感兴趣,所以会对通过FFT变换得到的Amplitude 和Frequency 信息进行
log运算
, 压缩高频和高音高的部分:
import librosa.display
spec = np.abs(librosa.stft(y, hop_length=512))
spec = librosa.amplitude_to_db(spec, ref=np.max) #将音高变为分贝。log运算
librosa.display.specshow(spec, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
颜色表示分贝。
The Mel Scale
人类对低频信号更敏感, 你可以很容易区分500HZ 和1000HZ的声音, 但区分不清楚9000HZ和9500HZ的声音。 但在物理上却很容易区分。 把频率信号做一个非线性映射:
这样 人类对不同频率声音的区分 可以直接通过数值差异来显示了。
Mel spectrogram
Mel spectrogram和spectrogram的区别就是 mel spectrogram的频率是mel scale变换后的频率(你可以想象把Spectrogram整体往下压,)
mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spect = librosa.power_to_db(mel_spect, ref=np.max)
librosa.display.specshow(mel_spect, y_axis='mel', fmax=8000, x_axis='time');
plt.title('Mel Spectrogram');
plt.colorbar(format='%+2.0f dB');
应用 librosa库可以很容易计算spectrogram和mel spectrogram, 至于用哪个效果会好(还有个MFCC)要根据自己的实验结果来。
语音处理中 常常需要用到mel spectrogram,比如在语音分类中常常会把把信号signal变成图片spectrogram的形式, 然后用分类图片的算法(比如CNN)来分类语音。 本文主要介绍如何通过librosa来获取spectrogram 和mel spectrogram
对一段连续的音频信号分帧
把每一帧转换为它的
频谱
(或者能量谱)
对每一帧的
频谱
用
梅尔
滤波器(
mel
filterbank)进行滤波,再对每个滤波器的结果求和得到一个长度为n滤波器n滤波器的向量
对3.中得到的向量的每个元素取对数
对4.中的向量做DCT,得到另一个向量(倒
频谱
)
保留第2~13个元素,舍弃其他。这个长度为12的向量即为MFCC
本文内容主要来自于:
Sp
eech Processing for Machine Learning: Filter banks,
Mel
-Frequency Cepstral Coefficients (MFCCs) and What’s In-Between | Haytham Fayek
1. 什么是
梅尔
语谱图和
梅尔
倒频系数?
机器学习的第一步都是要提取出相应的特征(feature),如果输入数据是图片,例如28*28的图片,那么只需要把每个像素(pixel)作为特征,对应的像素值大小(代表颜色的强.
梅尔
倒谱 系数
梅尔
频率 倒谱系数
mel
frequency Cepstrum coefficient。
( 可以看出 Cepstrum 这个单词是
频谱
sp
ect
rum 前四个字母的倒序),
我们需要先
理解
以下基本概念:
2.1 为什么要取倒谱系数呢?
f 代表原本的频率,M: 代表转换后的
梅尔
频率,
当f很大时, M 的变化趋于平缓。
3. 倒谱分析:
4.
梅尔
倒谱系数:
在得到
梅尔
语谱图后, 进行 DCT 变换, 取出其中的部分系数 作为倒谱系数
不管是用传统的GMM模型,还是用机器学习中的SVM或神经网络模型,提取声音特征都是第一步。
梅尔
频谱
和
梅尔
倒谱就是使用非常广泛的声音特征形式
傅里叶变换实质涉及的是频域函数和时域函数的转换。
如果时域是运动永不停止的,那么频域就是静止的。
正弦波是频域中唯一存在的波形,这是频域中最重要的规则,即正弦波是对频域的描述,因为频域中的任何波形都可用正弦波合成。频域图像,也就是俗称的
频谱
。
这个应该才是最正确的。傅里叶变换就是拆分出许多正弦波,也是说明为什么能将时域图像转化为频域图像。
频谱
只代
在Medium论坛,读到一篇关于
梅尔
谱图的帖子,作者讲得通俗易懂生动幽默,因此翻译过来分享一下。一则,为自己日后查阅方便,二则,帮助其他有困惑的小伙伴一起来学习学习。当然,如果有条件(as you know),建议直接去原链接读英文原版。话不多说,一起来读吧!原文链接:《Understanding the
Mel
Sp
ect
rog
ram
》
作者:Leland Roberts
如果你像我一样,试图
理解
并不是一件容易的事。你读了一篇文章,却被引向了另一篇文章…和另一个…和另一个…继续前进。我希望这篇短文能够澄清
Mel
sp
ect
rog
ram
梅尔
谱
根据我们人类听觉的特性,我们对低频声音比较敏感,对高频声音没那么敏感
所以当声音频率线性增大时,频率越高,我们越难听出差别,因此不用线性谱而是对数谱
Mel
谱包含三大特性:
时域-频域信息
感知相关的振幅信息
感知相关的频域信息
Mel
谱的核心就是
Mel
-scale,一个对数尺度的对于频率感知线性变化的尺度
提取
Mel
谱的方法:
做STFT得到复数矩阵
将幅度转成分贝(db) 问:如果这里在
mel
sp
ect
rog
ram
里面就把幅度转成db了,
那Log_me
如果你像我一样,试着
理解
mel
的光谱图并不是一件容易的事。你读了一篇文章,却被引出了另一篇,又一篇,又一篇,没完没了。我希望这篇简短的文章能澄清一些困惑,并从头解释
mel
的光谱图。
信号是一定量随时间的变化。 对于音频,变化的量是气压。 我们如何以数字方式捕获此信息? 我们可以随时间采集气压样本。 我们采样数据的速率可以变化,但是最常见的是44.1kHz,即每秒44,100个采样。 我们捕获的是信号的波形,可以使用计算机软件对其进行解释,修改和分析。
import librosa
import li.
好的,以下是
Mel
sp
ect
rog
ram
特征提取的流程图:

流程图中的步骤如下:
1. 读取音频信号:从音频文件中读取声音数据。
2. 分帧:将音频信号分成若干个帧,每个帧的长度一般为 20~40 毫秒,帧与帧之间重叠一部分。
3. 加窗:对每个帧进行加窗处理,常用的窗函数有汉明窗、海宁窗等。
4. 傅里叶变换:对每个帧进行快速傅里叶变换,将时域信号转换为频域信号。
5.
梅尔
滤波器组:将频域信号通过一组
梅尔
滤波器,得到每个帧在不同频率区间内的能量值。
6. 取对数:将每个帧的
梅尔
滤波器组能量值取对数,得到
梅尔
频谱
图。
7. 剪辑:将
梅尔
频谱
图剪辑成固定长度,去掉不足长度的帧或补零。
8. 归一化:对每个帧的
梅尔
频谱
图进行归一化处理,使得每个帧的能量值在同一范围内。
9. 得到
Mel
sp
ect
rog
ram
:将归一化后的
梅尔
频谱
图按照时间顺序拼接起来,得到
Mel
sp
ect
rog
ram
特征。