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