wav2mel

wav2mel spectrogram

Posted by 朱晓旭 on April 21, 2020

wav生成mel spectrogram的方法

加载wav文件到浮点数时间序列

注意默认的sr=22050,不想输入采样率又避免使用了默认,需要sr=None
mono是bool值,是否转换成单通道。
offset是指一段时间后才开始load音频。
dtype是指定存放的数据类型,默认是float32.

wav, source_sr = librosa.load(fpath_or_wav, sr=None)

从wav时间序列到mel spectrogram

可以有两种输入:y是wav文件的时间序列;S是声谱图。
S声谱可以由短时傅里叶变换求得。
n_fft是FFT窗口,int型,是采样点的个数。
hop_length是步幅,可以理解为卷积中的strides,int型,是采样点的个数。重叠则是overlapping = n_fft - hop_length
win_length:Each frame of audio is windowed by window(). The window will be of length win_length and then padded with zeros to match n_fft.
Window:可以是窗函数,可以是a window specification (string, tuple, or number),也可以是array。
center:布尔型。True的话,t时刻的frame中心是y[t * hop_length];False的话,t时刻的frame开始是y[t * hop_length]
power:float。指的是梅尔谱的类型。1代表能量谱energy,2代表功率谱power。

mel=librosa.feature.melspectrogram(y=None, sr=22050, S=None, n_fft=2048, hop_length=512, win_length=None, window='hann', center=True, pad_mode='reflect', power=2.0, **kwargs)

先短时傅里叶变换得到功率谱,再从功率谱到mel spectrogram

补充(摘自)

能量谱也叫能量谱密度,能量谱密度描述了信号或时间序列的能量如何随频率分布。能量谱是原信号傅立叶变换的平方
功率谱是功率谱密度函数(PSD)的简称,它定义为单位频带内的信号功率。一段信号的功率谱等于这段信号自相关函数的傅里叶变换
所以求功率谱就有了两种方法:1.(傅立叶变换的平方)/(区间长度);2.自相关函数的傅里叶变换。
功率谱的单位是W/Hz,单位是dB时是做了对数处理(10logX)。取对数的目的是使那些振幅较低的成分相对高振幅成分得以拉高,以便观察掩盖在低幅噪声中的周期信号。
倒频谱(Cepstrum)也叫倒谱、二次谱和对数功率谱等。倒频谱的工程型定义是:信号功率谱对数值进行傅立叶逆变换的结果。(信号→求功率谱→求对数→求傅里叶逆变换)
为什么翻译作倒频谱呢?我个人的理解是,频谱(功率谱)反应的频率特征点横坐标是频率f(Hz),在倒频谱中对应的特征点的横坐标是时间t(s),而f与t互为倒数。从这里也可以看出,虽然倒频谱也叫“频谱”,其横坐标却并不是频率,而是时间。

D = np.abs(librosa.stft(y))**2
S = librosa.feature.melspectrogram(S=D, sr=sr)

需要注意短时傅里叶变换librosa.stft

librosa.core.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, dtype=<class 'numpy.complex64'>, pad_mode='reflect')