You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python为从音频提取的各MFCC系数生成直方图

为每个MFCC系数生成直方图的实现方法

Librosa提取的mfcc_coeff形状为(n_mfcc, 帧数),每一行对应一个MFCC系数在所有帧上的取值。要实现类似Matlab的直方图效果,我们可以用matplotlib对每一行数据单独绘制直方图,具体步骤如下:

实现代码

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

# 参数设置与音频生成
rate = 44100    # 采样率
T = 1           # 音频时长(秒)
f = 440.0       # 音频频率(Hz)
t = np.linspace(0, T, int(T*rate), endpoint=False)
x = np.sin(2*np.pi * f * t)
wavio.write("sine.wav", x, rate, sampwidth=3)

# 加载音频并提取MFCC特征
y, sr = librosa.load('sine.wav')
mfcc_coeff = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40)

# 绘制每个MFCC系数的直方图
n_mfcc = mfcc_coeff.shape[0]
rows = 8  # 子图行数
cols = 5  # 子图列数

plt.figure(figsize=(15, 20))  # 设置画布尺寸
for i in range(n_mfcc):
    plt.subplot(rows, cols, i+1)
    # 提取当前系数的所有帧数据并转为一维数组
    coeff_data = mfcc_coeff[i, :].flatten()
    # 绘制直方图,设置分箱数、颜色与边框
    plt.hist(coeff_data, bins=30, color='skyblue', edgecolor='black')
    plt.title(f'MFCC 系数 {i+1}')
    plt.xlabel('系数值')
    plt.ylabel('帧数')

# 自动调整子图间距,避免标签重叠
plt.tight_layout()
plt.show()

关键细节说明

  • mfcc_coeff[i, :].flatten():将第i个MFCC系数的多帧数据转为一维数组,满足直方图的输入要求
  • plt.subplot(rows, cols, i+1):按网格布局定位到对应子图(子图索引从1开始)
  • plt.tight_layout():自动调整子图的间距和尺寸,防止标题、坐标轴标签相互遮挡

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:18:38