音频特征(1):mfcc提取

除了调用FFmpeg来做多媒体开发,另一方面,是对音频特征进行研究。有很多具体的音频特征,比如频率、振幅、节拍(bpm)、过零率、短时能量、MFCC等,在很多时候,提取这些特征是进一步分析音频的基础。

如果你想对音频进行一个分类,比如分出快慢歌、分出爵士跟hiphop、分出钢琴与吉他、分出男高音与鸟叫声,等等,这时,基本上,你离不开音频特征的提取。在众多的音频特征中,频率与MFCC,是经常用到的两个特征。

本文主要介绍MFCC的概念,以及如何提取MFCC。

这里先回顾一下频率的概念,然后再介绍MFCC的提取。

(1)频率

频率,就是1秒内振动的次数。

音频的频率,反映了音调的高低,比如400HZ,相当于小蜜蜂嗡嗡的声音。

现在流行的机器学习,普遍以图片作为输入样本,所以把频率图像化是一个有效的办法。频率图像化,最自然的做法,就是绘制成频谱图,比如小程在另一篇文章介绍用python的pyplot来绘制,这个样子:

一般来说,用于机器学习时,并不能把整个语谱图作为输入,还需要进行合理的切片,甚至是清洗处理,然后再作为输入,但这个不是这里的内容。

(2)MFCC

MFCC,Mel-FrequencyCepstralCoefficients,缩写为MFCC,梅尔频率倒谱系数。

MFCC是一组特征向量,反映了频谱的轮廓(包络),可用于音色分类。从实用的角度,MFCCs,可以应用于音频分类的机器学习,作为输入样本数据。

接下来,小程使用python的librosa库,提取梅尔倒谱系数,并绘制成图片。跟上面介绍的频率一样,转成图片,是用于机器学习的一个有效的办法。

代码如下:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy, scipy, librosa, audioread, wave
import librosa.display
import sys, os

def showmfcc(wavpath):
    t, spe = librosa.load(wavpath)
    mfccs = librosa.feature.mfcc(t, sr=spe)
    print(mfccs.shape)
    librosa.display.specshow(mfccs, sr=spe, x_axis='time')
    plt.show()

def decode2wav(srcname, outname):
    f = audioread.audio_open(filename)
    nsample = 0
    for buf in f:
        nsample += 1
    f.close()

    with audioread.audio_open(filename) as f:
        print("input file: channels=%d, samplerate=%d, duration=%d" % (f.channels, f.samplerate, f.duration))
        channels = f.channels
        samplewidth = 2
        samplerate = f.samplerate
        compresstype = "NONE"
        compressname = "not compressed"
        outwav = wave.open(outname, 'wb')
        outwav.setparams((channels, samplewidth, samplerate, nsample, compresstype, compressname))
        for buf in f:
            outwav.writeframes(buf)
        outwav.close()

def pcm2wav(srcname, outname, channels, samplewidth, samplerate):
    fs = os.path.getsize(srcname)
    nsample = fs / samplewidth
    outwav = wave.open(outname, 'wb')
    outwav.setparams((channels, samplewidth, samplerate, nsample, "NONE", "not cmopressed"))
    fsrc = open(srcname, 'rb')
    outwav.writeframes(fsrc.read())
    fsrc.close()
    outwav.close()

if __name__ == '__main__':
    filename = sys.argv[1]
    filename = os.path.abspath(os.path.expanduser(filename))
    if not os.path.exists(filename):
        print("input file not found, then exit")
        exit(1)

    path, ext = os.path.splitext(filename)
    wavpath = path + ".wav"
    if ext != '.wav':
        if ext == ".pcm":
            if len(sys.argv) < 5:
                print("when input pcm, parameters should be [pcmfilename, channelcount, samplewidth_byte, samplerate]")
                exit(1)
            chcout = int(sys.argv[2])
            bitwidth = int(sys.argv[3])
            samplerate = int(sys.argv[4])
            pcm2wav(filename, wavpath, chcout, bitwidth, samplerate)
        else:
            decode2wav(filename, wavpath)

    showmfcc(wavpath)

上面的代码,有较大的幅度是在做音频转码,即转码成wav文件,这个跟“绘制音频的波形图”(另一篇文章)的处理一样。

实际上,librosa支持各种格式的解码,只要audioread能支持即可,所以并不需要特意转成wav再来调用librosa,只需要直接调用librosa即可。

关键的代码,也就是提取mfcc的代码,只有这一小部分:

执行这段代码,看到效果是这样的:

总结一下,本文简单介绍了MFCC的概念,并且使用librosa演示了MFCC提取的实现。频率与MFCC的提取,是许多音频分析工作的基础。



