librosa音频处理教程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了librosa音频处理教程相关的知识,希望对你有一定的参考价值。
参考技术A Librosa是一个 Python 模块,用于分析一般的音频信号,是一个非常强大的python语音信号处理的第三方库,根据网络资料以及官方教程,本文主要总结了一些重要且常用的功能。IPython.display.Audio 可以让我们直接在 jupyter notebook 中播放音频,比如下面包房一段音频
在这里,我们绘制了一个简单的音频波形图。 波图让我们知道给定时间的音频响度。
频谱图(Spectogram)是声音频率随时间变化的频谱的可视化表示,是给定音频信号的频率随时间变化的表示。'.stft' 将数据转换为短期傅里叶变换。 STFT转换信号,以便我们可以知道给定时间给定频率的幅度。 使用 STFT,我们可以确定音频信号在给定时间播放的各种频率的幅度。
Spectrogram特征是目前在语音识别和环境声音识别中很常用的一个特征,由于CNN在处理图像上展现了强大的能力,使得音频信号的频谱图特征的使用愈加广泛,甚至比MFCC使用的更多。
信号的梅尔频率倒谱系数 (MFCC) 是一小组特征(通常约为 10-20),它们简明地描述了频谱包络的整体形状。在 MIR 中,它经常被用来描述音色。
在这个例子中,mfcc 在 89 帧中计算了 20 个 MFCC。
第一个 MFCC,第 0 个系数,不传达与频谱整体形状相关的信息。 它只传达一个恒定的偏移量,即向整个频谱添加一个恒定值。 因此,很多情况我们可以在进行分类时会丢弃第一个MFCC。
过零率(zero-crossing rate,ZCR)是指一个信号的符号变化的比率,例如信号从正数变成负数,或反过来。这个特征已在语音识别和音乐信息检索领域得到广泛使用,是分类敲击声的关键特征。为真时为1,否则为0。在一些应用场景下,只统计“正向”或“负向”的变化,而不是所有的方向。
可以使用整个音频来遍历这个并推断出整个数据的过零。
频谱质心(维基百科)表示频谱能量集中在哪个频率上。这就像一个加权平均值:
其中 S(k) 是频段 k 处的频谱幅度,f(k) 是频段 k 处的频率。
librosa.feature.spectral_bandwidth 可以用来计算p-order频谱带宽:
其中 S(k) 是频段 k 处的频谱幅度,f(k) 是频段 k 处的频率,fc 是频谱质心。当 p=2 时,这就像一个加权标准差。
频谱衰减是总频谱能量的特定百分比所在的频率。
色度向量 (Wikipedia) 是一个典型的 12 元素特征向量,指示每个音高类别 C, C#, D, D#, E, ..., B 的能量是多少存在于信号中。
音高是声音的感知属性,在与频率相关的尺度上排序,或者更常见的是,音高是可以判断声音在与音乐旋律相关的意义上“更高”和“更低”的质量。
使用 librosa 进行音频分类的 MFCC 特征描述符
【中文标题】使用 librosa 进行音频分类的 MFCC 特征描述符【英文标题】:MFCC feature descriptors for audio classification using librosa 【发布时间】:2014-11-17 06:50:28 【问题描述】:我正在尝试获取音频文件的单向量特征表示,以用于机器学习任务(特别是使用神经网络进行分类)。我有计算机视觉和自然语言处理方面的经验,但我需要一些帮助来加快处理音频文件的速度。
目前有多种音频文件的特征描述符,但似乎 MFCC 最常用于音频分类任务。我的问题是:如何将 MFCC 表示为一个音频文件,它通常是一个矩阵(可能是系数),并将其转换为单个特征向量?我目前正在为此使用librosa。
我有一堆音频文件,但它们的形状各不相同:
for filename in os.listdir('data'):
y, sr = librosa.load('data/' + filename)
print filename, librosa.feature.mfcc(y=y, sr=sr).shape
213493.ogg (20, 2375)
120093.ogg (20, 7506)
174576.ogg (20, 2482)
194439.ogg (20, 14)
107936.ogg (20, 2259)
作为 CV 人员,我会做的是通过 k-means 量化这些系数,然后使用 scipy.cluster.vq 之类的东西来获得形状相同的向量,我可以将其用作我的 NN 的输入。这也是您在音频案例中会做的事情,还是有不同/更好的方法来解决这个问题?
【问题讨论】:
【参考方案1】:查看scikits.talkbox。它具有多种功能,可帮助您从音频文件生成 MFCC。具体来说,您会想做这样的事情来生成 MFCC。
import numpy as np
import scipy.io.wavfile
from scikits.talkbox.features import mfcc
sample_rate, X = scipy.io.wavfile.read("path/to/audio_file")
ceps, mspec, spec = mfcc(X)
np.save("cache_file_name", ceps) # cache results so that ML becomes fast
然后在进行 ML 时,执行以下操作:
X = []
ceps = np.load("cache_file_name")
num_ceps = len(ceps)
X.append(np.mean(ceps[int(num_ceps / 10):int(num_ceps * 9 / 10)], axis=0))
Vx = np.array(X)
# use Vx as input values vector for neural net, k-means, etc
我在构建音频流派分类工具 (genreXpose) 时使用了这些东西。
PS:我使用的一个方便的音频转换工具是PyDub
【讨论】:
按照我的理解,mfcc 特征是一个二维数组,形式为 (numFrames, numMFCCoeffiecients)。也就是说,每一帧都会产生一个 MFCC 列表。 ceps 变量似乎只是一维系数数组。为什么会这样?另外 X.append 行的目的是什么?我真的对此很好奇,如果能对此事有所了解,我将不胜感激【参考方案2】:这真的取决于任务。我会尝试 kmeans 等,但在很多情况下这可能没有帮助。
有几个使用dynamic time warping with librosa 的好例子。
还有使用已知形状的滑动窗口的想法,也可能很好。然后你可以考虑之前的预测和转移概率矩阵。
【讨论】:
【参考方案3】:通常,在音频分类文献中,所有音频文件都会根据分类任务被截断为相同的长度(即,我正在研究跌倒检测设备,所以我知道音频文件的持续时间不应超过 1 秒,因为这是跌倒事件的预期持续时间)。
然后,对于每个音频文件,您可以提取每个帧的 MFCC 系数并将它们堆叠在一起,从而为给定的音频文件生成 MFCC 矩阵。由于每个音频文件都具有相同的长度,并且我们假设所有帧都包含相同数量的样本,因此所有矩阵将具有相同的大小。
【讨论】:
你能分享你的代码吗?我正在做一个类似的任务。想了解方法【参考方案4】:您可以使用 https://github.com/jsingh811/pyAudioProcessing 之类的库来获取您的 mfcc 功能,然后使用一个命令完成分类。 它计算 mfcc,将其转换为每个音频的一个特征向量,并提供从不同的 sklearn 分类器中进行选择以对 mfcc 特征进行分类的选项。
【讨论】:
能否请您提供一个简短的示例来演示如何使用该库?以上是关于librosa音频处理教程的主要内容,如果未能解决你的问题,请参考以下文章