记录通过librosa库进行语谱图的生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yexudengzhidao/article/details/89386093

librosa官网

一. librosa的安装

pip3 install librosa

***注意:**librosa依赖很多其他东西,下载的时候需要开启代理,否则安装失败

二. 读取音频

说明:

  • 音频采样率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为11025Hz、22050Hz、24000Hz、44100Hz、48000Hz五个等级
  • 1Hz代表每秒钟周期震动1次,60Hz代表每秒周期震动60次。
>>> import librosa
>>> # Load a wav file
>>> y, sr = librosa.load('./beat.wav')
>>> y
array([  0.00000000e+00,   0.00000000e+00,   0.00000000e+00, ...,
         8.12290182e-06,   1.34394732e-05,   0.00000000e+00], dtype=float32)
>>> sr
22050

Librosa默认的采样率是22050,如果需要读取原始采样率,需要设定参数sr=None:

>>> import librosa
>>> # Load a wav file
>>> y, sr = librosa.load('./beat.wav', sr=None)
>>> sr
44100

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

>>> import librosa
>>> # Load a wav file
>>> y, sr = librosa.load('./beat.wav', sr=16000)
>>> sr
16000

三. 提取特征

提取Log-Mel Spectrogram 特征

Log-Mel Spectrogram特征是目前在语音识别和环境声音识别中很常用的一个特征,由于CNN在处理图像上展现了强大的能力,使得音频信号的频谱图特征的使用愈加广泛,甚至比MFCC使用的更多。在librosa中,Log-Mel Spectrogram特征的提取只需几行代码:

>>> import librosa
>>> # Load a wav file
>>> y, sr = librosa.load('./beat.wav', sr=None)
>>> # 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, 194)

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

四. 有关代码:

"""
    此模块负责将特征转换成语谱图
"""
import os
import librosa
from scipy import signal
import numpy

if __name__ == '__main__':
    m_bands = 40
    loadpath = '/Users/pengchengming/Desktop/audio_emotion/ProjectData/IEMOCAP/IEMOCAP-Voices-Choosed/improve/'
    savepath = '/Users/pengchengming/Desktop/audio_emotion/ProjectData/Features/IEMOCAP/Bands%d/improve/' % m_bands

    s_rate = 16000
    win_length = int(0.025 * s_rate)  # Window length 15ms, 25ms, 50ms, 100ms, 200ms
    hop_length = int(0.010 * s_rate)  # Window shift  10ms
    n_fft = win_length

    for indexA in os.listdir(loadpath):
        if indexA == '.DS_Store':
            continue
        for indexB in os.listdir(os.path.join(loadpath, indexA)):
            if indexB == '.DS_Store':
                continue
            for indexC in ['ang', 'exc', 'hap', 'neu', 'sad']:
                if indexC == '.DS_Store':
                    continue
                os.makedirs(os.path.join(savepath, indexA, indexB, indexC))
                for indexD in os.listdir(os.path.join(loadpath, indexA, indexB, indexC)):
                    if indexD == '.DS_Store':
                        continue
                    print(indexA, indexB, indexC, indexD)
                    y, sr = librosa.load(os.path.join(loadpath, indexA, indexB, indexC, indexD), sr=16000)
                    #进行傅里叶变换
                    D = numpy.abs(librosa.stft(y, n_fft=n_fft, win_length=win_length, hop_length=hop_length,
                                               window=signal.hamming, center=False)) ** 2
                    #提取特征
                    S = librosa.feature.melspectrogram(S=D, n_mels=m_bands)
                    gram = librosa.power_to_db(S, ref=numpy.max)
                    gram = numpy.transpose(gram, (1, 0))
                    print(numpy.shape(gram))

                    file = open(os.path.join(savepath, indexA, indexB, indexC, indexD + '.csv'), 'w')
                    for indexX in range(len(gram)):
                        for indexY in range(len(gram[indexX])):
                            if indexY != 0:
                                file.write(',')
                            file.write(str(gram[indexX][indexY]))
                        file.write('\n')
                    file.close()

猜你喜欢

转载自blog.csdn.net/yexudengzhidao/article/details/89386093