MFCC Python:librosa、python_speech_features、tensorflow.signal 的结果完全不同

2024-01-12

我正在尝试从音频(.wav 文件)中提取 MFCC 特征,并且我已经尝试过python_speech_features and librosa但他们给出了完全不同的结果:

audio, sr = librosa.load(file, sr=None)

# librosa
hop_length = int(sr/100)
n_fft = int(sr/40)
features_librosa = librosa.feature.mfcc(audio, sr, n_mfcc=13, hop_length=hop_length, n_fft=n_fft)

# psf
features_psf = mfcc(audio, sr, numcep=13, winlen=0.025, winstep=0.01)

下面是图:

librosa: enter image description here

python_speech_features: enter image description here

我是否为这两种方法传递了错误的参数?为什么这里会有这么大的差异呢?

Update:我也尝试过tensorflow.signal实现,结果如下:

该图本身更接近 librosa 中的图,但比例更接近 python_speech_features。 (请注意,这里我计算了 80 个梅尔 bin,并取了前 13 个;如果我仅使用 13 个 bin 进行计算,结果看起来也完全不同)。代码如下:

stfts = tf.signal.stft(audio, frame_length=n_fft, frame_step=hop_length, fft_length=512)
spectrograms = tf.abs(stfts)

num_spectrogram_bins = stfts.shape[-1]
lower_edge_hertz, upper_edge_hertz, num_mel_bins = 80.0, 7600.0, 80
linear_to_mel_weight_matrix = tf.signal.linear_to_mel_weight_matrix(
    num_mel_bins, num_spectrogram_bins, sr, lower_edge_hertz, upper_edge_hertz)
mel_spectrograms = tf.tensordot(spectrograms, linear_to_mel_weight_matrix, 1)
mel_spectrograms.set_shape(spectrograms.shape[:-1].concatenate(linear_to_mel_weight_matrix.shape[-1:]))

log_mel_spectrograms = tf.math.log(mel_spectrograms + 1e-6)
features_tf = tf.signal.mfccs_from_log_mel_spectrograms(log_mel_spectrograms)[..., :13]
features_tf = np.array(features_tf).T

我想我的问题是:哪个输出更接近 MFCC 的实际情况?


这里至少有两个因素在起作用,可以解释为什么会得到不同的结果:

  1. 梅尔等级没有单一的定义。Librosa实现方式有两种:Slaney https://engineering.purdue.edu/~malcolm/interval/1998-010/ and HTK http://htk.eng.cam.ac.uk/。其他包可能会并且will使用不同的定义,会导致不同的结果。话虽这么说,总体情况应该是相似的。这引出了我们的第二个问题......
  2. python_speech_features默认情况下将能量作为第一个(索引零)系数(appendEnergy is True默认情况下),这意味着当您要求例如13 MFCC,您实际上得到 12 + 1。

换句话说,你没有比较 13librosa vs 13 python_speech_features系数,而是 13 与 12。能量可以具有不同的量值,因此由于不同的色阶而产生完全不同的图像。

我现在将演示这两个模块如何产生相似的结果:

import librosa
import python_speech_features
import matplotlib.pyplot as plt
from scipy.signal.windows import hann
import seaborn as sns

n_mfcc = 13
n_mels = 40
n_fft = 512 
hop_length = 160
fmin = 0
fmax = None
sr = 16000
y, sr = librosa.load(librosa.util.example_audio_file(), sr=sr, duration=5,offset=30)

mfcc_librosa = librosa.feature.mfcc(y=y, sr=sr, n_fft=n_fft,
                                    n_mfcc=n_mfcc, n_mels=n_mels,
                                    hop_length=hop_length,
                                    fmin=fmin, fmax=fmax, htk=False)

mfcc_speech = python_speech_features.mfcc(signal=y, samplerate=sr, winlen=n_fft / sr, winstep=hop_length / sr,
                                          numcep=n_mfcc, nfilt=n_mels, nfft=n_fft, lowfreq=fmin, highfreq=fmax,
                                          preemph=0.0, ceplifter=0, appendEnergy=False, winfunc=hann)

正如您所看到的,比例不同,但整体图片看起来非常相似。请注意,我必须确保传递给模块的许多参数是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFCC Python:librosa、python_speech_features、tensorflow.signal 的结果完全不同 的相关文章

