【常用音频处理】hpcp/mfcc/fbank特征提取总结

一、音频加载

1、加载单通道音频

  • 采用 essentia库
import essentia.standard as estd
audio = estd.MonoLoader(filename=in_file, sampleRate=sr)()
  • 使用Librosa库加载音频文件并转换为单声道
import librosa
audio, sr = librosa.load('audio.wav', sr=None, mono=True)

二、音频特征提取

1、hpcp特征概述

HPCP(Harmonic Pitch Class Profile)是一种用于音频信号的音高特征提取方法,它可以捕捉音频中的音调信息。下面是一种常见的HPCP特征提取过程:

  • 预处理:首先,加载音频文件并将其转换为单声道(mono)信号。通常使用采样率为44.1kHz或48kHz进行音频采样。

  • 短时傅里叶变换(Short-time Fourier Transform,STFT):将音频信号分割成短时间窗口,每个窗口内的信号进行傅里叶变换。这样可以在频域上获得每个时间窗口内的频谱信息。

  • 平滑化:对STFT结果应用平滑化技术,例如对每个频率带内的幅度进行平均,以减少频谱中的噪音和波动。

  • 谐波计算:在每个频率带上,检测主要谐波成分,并计算其能量或幅度。常用的方法是通过计算离散傅里叶变换(Discrete Fourier Transform,DFT)来获取频率的基频和谐波。

  • 按音高分类:根据音高将每个频率带的能量或幅度归类到相应的音高类别中。音高类别通常使用12个半音(C、C#、D、…、B)来表示。

  • 归一化:对每个音高类别内的能量或幅度进行归一化处理,例如将其除以总能量或幅度的和,以消除不同音频之间的音量变化影响。

  • 构建HPCP特征向量:将归一化后的各音高类别的能量或幅度按顺序连接起来,形成最终的HPCP特征向量。该向量表示了音频信号中不同音高成分的相对强度。

HPCP特征提取方法可以帮助识别音乐中的旋律和和声信息,在许多音频处理任务中得到广泛应用,例如音频分类、音乐信息检索、音轨识别等。具体实现时,可以使用相关的音频处理库或工具,如Librosa、Essentia等,它们提供了方便的函数和方法来提取HPCP特征。

2、python实现hpcp特征提取

  • 采用essentia库实现hpcp特征提取,输出的维度是[101, 48]
from essentia.pytools.spectral import hpcpgram
hpcp = hpcpgram(audio, sampleRate=16000, numBins=48, frameSize=1600, hopSize=1600, whitening=True)
np.save("1.npy", hpcp) # 保存为numpy格式

参数解释:

  • audio:这是要计算HPCP(Harmonic Pitch Class Profile)的音频数据。它是一个包含音频信号的数组或矩阵。

  • sampleRate:音频的采样率。它表示每秒采集的样本数,该参数用于确定音频中的时间信息。

  • numBins:HPCP的维度或特征向量的长度。它表示将音频频谱划分为多少个频率区间。较高的值会导致更详细的频谱表示,但也会增加计算复杂性。

  • frameSize:每个帧(frame)的大小,通常以采样点数表示。它确定了在计算HPCP时应考虑的音频片段的长度。较大的帧大小可以提供更长的时间窗口,以获取更全局的频谱信息。

  • hopSize:帧之间的跳跃大小,通常以采样点数表示。它决定了相邻帧之间的重叠程度。较小的跳跃大小可以提供更高的时间分辨率,但也可能导致计算量增加。

  • whitening:是否进行白化(Whitening)处理。白化是一种统计预处理技术,用于减少特征之间的相关性。通过对音频数据进行白化,可以增加特征的独立性。

3、mfcc特征概述

MFCC(Mel-frequency cepstral coefficients)是一种常用的音频特征表示方法,主要用于语音和音频处理任务。它通过将音频信号转换为梅尔刻度的频谱,并在该频谱上应用倒谱分析来提取特征。

下面是MFCC特征提取的概述:

  • 预处理:首先,加载音频文件并将其转换为单声道(mono)信号。通常使用采样率为44.1kHz或48kHz进行音频采样。

  • 分帧:将音频信号分成短时窗口,每个窗口内包含几十至几百个采样点。常见的窗口大小为20-40毫秒,可以根据需求进行调整。

  • 加窗:对每个窗口内的采样点应用加窗函数(如汉明窗、矩形窗等),以平滑边界并减少频谱泄漏。

  • 傅里叶变换:对加窗后的每个窗口应用快速傅里叶变换(Fast Fourier Transform,FFT),将时域信号转换为频域信号。

  • 梅尔滤波器组:设计一组梅尔滤波器,将线性频谱转换为梅尔刻度频谱。梅尔刻度能更好地模拟人类听觉系统对音高的感知。

  • 梅尔频谱:将每个频率带内的幅度值相加,得到梅尔刻度频谱。这样可以减少频谱的维度,并提取出与人类听觉感知密切相关的音高信息。

  • 对数压缩:对梅尔刻度频谱进行对数转换,以增强低能量部分,并减小高能量部分的动态范围。

  • 倒谱分析:对对数压缩后的梅尔频谱应用倒谱变换,得到MFCC系数。倒谱分析可以捕捉音频信号的时序特征,并消除不同说话人和环境的影响。

  • 特征处理:通常会对MFCC系数进行一些额外的处理,例如去除第一个系数(能量项),进行差分运算(求取一阶、二阶差分)等,以提取更丰富的时序和动态特征。

最终,MFCC特征被表示为一个向量,其中每个元素代表一个MFCC系数。这些特征在许多语音识别、语音合成、说话人识别等语音和音频处理任务中得到广泛应用。在实际实现中,可以使用许多音频处理库或工具,如Librosa、Kaldi等,它们提供了方便的函数和方法来提取MFCC特征。

4、python实现mfcc特征提取

  • 使用Librosa库来实现MFCC特征提取
import librosa

# 加载音频文件
audio, sr = librosa.load('audio.wav', sr=None, mono=True)

# 提取MFCC特征
mfcc = librosa.feature.mfcc(y=audio, sr=sr)

# 打印MFCC特征向量的形状
print(mfcc.shape)
  • 使用Essentia库实现MFCC特征提取
import essentia.standard as es

# 创建MFCC特征提取器
mfcc_extractor = es.MFCC()

# 加载音频文件
audio = es.MonoLoader(filename='audio.wav')()

# 提取MFCC特征
mfcc = mfcc_extractor(audio)

# 打印MFCC特征向量的形状
print(mfcc.shape)
  • 返回一个包含MFCC系数的二维数组:其中第一维度表示时间帧数,第二维度表示MFCC系数的数量。更多可以参考Essentia官方文档(https://essentia.upf.edu/documentation/)

5、fbank特征提取

FBank(Filter Bank特征)是一种常用的音频特征提取方法,用于语音识别和音频处理领域。它主要通过对音频信号进行滤波和能量计算来提取特征。以下是FBank特征提取的概述:

预加重:为了平衡音频信号中低频和高频分量的能量差异,通常在进行FBank特征提取之前,会对音频信号进行预加重,即对信号进行高通滤波,在时域上增强高频成分。

分帧:将音频信号分成短时片段,每个片段通常包含20-40毫秒的音频数据。这样做是为了将音频信号切割成较短的局部区域,以便更好地捕捉音频的短时特征。

加窗:对每个帧应用窗函数(如汉明窗、海明窗等),以减少帧之间的不连续性,避免频谱泄漏问题。

快速傅里叶变换(FFT):对每个窗口帧进行快速傅里叶变换,将时域信号转换为频域信号。

梅尔滤波器组:将频域信号通过一组梅尔滤波器进行滤波,这些滤波器在不同频率范围内具有不同的通带和阻带特性。滤波器的数量一般为20-40个,覆盖了人耳感知的重要频率区域。

能量计算:对每个滤波器输出的信号进行平方运算,并累加得到能量值。这样可以捕获不同频率范围内的能量信息。

对数操作:对能量值进行对数运算,以模拟人耳对声音的非线性感知,同时将能量映射到更大的动态范围内。

DCT变换:对经过对数运算的能量值应用离散余弦变换(DCT),得到最终的FBank特征向量。

FBank特征提取方法能够捕捉音频信号的频谱能量分布,适用于语音识别、声纹识别、音乐处理等领域,常被用作音频信号的输入特征。

python实现mfcc特征提取:

import librosa

# 1. 加载音频文件
audio, sr = librosa.load('your_audio.wav', sr=None)

# 2. 提取FBank特征
fbank_features = librosa.feature.melspectrogram(y=audio, sr=sr, n_mels=40, hop_length=160, n_fft=400, window='hamming')

# 3. 取对数操作
fbank_features = librosa.power_to_db(fbank_features, ref=np.max)

# 输出结果
print(fbank_features.shape)  # 打印特征的维度
print(fbank_features)  # 打印提取的FBank特征向量

6、mfcc/fbank特征提取区别

MFCC(Mel频率倒谱系数)和FBank(Filter Bank特征)是两种常用的音频特征提取方法,用于语音识别和音频处理领域。它们有以下区别:

原理:MFCC使用梅尔滤波器组将音频信号从时域转换到频域,并使用离散余弦变换(DCT)将频谱变换为倒谱系数。而FBank直接使用梅尔滤波器组对音频信号进行滤波,并计算每个滤波器输出的能量或幅度。

特征维度:MFCC通常具有较高的维度,一般选择前13个、或更多的倒谱系数作为特征。而FBank的维度通常比MFCC低,一般选择一些关键滤波器输出的能量或幅度作为特征。

非线性操作:在梅尔滤波器组之后,MFCC还应用了对数压缩操作,将能量转换为对数刻度。这样做的目的是模拟人耳对声音的非线性感知。而FBank没有对能量进行对数压缩。

应用领域:由于MFCC考虑了人耳感知的特性,因此在语音识别和语音处理领域被广泛使用。FBank则更常用于声音信号处理、语音活动检测等任务。

7、hpcp应用在音乐场景的原因

在音乐处理领域,常用HPCP(Harmonic Pitch Class Profile)的原因有以下几点:

音乐的调性分析:HPCP能够提取出音频信号中不同音高的信息,并将其表示为一个向量。这使得它非常适合用于音乐的调性分析,例如判断音乐的主调、和弦进行等。

音乐相似性比较:HPCP可以将不同音频片段或音乐曲目转换为具有相同维度的特征向量,从而可以对它们进行直接比较。这使得它可用于音乐相似性计算、音乐检索等任务。

节奏和韵律分析:除了音高信息,HPCP还能够提供节奏和韵律方面的信息,因为它对于不同频率的声音包络也具有一定程度的敏感性。这使得它在节奏和韵律分析、节拍检测等应用中非常有用。

实时处理:HPCP的计算相对简单且实时性较好,因此在需要实时处理音乐信号的应用中,如音乐生成、音乐交互等方面,HPCP被广泛应用。

总而言之,HPCP在音乐处理方面常被使用,因为它能够提取音频信号的音高、节奏和韵律等信息,并将其转化为易于处理和比较的特征表示形式。

三、音频归一化

音频归一化是将音频的响度(音量)调整到一个统一的标准级别,常用于音频处理、音乐制作和语音识别等领域。以下是一些常见的音频归一化方法:

  • 峰值归一化(Peak Normalization):该方法通过找到音频信号的最高峰值,并将整个信号按比例缩放,使最高峰值达到目标值。这种方法简单易行,可以使用绝对峰值或相对峰值进行归一化。

  • 均方根归一化(RMS Normalization):该方法计算音频信号的均方根(RMS),即平方根的平均值,然后将整个信号按比例缩放,使其RMS达到目标值。均方根归一化通常能更好地保持音频的动态范围。

  • LUFS/LKFS归一化(Loudness Normalization):LUFS(Loudness Units Full Scale)或LKFS(Loudness K-weighted Full Scale)是一种基于人耳感知的音频响度测量单位。该方法通过测量音频信号的响度并根据预设的目标响度水平来调整音频信号的增益,以实现归一化。

以Peak Normalization为例,可以使用Python中的音频处理库来进行操作。下面是一个示例代码,使用librosa库来实现峰值归一化:

import librosa

def normalize_audio_peak(audio_path, target_peak):
    # 读取音频文件
    audio, sr = librosa.load(audio_path)

    # 计算音频的当前峰值
    current_peak = max(abs(audio))

    # 计算缩放系数
    scale = target_peak / current_peak

    # 对音频应用缩放系数
    normalized_audio = audio * scale

    return normalized_audio

# 设置目标峰值为0.8(范围为0到1之间)
target_peak = 0.8

# 调用函数进行峰值归一化
normalized_audio = normalize_audio_peak('input.wav', target_peak)

# 将归一化后的音频保存为新文件
librosa.output.write_wav('normalized_output.wav', normalized_audio, sr)

四、音频格式转换

if (filename_extension == ".mp4") or (filename_extension == ".flv") or (filename_extension == ".wmv") :
    # ffmpeg -i sv_dabaicui_zhoushuyi_0.3.mp4 -f wav -vn sv_dabaicui_zhoushuyi_0.3.wav
    wav_file = "{}/{}_ffmpeg.wav".format(sv_dir_path, filename_shotname)
    os.system("ffmpeg -i {} -f wav -vn {}".format(filename_src, wav_file))
    data, sr = librosa.load(wav_file, sr=sample_rate)
    # save wav
    wav_sv = "{}/{}.wav".format(sv_dir_path, filename_shotname)
    sf.write(wav_sv, data, sample_rate, format='wav')
    os.system("rm {}".format(wav_file))
elif (filename_extension == ".mp3") or (filename_extension == ".wav") or (filename_extension == ".wma") :
    data, sr = librosa.load(filename_src, sr=sample_rate)
    # save wav
    wav_sv = "{}/{}.wav".format(sv_dir_path, filename_shotname)
    sf.write(wav_sv, data, sample_rate, format='wav')

五、音频融合

六、数据增强

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/131435714