python: audioFlux XXCC 提取梅尔频率倒谱系数 MFCC

承上一篇:python:audioFlux 使用教程

XXCC: 倒谱系数,支持所有频谱类型. 可以提取梅尔频率倒谱系数(MFCC)
    Cepstrum coefficients, supports all spectrum types.

以下是使用 audioflux 库中 XXCC 类计算倒谱系数(如 MFCC)的示例代码

代码说明:

  1. 音频读取:使用 af.utils.sample_path('220') 获取一个 220Hz 的音频文件路径,然后使用 af.read 函数读取音频数据和采样率。
  2. 频谱图提取:创建 BFT 对象,设置参数并调用 bft 方法提取 mel 频谱图,最后取绝对值得到幅度谱。
  3. MFCC 提取:创建 XXCC 对象,设置时间长度,然后调用 xxcc 方法提取 MFCC 特征。
  4. 可视化:使用 fill_spec 函数将 MFCC 特征可视化,并添加颜色条。

编写示例 audio_xxcc.py  如下

# -*- coding: utf-8 -*-
""" XXCC: 倒谱系数,支持所有频谱类型. 提取梅尔频率倒谱系数(MFCC)
    Cepstrum coefficients, supports all spectrum types.
"""
import audioflux as af
import numpy as np
import matplotlib.pyplot as plt
from audioflux.type import SpectralFilterBankScaleType, SpectralDataType, CepstralRectifyType
from audioflux.display import fill_spec

# 获取一个 220Hz 的音频文件
sample_path = af.utils.sample_path('220')
print(sample_path)
# 读取音频文件
audio_arr, sr = af.read(sample_path)

# 创建 BFT 对象并提取 mel 梅尔频谱
num = 128
bft_obj = af.BFT(
    num=num,
    radix2_exp=12,
    samplate=sr,
    scale_type=SpectralFilterBankScaleType.MEL, # 梅尔刻度
    data_type=SpectralDataType.POWER # 使用功率谱
)
spec_arr = bft_obj.bft(audio_arr)
spec_arr = np.abs(spec_arr) # 取绝对值,确保数据为实数

# 初始化 XXCC对象
xxcc_obj = af.XXCC(num=bft_obj.num)
# 设置时间长度
xxcc_obj.set_time_length(time_length=spec_arr.shape[1])

# 提取 XXCC 特征
cc_num = 13 # 提取的XXCC系数数量
mfcc_arr = xxcc_obj.xxcc(spec_arr, cc_num=13, rectify_type=CepstralRectifyType.LOG)

# 可视化
audio_len = audio_arr.shape[0]
x_coords = bft_obj.x_coords(audio_len)
fig, ax = plt.subplots(figsize=(10, 6))
img = fill_spec(
    mfcc_arr,
    axes=ax,
    x_coords=x_coords,
    x_axis='time',
    title='MFCC via XXCC'
)
fig.colorbar(img, ax=ax)
plt.show()

 关键说明

  1. BFT 类的作用
    用于生成梅尔频谱(Mel Spectrogram),作为 XXCC 的输入。参数 radix2_exp=12 表示 FFT 窗口大小为 2^12=4096

  2. XXCC 参数配置

    • num 必须与 BFT 的 num 一致(梅尔滤波器数量)。

    • 必须调用 set_time_length 设置时间维度长度(对应频谱的帧数)。

  3. 输出维度
    mfcc_arr 的维度为 (cc_num, time),与标准 MFCC 一致。

  4. 扩展功能
    使用 xxcc_standard 方法可提取带能量项和一阶/二阶差分的 MFCC:

energy_arr = np.sum(spec_arr, axis=0)  # 计算频谱能量
coe_arr, delta1, delta2 = xxcc_obj.xxcc_standard(
    spec_arr,
    energy_arr,
    cc_num=13,
    delta_window_length=9
)

常见问题

  • 输入数据类型:频谱需为实数(np.abs 处理后的功率谱或幅度谱)。

  • 多通道支持:若音频为多通道,需分别处理每个通道的频谱。

  • 参数调优:调整 cc_num 可控制系数数量(如 20 或 40 维 MFCC)。


以下是使用 audioflux 库的 XXCC 类计算 MFCC + 一阶差分(Delta) + 二阶差分(Delta-Delta) 并可视化绘图的完整示例:

