利用python声音处理库librosa提取声音信号的mfcc特征及特征融合

利用python库librosa提取声音信号的mfcc特征及特征融合

前言

写这篇博文的目的有两个,第一是希望新手朋友们能够通过这篇博文了解到 python 还有这么强大的一个声音处理库;第二则是本人在用该库时发现的一个小问题,就是库由于封装的太完备,在我们想做特征融合时候会出现一点小问题,在这我将指出并提供一种方案。具体的库使用指导还请参照Librosa 0.6

librosa库介绍

Liborsa是python的一个做音乐和声音分析的包,它提供了创建音乐信息检索系统所必要的构建块。这个库包含有丰富的声音信号处理工具,例如声音读取、采样率转换、stft、istft等等。

librosa 中MFCC特征提取函数介绍

# Mel-frequency cepstral coefficients (MFCCs)梅尔倒谱系数
librosa.feature.mfcc(y=None, sr=22050, S=None, n_mfcc=20, dct_type=2, norm='ortho', **kwargs)

参数介绍:
y:声音信号的时域序列
sr:采样频率(默认22050)
S:对数能量梅尔谱(默认为空)
n_mfcc:梅尔倒谱系数的数量(默认取20)
dct_type:离散余弦变换(DCT)的类型(默认为类型2)
norm:如果DCT的类型为是2或者3,参数设置为"ortho",使用正交归一化DCT基。归一化并不支持DCT类型为1
kwargs:如果处理时间序列输入,参照melspectrogram

返回:
M:MFCC序列
例子:

从一个时间序列中计算mfcc

>>> y, sr = librosa.load(librosa.util.example_audio_file(), offset=30, duration=5)
>>> librosa.feature.mfcc(y=y, sr=sr)
array([[ -5.229e+02,  -4.944e+02, ...,  -5.229e+02,  -5.229e+02],
       [  7.105e-15,   3.787e+01, ...,  -7.105e-15,  -7.105e-15],
       ...,
       [  1.066e-14,  -7.500e+00, ...,   1.421e-14,   1.421e-14],
       [  3.109e-14,  -5.058e+00, ...,   2.931e-14,   2.931e-14]])

利用预先计算好的对数能力梅尔谱计算MFCC

>>> S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000)
>>> librosa.feature.mfcc(S=librosa.power_to_db(S))
array([[ -5.207e+02,  -4.898e+02, ...,  -5.207e+02,  -5.207e+02],
       [ -2.576e-14,   4.054e+01, ...,  -3.997e-14,  -3.997e-14],
       ...,
       [  7.105e-15,  -3.534e+00, ...,   0.000e+00,   0.000e+00],
       [  3.020e-14,  -2.613e+00, ...,   3.553e-14,   3.553e-14]])

解决特征融合问题

采用封装好的函数进行mfcc提取,我们得到的是一个经过分帧加窗及其一系列处理后的数据,要想在每一帧的mfcc后面添加其他特征首先要得到分帧的参数设置,然后对待融合特征采用相同的分帧机制,才能保证二者的融合是在相同帧的情况下进行的。例如我们要对mfcc特征与短时能量特征进行融合,我们在提取二者过程中要保证其分帧方式相同,然后对求得特征进行拼接。mfcc与能量的特征融合代码如下:

import librosa
import matplotlib.pyplot as plt
import numpy as np

path='E:\\Experiment\\soundbank\\cut\\trainall\\screams\\2\\4,00001_2__11.wav' # 声音文件绝对路径
y,sr=librosa.load(path,None) # 以原采样频率读取声音文件数据,并返回该数据及其采样频率
# 设置梅尔滤波器组参数,并设置分帧参数n_fft--帧长,hp_length--帧移
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=60,n_fft=1024, hop_length=512,fmax=16000) 
mfcc=librosa.feature.mfcc(y, sr, S=librosa.power_to_db(S),n_mfcc=40) # 提取mfcc系数
stft_coff=abs(librosa.stft(y,1024,512,1024)) #分帧然后求短时傅里叶变换,分帧参数与对数能量梅尔滤波器组参数设置要相同
energy = np.sum(np.square(stft_coff),0) #求每一帧的平均能量
MFCC_Energy = np.vstack((mfcc,energy)) # 将每一帧的MFCC与短时能量拼接在一起 

其他特征融合方式与上相同。

总结

python库虽然多,为了以后更好的发展还是建议学习时候从原理开始学起,后面我将会继续补充关于python编程过程中遇到的一些小问题,以及技巧,欢迎关注交流。

  • 13
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
Timit语料是一个广泛使用的语音识别数据集,其中包含了美国英语的语音样本。在这个数据集中,每个样本都包含了一个完整的语音信号以及与之对应的音素标签。将timit语料按照音素分割后,可以更加有效地进行后续的语音识别任务。同时,提取MFCC(Mel-frequency cepstral coefficients)特征也是语音信号处理中最常用的技术之一,可用于语音识别、说话人识别等多个领域。 使用Python中的librosa可以方便地实现这个任务,下面是一个大致的代码框架: ```python import librosa import os # 设置timit语料的路径和存储MFCC特征的路径 data_path = 'path/to/timit/dataset' mfcc_path = 'path/to/save/mfcc/features' # 遍历timit数据集中的每一个文件 for root, dirs, files in os.walk(data_path): for file_name in files: # 获取文件的路径 file_path = os.path.join(root, file_name) # 如果文件不是wav格式,则跳过 if not file_path.endswith('.wav'): continue # 使用librosa加载音频文件 signal, sr = librosa.load(file_path, sr=None) # 加载与文件对应的音素标签,这里使用了另一个函数load_phoneme_labels,需要自行实现 phoneme_labels = load_phoneme_labels(file_path) # 将音频信号按照音素切割成多个小段 segments = slice_signal_by_phoneme(signal, phoneme_labels) # 对于每个小段,提取MFCC特征并保存到文件中 for segment in segments: mfcc = librosa.feature.mfcc(segment, sr=sr, n_mfcc=13) # 保存MFCC特征到文件中,可以使用自己喜欢的文件格式,这里使用了numpy的npz格式 mfcc_file_name = os.path.splitext(file_name)[0] + '_' + str(start_frame) + '_' + str(end_frame) + '.npz' mfcc_file_path = os.path.join(mfcc_path, mfcc_file_name) np.savez_compressed(mfcc_file_path, mfcc=mfcc) ``` 需要注意的是,针对一些特殊情况,比如发音较短或者某些发音在音素标签中没有对应的标记等,需要在提取MFCC特征时进行特殊处理。同时,为了提高MFCC特征的稳定性和可靠性,还需要进行一些数据预处理和归一化等操作。总之,使用Pythonlibrosa可以方便地对timit语料进行音素分割和MFCC特征提取,并为后续的语音识别任务提供了重要的支持。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值