当前位置:   article > 正文

python常用信号处理函数之librosa_log-mel spectrogram如何获得的呢

log-mel spectrogram如何获得的呢

Librosa

Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大。
api官方文档学习地址:http://librosa.org/doc/latest/index.html
那么它主要有哪些功能呢?
在这里插入图片描述

安装

Librosa官网提供了多种安装方法,详细如下:

pypi
最简单的方法就是进行pip安装,可以满足所有的依赖关系,命令如下:

pip install librosa
  • 1

conda
如果安装了Anaconda,可以通过conda命令安装:

conda install -c conda-forge librosa
  • 1

source (一般在linux系统)
直接使用源码安装,需要提前下载源码,即tar.gz文件(https://github.com/librosa/librosa/releases/),通过下面命令安装:

tar xzf librosa-VERSION.tar.gz
cd librosa-VERSION/
python setup.py install
  • 1
  • 2
  • 3

代码实现

1.音频读取处理

导入库:

import librosa
import librosa.display
# 再导入点画图、计算的库
import matplotlib.pyplot as plt
import numpy as np
  • 1
  • 2
  • 3
  • 4
  • 5

Librosa里面有很多默认的参数,如默认的采样率是22050,在提取mel谱时,默认参数为
sr=22050, S=None, n_fft=2048, hop_length=512, power=2.0等
所以提醒大家,要根据自己实际数据设置参数。

如果不写sr参数,默认采样到22050Hz,如果需要读取原始采样率,则设定参数sr=None:

 y, sr = librosa.load('./001.wav', sr=None)
  • 1

'001.wav’的原始采样率为48000。如果需要重采样,只需要将采样率参数sr设定为你需要的值:

y, sr = librosa.load('001.wav', sr=16000)
  • 1

注:此时只改变了采样率,未改变采样精度。

2.特征提取

2.1 Log-Mel Spectrogram特征

是目前在语音识别等中很常用的一个特征,由于CNN在处理图像上展现了强大的能力,使得音频信号的频谱图特征的使用愈加广泛。
有两种提取方式:

    # 第一种:Using a pre-computed power spectrogram
    >>> D = np.abs(librosa.stft(y))**2
    >>> S1 = librosa.feature.melspectrogram(S=D)

    # 第二种:Passing through arguments to the Mel filters
    >>> S2 = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000)

    # 可以通过画图观察
    >>> plt.figure(figsize=(10, 4))
    >>> librosa.display.specshow(librosa.power_to_db(S,ref=np.max),y_axis='mel', fmax=8000, x_axis='time')
    >>> plt.colorbar(format='%+2.0f dB')
    >>> plt.title('Mel spectrogram')
    >>> plt.tight_layout()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

得到的谱图如下:
Mel spectrogram1就是第一种方法得到的
在这里插入图片描述
在这里插入图片描述
两种方得到的大体相似。但纹路并不清晰,这是男生中文发音“你好”,重采样到16000Hz的结果,其他全为默认参数。
然后我把sr设为None,得到如下:
在这里插入图片描述
在这里插入图片描述
可以看到图2效果明显变好。具体分析一下,此时采样率为原始采样率48000Hz,男生基频假设在200Hz左右,可能更低,48000/200=240,也就是一个基音周期为240点左右,甚至更多。那窗长一般包含好几个基音周期才行,stft默认sr为2048,差不多8个基音周期,应该还行,一般包含2-3个基音周期,所以1024可能更好。
为什么图1效果不如图2?因为图1在librosa.feature.melspectrogram(S=D)中默认sr又成了22050。此时里面加上librosa.feature.melspectrogram(S=D,sr=sr),图1结果变成如下:
在这里插入图片描述
然后我又窗长改为1024:

D = np.abs(librosa.stft(y,n_fft=1024))**2 #一次方为energy,平方为power
S1 = librosa.feature.melspectrogram(S=D,sr=sr,n_fft=1024,hop_length=256,fmax=8000) 

# Passing through arguments to the Mel filters
S2 = librosa.feature.melspectrogram(y=y,sr=sr, n_fft=1024,hop_length=256,fmax=8000)
  • 1
  • 2
  • 3
  • 4
  • 5

此时,效果图一样,我就放其中一个:(哪个窗长效果好呢?1024or2048)
在这里插入图片描述
但是当我把fmax=8000删除后,结果变成:
在这里插入图片描述
查看代码,主要是建mel滤波器的时候:

def mel(sr, n_fft, n_mels=128, fmin=0.0, fmax=None, htk=False,
        norm=1):
        '''
		fmax: float >= 0 [scalar]
        highest frequency (in Hz).
        If `None`, use `fmax = sr / 2.0`
        '''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Clip the maximum frequento 8KHzcy,所以?