# -*- coding: utf-8 -*-
""" XXCC: 倒谱系数,支持所有频谱类型. 提取梅尔频率倒谱系数(MFCC)
    Cepstrum coefficients, supports all spectrum types.
  计算 MFCC + 一阶差分(Delta)+ 二阶差分(Delta-Delta)并可视化绘图的示例
"""
import audioflux as af
import numpy as np
import matplotlib.pyplot as plt
from audioflux.type import CepstralEnergyType, CepstralRectifyType
from audioflux.type import SpectralFilterBankScaleType, SpectralDataType
from audioflux.display import fill_spec

# 读取音频
sample_path = af.utils.sample_path('220')
audio_arr, sr = af.read(sample_path)
print('sample_rate:', sr)

# 生成梅尔频谱
num = 128  # Mel滤波器数量
bft_obj = af.BFT(
    num=num,
    radix2_exp=12, # FFT窗口大小:2^12=4096
    samplate=sr,
    scale_type=SpectralFilterBankScaleType.MEL,
    data_type= SpectralDataType.POWER
)
spec_arr = bft_obj.bft(audio_arr)  # 计算频谱
spec_arr = np.abs(spec_arr)        # 转换为幅度谱

# 计算能量(每个时间帧的频谱能量总和)
energy_arr = np.sum(spec_arr, axis=0)  # shape=(time_frames,)

# 初始化XXCC对象
xxcc_obj = af.XXCC(num=bft_obj.num)
xxcc_obj.set_time_length(time_length=spec_arr.shape[1]) # 设置时间维度长度

# 计算MFCC及其一阶、二阶差分
cc_num = 13
delta_window_length = 9  # 必须为奇数且>=3
coe_arr, delta1_arr, delta2_arr = xxcc_obj.xxcc_standard(
    m_data_arr=spec_arr,
    energy_arr=energy_arr,
    cc_num=cc_num,
    delta_window_length=delta_window_length,
    energy_type= CepstralEnergyType.REPLACE,  # 用能量替换第0阶系数
    rectify_type=CepstralRectifyType.LOG
)

# 生成时间轴坐标
audio_len = audio_arr.shape[0]
x_coords = bft_obj.x_coords(audio_len)

# 可视化:绘制MFCC、Delta、Delta-Delta
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 10), sharex=True)

# 绘制MFCC
img1 = fill_spec(
    coe_arr,
    axes=ax1,
    x_coords=x_coords,
    x_axis='time',
    title='MFCC Coefficients (with Energy)'
)
fig.colorbar(img1, ax=ax1, label='Amplitude')

# 绘制一阶差分(Delta)
img2 = fill_spec(
    delta1_arr,
    axes=ax2,
    x_coords=x_coords,
    x_axis='time',
    title='Delta (1st derivative)'
)
fig.colorbar(img2, ax=ax2, label='Amplitude')

# 绘制二阶差分(Delta-Delta)
img3 = fill_spec(
    delta2_arr,
    axes=ax3,
    x_coords=x_coords,
    x_axis='time',
    title='Delta-Delta (2nd derivative)'
)
fig.colorbar(img3, ax=ax3, label='Amplitude')

plt.tight_layout()
plt.show()

关键代码解释

1. 能量计算
energy_arr = np.sum(spec_arr, axis=0)
  • 计算每个时间帧的频谱总能量,作为 xxcc_standard 的输入参数。

  • spec_arr 的维度为 (num_mel_bins, time_frames),沿 axis=0 求和得到 (time_frames,)

2. 调用 xxcc_standard 方法
  • energy_type=REPLACE:用能量值替换 MFCC 的第0阶系数(类似Librosa的默认行为)。

  • delta_window_length=9:控制差分计算的窗口大小(必须为奇数,通常用9或5)。

3. 可视化布局

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 10), sharex=True)

  • 使用3个子图垂直排列,共享X轴(时间轴),便于对比观察时域变化。

输出效果

  • MFCC Coefficients:包含能量项的基本MFCC系数。

  • Delta:一阶差分,反映MFCC系数在时间上的变化率。

  • Delta-Delta:二阶差分,反映变化率的变化(加速度信息)。


 

参数调优建议

  1. Delta窗口大小 (delta_window_length):

    • 较大的窗口(如9)平滑噪声但降低时间分辨率。

    • 较小的窗口(如5)保留细节但对噪声敏感。

  2. 能量处理方式 (energy_type):

    • REPLACE:用能量替换第0阶系数(兼容传统MFCC)。

    • APPEND:将能量作为额外的一维追加到MFCC末尾。

  3. Mel滤波器数量 (num=128):

    • 增加数量可提高频率分辨率,但可能引入冗余。

通过此示例,你可以直接提取完整的MFCC动态特征(静态系数+动态差分),适用于语音识别、音乐分类等任务。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值