原文地址:https://www.cnblogs.com/freeself/p/11077540.html

时间: 2024-11-10 16:56:47

音频特征(1):mfcc提取的相关文章

音频特征提取——常用音频特征

作者:桂. 时间:2017-05-05  21:45:07 链接:http://www.cnblogs.com/xingshansi/p/6815217.html 前言 主要总结一下常用的音频特征,并给出具体的理论分析及代码. 一.过零率 过零率的表达式为: 其中N为一帧的长度,n为对应的帧数,按帧处理. 理论分析:过零率体现的是信号过零点的次数,体现的是频率特性.因为需要过零点,所以信号处理之前需要中心化处理. code(zcr1即为过零率): for i=1:fn z=X(:,i); % 取

机器学习特征表达——日期与时间特征做离散处理(数字到分类的映射),稀疏类分组(相似特征归档),创建虚拟变量(提取新特征) 本质就是要么多变少,或少变多

特征表达 接下来要谈到的特征工程类型虽然简单却影响巨大.我们将其称为特征表达. 你的数据并不一定总是理想格式.你需要考虑是否有必要通过另一种形式进行特征表达以获取有用信息. 日期与时间特征: 我们假设你拥有purchase_datetime特征.从中提取purchase_day_of_week与purchase_hour_of_day两项特征可能会更有用.你还可以进行观察聚类以创建诸如purchases_over_last_30_days这类特征. 数字到分类的映射: 假设你拥有years_in

OpenCV中特征点提取和匹配的通用方法

OpenCV在新版本中把很多C语言的代码都重新整理成了C++代码,让我们在使用的时候更加方便灵活.其中对于特征点的提取和匹配,充分体现了C++的强大.下面直接用例子来说明.假设我们有两幅图:1.bmp和2.bmp,要从中提取体征点并匹配,代码如下: // Load image from file IplImage *pLeftImage = cvLoadImage("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);IplImage *pRightImage = cvL

Opencv 各种特征点提取和匹配

opencv 特征点的提取和匹配 1. 当中的数据结构 KeyPoint这数据结构中有如下数据结构: class KeyPoint { Point2f pt; //坐标 float size; //特征点邻域直径 float angle; //特征点的方向,值为[零,三百六十),负值表示不使用 float response; int octave; //特征点所在的图像金字塔的组 int class_id; //用于聚类的id angle:角度,表示关键点的方向,SIFT算法通过对关键点周围邻域

SIFT特征点提取

一. SIFT算法 1.算法简介 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法.它用来侦测与描述影像中的局部性特征, 它在空间尺度中寻找极值点,并提取出其位置.尺度.旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结. 其应用范围包含物体辨识.机器人地图感知与导航.影像缝合.3D模型建立.手势辨识.影像追踪和动作比对. 局部影像特征的描述与侦测可以帮助辨识物体,SIFT特征是基于物体上的一些

梅尔频率倒谱系数(MFCC) 学习笔记

最近学习音乐自动标注的过程中,看到了有关使用MFCC提取音频特征的内容,特地在网上找到资料,学习了一下相关内容.此笔记大部分内容摘自博文 http://blog.csdn.net/zouxy09/article/details/9156785 有小部分标注和批改时我自己加上的,以便今后查阅. 语音信号处理之(四)梅尔频率倒谱系数(MFCC) [email protected] http://blog.csdn.net/zouxy09 在任意一个Automatic speech recogniti

音频特征提取——librosa工具包使用

作者:桂. 时间:2017-05-06  11:20:47 链接:http://www.cnblogs.com/xingshansi/p/6816308.html 前言 本文主要记录librosa工具包的使用,librosa在音频.乐音信号的分析中经常用到,是python的一个工具包,这里主要记录它的相关内容以及安装步骤,用的是python3.5以及win8.1环境. 一.MIR简介 音乐信息检索(Music information retrieval,MIR)主要翻译自wikipedia. M

音频自动增益 与 静音检测 算法 附完整C代码

前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. 不过在项目实测的时候,其实真的很难定标准, 到底在什么样的环境下,要增大音量,还是降低. 在通讯行业一般的做法就是采用静音检测, 一旦检测为静音或者噪音,则不做处理,反之通过一定的策略进行处理. 这里就涉及到两个算法,一个是静音检测,一个是音频增益. 增益其实没什么好说的,类似于数据归一化拉伸的做法. 静音检

音频自动增益 与 静音检测 算法 附完整C代码【转】

转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. 不过在项目实测的时候,其实真的很难定标准, 到底在什么样的环境下,要增大音量,还是降低. 在通讯行业一般的做法就是采用静音检测, 一旦检测为静音或者噪音,则不做处理,反之通过一定的策略进行处理. 这里就涉及到