一般特征提取时代码如下:

# extract mel spectrogram feature
melspec = librosa.feature.melspectrogram(y, sr, n_fft=1024, hop_length=512, n_mels=128)
 # convert to log scale
logmelspec = librosa.power_to_db(melspec)

>>> logmelspec.shape
(128, 1156)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Log-Mel Spectrogram特征是二维数组的形式,128表示Mel频率的维度(频域),1156为多少帧(时域),所以Log-Mel Spectrogram特征是音频信号的时频表示特征。其中,n_fft指的是窗的大小,这里为1024;hop_length表示相邻窗之间的距离,这里为512,也就是相邻窗之间有50%的overlap;n_mels为mel bands的数量,这里设为128。

  • MFCC特征
 # extract mfcc feature
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40)

>>> mfccs.shape
(40, 1156)
  • 1
  • 2
  • 3
  • 4
  • 5

Librosa还有很多其他音频特征的提取方法,比如CQT特征、chroma特征等,在第二部分“librosa常用功能”给了详细的介绍。

2.2 梅尔倒谱系数

librosa.feature.mfcc
主要学习利用该库提取mfcct特征,望各位批评指正。
MFCCs (Mel-frequency cepstral coefficients):梅尔倒谱系数

librosa.feature.mfcc(y=None, sr=22050, S=None, n_mfcc=20, dct_type=2, norm='ortho', lifter=0, **kwargs
  • 1

输入参数:

  1. y: 语音时间序列。np.ndarray [shape=(n,)] or None
  2. sr: y的采样频率。number > 0 [scalar]
  3. S: 能量对数log-power梅尔谱。np.ndarray [shape=(d, t)] or None
  4. n_mfcc: MFCCs返回时数目。 int > 0 [scalar]
  5. dct_type:{1, 2, 3} 离散余弦变换(DCT)类型。默认2。
  6. norm: None or ‘ortho’。如果dct_type是2或3,设置norm='ortho’使用正交标准DCT基。dct_type=1不支持标准化。
  7. lifter: 如果 lifter>0, 提升倒谱滤波。设置lifter >= 2 * n_mfcc强调高阶系数。随着lifter的增加,权重系数近似为线性。
  8. kwargs: additional keyword arguments.

返回参数:

  1. MFCC sequence(M):np.ndarray [shape=(n_mfcc, t)]

3.谱分解

在这里插入图片描述

comps, acts = librosa.decompose.decompose(S, n_components=None, transformer=None, sort=False, fit=True, **kwargs)
  • 1

分解一个特征矩阵
给定一个谱S,分解成分量components和激活矩阵activations。也即是S ~= components.dot(activations)
默认情况下,利用非负矩阵分解法(non-negative matrix factorization,NMF),来自 sklearn.decomposition。
参数:
1.输入的特征矩阵(如幅度谱)
S:np.ndarray [shape=(n_features, n_samples), dtype=float]
2.想要分解的分量数目,若设置为None,就默认n_feature的值
n_componentsint > 0 [scalar] or None
3.transformer:None or object
变换类型,若设置None,默认 sklearn.decomposition.NMF。否则,任何具有与NMF类似接口的对象都可以。transformer 必须遵循 scikit-learn传统,即输入数据必须是(n_samples, n_features)。
transformer.fit_transform()应该是S的转置S.T,返回值存储(转置)为activations。
分量components将会返回为:transformer.components_.T。

S ~= np.dot(activations, transformer.components_).T
  • 1

S ~= np.dot(transformer.components_.T, activations.T)
  • 1

4.sort:bool
如果为True,则分量按峰值频率升序排序。
如果与transformer一起使用,则将对分解参数的副本应用排序,而不是对内部参数进行排序。

5.fit:bool
如果为True,则从输入S估计组件。
如果为False,则假定组件是预先计算的,并存储在transformer中,不进行更改。

6.kwargs:Additional keyword arguments to the default transformer

返回:

components: np.ndarray [shape=(n_features, n_components)]matrix of components (basis elements).

activations: np.ndarray [shape=(n_components, n_samples)]
变换后矩阵/激活矩阵

例子:

>>> y, sr = librosa.load(librosa.ex('choice'), duration=5)
>>> S = np.abs(librosa.stft(y))
>>> comps, acts = librosa.decompose.decompose(S, n_components=8)
  • 1
  • 2
  • 3

推荐博客:
librosa具体功能

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/325055
推荐阅读
相关标签
  

闽ICP备14008679号