1 常用的算法
https://www.kaggle.com/competitions/birdsong-recognition/discussion/172573
- MFCC (Mel-Frequency Cepstral Coefficients)
- Zero-crossing rate
- Energy
- Spectral roll-off
- Spectral flux
- Spectral entropy
- Chroma features (chromatogram), with Chroma vector and Chroma deviation considered to be the most important ones within this group
- Pitch
1.1 MFCC
MFCC算法(Mel Frequency Cepstral Coefficients,梅尔频率倒谱系数)是一种广泛应用于语音和音频处理领域的特征提取方法。它主要用于提取音频信号的特征,以便在诸如语音识别、音乐信息检索和音频分类等任务中使用。
MFCC算法的基本步骤如下:
- 预加重:对输入的音频信号进行预加重,以平衡频谱并强调高频部分。
- 分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
- 窗函数:对每个帧应用窗函数(如汉明窗),以减少帧边缘的频谱泄漏。
- 快速傅里叶变换(FFT):对每个帧进行FFT,以将信号从时域转换到频域。
- 梅尔滤波器组:将频谱通过梅尔滤波器组(Mel Filter Bank),以模拟人耳对频率的感知。梅尔滤波器组通常包含20-40个三角滤波器,它们在梅尔刻度上均匀分布。
- 对数能量:计算每个滤波器输出的对数能量。
- 离散余弦变换(DCT):对对数能量进行DCT,以提取倒谱系数。通常只保留前12-13个系数,因为它们包含了信号的主要信息。
这些步骤的结果是一组MFCC特征,它们可以用于训练
1.2 Zero-Crossing rate
Zero-crossing rate(零交叉率)是一种用于音频信号处理的特征提取方法。它表示在一个音频帧中,信号从正值变为负值或从负值变为正值的次数。零交叉率可以用于识别语音和音乐信号中的不同声音,例如辅音和元音,以及不同乐器的音色。
零交叉率算法的基本步骤如下:
- 分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
- 计算零交叉率:对于每个帧,计算信号从正值变为负值或从负值变为正值的次数。可以通过检查相邻样本的符号变化来实现。
这个函数接受一个音频帧(例如NumPy数组)作为输入,并返回该帧的零交叉率。你可以将这个函数应用到音频信号的所有帧上,以提取零交叉率特征。这些特征可以用于音频分类、语音识别等任务。
1.3 Energy 音频算法
Energy(能量)是音频信号处理中的另一种特征提取方法。它表示音频信号的振幅大小,可以用于识别信号中的不同声音,例如辅音和元音,以及不同乐器的音色。能量特征通常与其他特征(如MFCC和零交叉率)结合使用,以提高音频处理任务的性能。
计算音频能量的基本步骤如下:
- 分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
- 计算能量:对于每个帧,计算信号的平方和,然后取平均值。这表示了信号在该帧中的能量大小。
1.4 Spectral roll-off(谱滚降点)
Spectral roll-off(谱滚降点)是音频信号处理中的一种特征提取方法。它表示音频信号频谱中的一个特定点,该点之前的频率成分累积到了总能量的一定比例(通常为85%或90%)。谱滚降点可以用于识别音频信号中的不同声音,例如不同乐器的音色。谱滚降点特征通常与其他特征(如MFCC、零交叉率和能量)结合使用,以提高音频处理任务的性能。
计算音频谱滚降点的基本步骤如下:
分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
快速傅里叶变换(FFT):对每个帧进行FFT,以将信号从时域转换到频域。
计算谱滚降点:对于每个帧,找到一个频率点,使得该点之前的频率成分累积到了总能量的一定比例(例如85%或90%)。
1.5 Spectral flux(谱通量)
Spectral flux(谱通量)是音频信号处理中的一种特征提取方法。它表示音频信号频谱的变化程度,可以用于检测音频中的事件,例如音符的开始和结束。谱通量特征通常与其他特征(如MFCC、零交叉率、能量和谱滚降点)结合使用,以提高音频处理任务的性能。
计算音频谱通量的基本步骤如下:
- 分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
- 快速傅里叶变换(FFT):对每个帧进行FFT,以将信号从时域转换到频域。
- 计算谱通量:对于每对相邻帧,计算它们的频谱差值的平方和,然后取平均值。这表示了信号在这两帧之间的频谱变化程度。
1.6 Spectral entropy(谱熵)
Spectral entropy(谱熵)是音频信号处理中的一种特征提取方法。它表示音频信号频谱的复杂程度或不确定性,可以用于识别音频中的不同声音,例如不同乐器的音色。谱熵特征通常与其他特征(如MFCC、零交叉率、能量、谱滚降点和谱通量)结合使用,以提高音频处理任务的性能。
计算音频谱熵的基本步骤如下:
- 分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
- 快速傅里叶变换(FFT):对每个帧进行FFT,以将信号从时域转换到频域。
- 计算谱熵:对于每个帧,计算频谱的归一化能量分布,然后使用香农熵公式计算谱熵。
Chroma features(色度特征)
Chroma features(色度特征)是音频信号处理中的一种特征提取方法。它表示音频信号中的音高信息,可以用于识别音乐中的和声、旋律和音调。色度特征通常与其他特征(如MFCC、零交叉率、能量、谱滚降点、谱通量和谱熵)结合使用,以提高音频处理任务的性能。
计算音频色度特征的基本步骤如下:
分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
快速傅里叶变换(FFT):对每个帧进行FFT,以将信号从时域转换到频域。
计算色度特征:将频谱映射到12个色度区间(代表12个半音),然后计算每个区间的能量。
1.7 Pitch
Pitch(音高)是音频信号处理中的一个重要概念,它表示音频信号中的基频。音高分析可以用于识别音乐中的旋律、和声和音调,以及语音信号中的说话者特征。有多种算法可以用于计算音频信号的音高,其中最常用的是自相关法(ACF)和基于频域的YIN算法。
自相关法(ACF):自相关法通过计算音频信号与其自身的延迟版本之间的相似度来估计音高。基本步骤如下:
- 分帧:将音频信号分成短时帧,通常每帧的长度为20-30ms,帧与帧之间有一定的重叠。
- 计算自相关:对于每个帧,计算信号与其延迟版本之间的自相关函数。
- 寻找最大值:在自相关函数中找到第一个局部最大值,其对应的延迟即为基频周期。
- 计算音高:将基频周期转换为音高(单位:赫兹)。
2. Wav2Vec和Wav2Vec2
对于音频任务, Hugging Face 提供了使用 Wav2Vec2 模型, Wav2Vec2 是一个基于自监督学习的音频特征提取器,可以从原始音频信号中提取有意义的特征。
Wav2Vec 是一种用于音频数据的自监督学习算法,主要用于从原始音频信号中提取有意义的特征表示。它是由 Facebook AI Research (FAIR) 开发的,旨在解决语音识别、音频分类等任务。Wav2Vec 的核心思想是通过学习音频数据的上下文结构来捕捉音频中的信息。
Wav2Vec 算法分为两个主要阶段:
- 预训练阶段:在这个阶段,Wav2Vec 通过自监督学习在大量无标签音频数据上进行训练。它使用一个卷积神经网络 (CNN) 编码器将原始音频波形转换为潜在特征表示。然后,它使用一个上下文网络(如 Transformer 或 LSTM)来捕捉这些特征表示中的上下文信息。通过最大化相邻特征之间的互信息,Wav2Vec 学习了音频数据的丰富表示。
- 微调阶段:在这个阶段,Wav2Vec 使用有标签数据进行微调,以解决特定的音频任务,如语音识别或音频分类。通常,这涉及在预训练的 Wav2Vec 模型上添加一个分类器,并使用有标签数据进行端到端训练。
Wav2Vec 的优势在于它能够从原始音频信号中学习有意义的特征表示,而无需手动设计特征提取器(如 MFCC 或 STFT)。这使得 Wav2Vec 能够在各种音频任务中取得优异的性能。
Wav2Vec 的后续版本,如 Wav2Vec 2.0,进一步改进了算法,提高了在音频任务上的性能。Wav2Vec 2.0 采用了类似 BERT 的自监督训练方法,通过掩码和预测音频片段来学习音频表示。这种方法使得 Wav2Vec 2.0 在许多音频任务上取得了更好的性能,包括自动语音识别 (ASR) 和音频分类。
要使用 Wav2Vec 或 Wav2Vec 2.0 提取音频特征并解决音频任务,您可以使用 Hugging Face Transformers 库。这个库提供了预训练的 Wav2Vec 和 Wav2Vec 2.0 模型,可以方便地进行微调和特征提取。
总之,Wav2Vec 算法为音频任务提供了一种强大的特征提取方法,通过自监督学习从原始音频信号中学习有意义的表示。这使得 Wav2Vec 可以在各种音频任务中取得优异的性能,如语音识别、音频分类等。
from transformers import Wav2Vec2FeatureExtractor, Wav2Vec2Model
import torchaudio
import torch
# Load the pre-trained Wav2Vec2 model
model = Wav2Vec2Model.from_pretrained("facebook/wav2vec2-base-960h")
feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("facebook/wav2vec2-base-960h")# Load an audio file
audio, sample_rate = torchaudio.load("path/to/your/audio/file.wav")# Resample the audio to 16kHzif sample_rate !=16000:
resampler = torchaudio.transforms.Resample(sample_rate,16000)
audio = resampler(audio)# Extract features using the feature_extractor
input_values = feature_extractor(audio.squeeze().numpy(), return_tensors="pt", sampling_rate=16000).input_values
# Get the embeddings from the modelwith torch.no_grad():
embeddings = model(input_values).last_hidden_state
# embeddings now contains the extracted features
这里,embeddings 变量包含了从音频文件中提取的特征。您可以使用这些特征来训练您自己的分类器或其他下游任务。
版权归原作者 junjian Li 所有, 如有侵权,请联系我们删除。