随机推荐

  • iOS App场景下的安全密钥,安全吗?

    我试图隐藏我在一个应用程序中使用的 2 个秘密 据我了解 钥匙串是一个好地方 但在提交应用程序之前我无法添加它们 我想到了这个场景 通过将秘密传播到其他实体中以掩盖它们 将秘密预先播种到我的应用程序的 CoreData 数据库中 我在该应用
  • joomla模块开发与表单-如何处理

    我正在创建一个简单的 Joomla 2 5 模块 它将有一个 html 表单 mod mymodule tmpl default php
  • 不使用 sort 方法按字母顺序对数组进行排序

    我一直在学习 Chris Pine 的 Ruby 教程 目前正在研究一种无需使用即可对名称数组进行排序的方法sort 我的代码如下 它工作完美 但比我想象的更进一步 puts Please enter some names name get
  • 数组对象是否显式包含索引?

    从学习 Java 的第一天起 各种网站和许多老师就告诉我 数组是连续的内存位置 可以存储指定数量的相同类型的数据 由于数组是一个对象 并且对象引用存储在堆栈中 而实际对象位于堆中 因此对象引用指向实际对象 但是当我遇到如何在内存中创建数组的
  • 如何使用 AWS SAM 启用 CORS

    我正在尝试在我的 AWS SAM 应用程序中启用 CORS 这是我的片段template yaml Globals Api Cors AllowMethods AllowHeaders AllowOrigin Resources MyApi
  • Firebase 动态链接生成器中的 DFL 参数

    我需要使用 Android 上的 Dynamic Link Builder API 以编程方式构建动态链接 https firebase google com docs dynamic links android create https
  • 即使以管理员身份登录也无法删除文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 请有人告诉我我做错了什么 我正在尝试通过命令行删除隐藏文件夹 我以管理员身份运行命令行 但仍然收到消息访问权限不足 这是我的命令行的屏幕截
  • 是否可以以编程方式配对 Android 蓝牙设备?

    目前我正在使用 backport android bluetooth2 jar 文件与 Android 1 5 进行蓝牙编程 每当设备配对失败时 它都会填充 passKey 的警报对话框 如果我给出 passkey 那么在我的日志中我会收到
  • Android 调试监视器层次结构视图未显示

    我正在尝试在 ADM 中连接我的应用程序 但不幸的是层次结构视图未显示 我应该如何将我的应用程序连接到 ADM 工具 设备 Nexus 4 操作系统 4 3 3 Error 2014 02 06 13 00 14 hierarchyview
  • Visual C++ 和 *nix 环境下的编译差异

    在 nix 环境和 MS Visual C 环境中编译项目有区别吗 例如 Visual C 中有一个 stdafx h 文件 我问的原因是我提交了一段用g 编译的代码 重构mycode com http refactormycode com
  • Mac 上 -dpkg 的替代品是什么?

    我正在尝试使用 dpkg 命令 但在 Mac OS X 中它似乎对我不起作用 dpkg scanpackages m dev null gt Packages bash dpkg command not found dns Administ
  • Java:将格式化的xml文件转换为一行字符串

    我有一个格式化的 XML 文件 我想将其转换为一行字符串 我该怎么做 示例 XML
  • Delphi 'AND' 评估有 2 个条件

    我不得不选择 Delphi 来完成我最近正在做的一项合同工作 我希望有人澄清的一件事是条件语句中逻辑的执行 例如if 我有 C C 和这些语言的背景 一旦if已知语句失败 其余逻辑不会执行 例如 if somefunc FALSE anot
  • 如何检测设备的移动?

    我想检测像 Moo Box 这样的运动 我反转手机 当我将其转回时 它会触发一个动作 对于安卓 什么是最好的方法 可以自定义事件监听器 你看过吗传感器管理器 http developer android com reference andr
  • 如何在 R 中使用 as.Date() 格式化我的日期?

    我有一个如下所示的数据集 Date AE AA AEF Percent 1 1 2012 1211 1000 3556 0 03 1 2 2012 100 2000 3221 0 43 1 3 2012 3423 10000 2343 0
  • asp mvc 默认应用程序生成删除空格

    因此 当生成一个 mvc 项目时 它具有默认的母版页和部分视图 例如注册和登录视图 问题是 生成的母版页在页面左侧和右侧具有默认的空白 我的问题是 边距空间代码写在哪里以及如何删除它 虽然看起来很简单 但我似乎找不到它 Site css 保
  • 类型推断在具有静态成员约束的泛型类型上失败

    我定义了以下类型 从代码简化 type Polynomial lt a when a static member public Zero a and a static member a a gt a and a static member
  • MATLAB 搜索元胞数组中的字符串子集

    我试图在 MATLAB 的元胞数组中查找子字符串出现的位置 下面的代码可以工作 但是相当难看 在我看来应该有一个更简单的解决方案 cellArray these are some nicewords and some morewords w
  • 无可用来源

    我不确定发生了什么或者我是否做了什么 现在 每当我尝试调试时 它都会说所有 BCL 内容都没有可用的源代码 例如 在 debug print 上我收到该消息 定位源 f dd ndp fx src CompMod System Diagno
  • MFCC Python:librosa、python_speech_features、tensorflow.signal 的结果完全不同

    我正在尝试从音频 wav 文件 中提取 MFCC 特征 并且我已经尝试过python speech features and librosa但他们给出了完全不同的结果 audio sr librosa load file sr None l