草庐IT

音频特征提取

junjian Li 2023-08-26 原文

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 16kHz
if 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 model
with torch.no_grad():
    embeddings = model(input_values).last_hidden_state

# embeddings now contains the extracted features

这里,embeddings 变量包含了从音频文件中提取的特征。您可以使用这些特征来训练您自己的分类器或其他下游任务。

有关音频特征提取的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  3. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  4. ruby - cucumber 特征和步骤定义 - 2

    我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA

  5. ruby - 如何在ruby中提取方括号内的内容 - 2

    我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和

  6. 用于从 Open3.popen3 标准输出中提取值的正则表达式 - 2

    如何获取外部命令的输出并从中提取值?我有这样的东西:stdin,stdout,stderr,wait_thr=Open3.popen3("#{path}/foobar",configfile)if/exit0/=~wait_thr.value.to_srunlog.puts("Foobarexitednormally.\n")puts"Testcompleted."someoutputvalue=stdout.read("TX.*\s+(\d+)\s+")puts"Outputvalue:"+someoutputvalueend我没有在标准输出上使用正确的方法,因为Ruby告诉我它不能

  7. ruby-on-rails - 特征未注册 : attribute name - 2

    完成这个有困难。我正在使用seed.rb+factory_girl来使用rakedb:seed填充数据库。(我知道固定装置存在,但我想以这种方式完成,这只是一个示例,数据库将填充复杂的关联对象。)我的种子.rb:require'factory_girl_rails'["QM","CDC","SI","QS"].eachdo|n|FactoryGirl.create(:grau,nome:n)end还有我的/factories/graus.rbFactoryGirl.definedofactory:graudonomeendend但是当我运行时:rakedb:seed我得到:rakeab

  8. ruby - 使用 Ruby CSV 提取一列 - 2

    我一直在尝试从csv文件中获取单个列。我已经阅读了文档,http://www.ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html但仍然不太了解如何使用它。如果我使用CSV.table,与CSV.read相比,响应速度非常慢。我承认我正在加载的数据集非常大,这正是我只想从中获取单个列的原因。我的请求目前看起来像这样@dataTable=CSV.table('path_to_csv.csv')当我调试时,我得到了的响应#ThedocumentationsaysIshouldbeabletouseby_col(),butwhenItrytooutpu

  9. ruby - 在 Ruby 中,如何从具有值的哈希中提取键 - 2

    当我写这篇文章时,我以为我是Ruby巨人:#havingthishashhash={'Portugal'=>1,'France'=>2,'USA'=>3}#country_idcomesfrominputcountry_name=(hash.select{|k,v|v==country_id.to_i}.first||[]).first它确实正确地提取了国家名称,如果找不到国家也不会失败。我对此非常满意。但是我的导师说它可以/应该在可读性、长度和性能方面进行优化!还有什么比这更清晰/更快的呢?请指教 最佳答案 嗯,看来你的导师是对的

  10. ruby-on-rails - 在 Ruby 中提取 IMG 标签 - 2

    是否可以从Ruby中的HTMLblock中提取IMG标签(或只是IMG标签的src属性)?例如,如果我有一个HTMLblock,例如:Loremipsumdolorsitamet,laboreetdoloremagnaaliqua.Duisauteiruredolorinreprehenderitinvoluptatevelitessecillumdoloreeufugiatnullapariatur.我可以通过正则表达式或其他方法只提取IMG标签或该IMG标签的src吗?提前感谢您的任何建议! 最佳答案 使用Nokogiri:re

随机推荐