承上一篇:python:audioFlux 使用教程
XXCC: 倒譜系數,支持所有頻譜類型. 可以提取梅爾頻率倒譜系數(MFCC)
? ? Cepstrum coefficients, supports all spectrum types.
以下是使用?audioflux
?庫中?XXCC
?類計算倒譜系數(如 MFCC)的示例代碼
代碼說明:
- 音頻讀取:使用?
af.utils.sample_path('220')
?獲取一個 220Hz 的音頻文件路徑,然后使用?af.read
?函數讀取音頻數據和采樣率。 - 頻譜圖提取:創建?
BFT
?對象,設置參數并調用?bft
?方法提取 mel 頻譜圖,最后取絕對值得到幅度譜。 - MFCC 提取:創建?
XXCC
?對象,設置時間長度,然后調用?xxcc
?方法提取 MFCC 特征。 - 可視化:使用?
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()
?關鍵說明
-
BFT 類的作用:
用于生成梅爾頻譜(Mel Spectrogram),作為?XXCC
?的輸入。參數?radix2_exp=12
?表示 FFT 窗口大小為?2^12=4096
。 -
XXCC 參數配置:
-
num
?必須與?BFT
?的?num
?一致(梅爾濾波器數量)。 -
必須調用?
set_time_length
?設置時間維度長度(對應頻譜的幀數)。
-
-
輸出維度:
mfcc_arr
?的維度為?(cc_num, time)
,與標準 MFCC 一致。 -
擴展功能:
使用?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)。