特征提取器实用程序
此页面列出了音频`FeatureExtractor` 可以用来从原始音频中使用常见算法(如短时傅里叶变换或对数梅尔谱图)计算特殊特征的所有实用程序函数。
如果您正在研究库中音频处理器的代码,那么其中大多数仅有用。
音频转换
transformers.audio_utils.hertz_to_mel
< source >( freq: Union mel_scale: str = 'htk' ) → float
或 np.ndarray
将频率从赫兹转换为梅尔。
transformers.audio_utils.mel_to_hertz
< source >( mels: Union mel_scale: str = 'htk' ) → float
或 np.ndarray
将频率从梅尔转换为赫兹。
transformers.audio_utils.mel_filter_bank
< source >( num_frequency_bins: int num_mel_filters: int min_frequency: float max_frequency: float sampling_rate: int norm: Optional = None mel_scale: str = 'htk' triangularize_in_mel
参数
- num_frequency_bins (
int
) — 用于计算频谱图的频率数量(应与stft
中的一致)。 - num_mel_filters (
int
) — 生成的梅尔滤波器的数量。 - min_frequency (
float
) — 以Hz为单位的最低感兴趣频率。 - max_frequency (
float
) — 以Hz为单位的最高感兴趣频率。 这不应超过sampling_rate / 2
。 - sampling_rate (
int
) — 音频波形的采样率。 - norm (
str
, 可选) — 如果是"slaney"
,则将三角形梅尔权重除以梅尔频带的宽度(面积归一化)。 - mel_scale (
str
, 可选,默认为"htk"
) — 要使用的梅尔频率刻度,"htk"
、"kaldi"
或"slaney"
。 - triangularize_in_mel_space (
bool
, 可选,默认为False
) — 如果启用此选项,则三角形滤波器将应用于梅尔空间而不是频率空间。 为了获得与torchaudio
计算梅尔滤波器时相同的結果,这应该设置为true
。
返回值
np.ndarray
形状为 (num_frequency_bins
, num_mel_filters
)
三角形滤波器组矩阵。 这是一个从频谱图到梅尔频谱图的投影矩阵。
创建一个用于获得梅尔频谱图的频率箱转换矩阵。 这被称为梅尔滤波器组,存在各种实现,它们在滤波器的数量、滤波器的形状、滤波器间距方式、滤波器的带宽以及频谱扭曲方式上有所不同。 这些特征的目的是近似人类对音高变化相对于频率的非线性感知。
文献中引入了不同的梅尔滤波器组。 支持以下变体
- MFCC FB-20:由 Davis 和 Mermelstein 在 1980 年提出,它假定采样频率为 10 kHz,语音带宽为
[0, 4600]
Hz。 - MFCC FB-24 HTK:来自剑桥 HMM 工具包 (HTK) (1995) 使用 24 个滤波器的滤波器组,语音带宽为
[0, 8000]
Hz。 这假定采样率 ≥ 16 kHz。 - MFCC FB-40:来自 Slaney 在 1998 年编写的 MATLAB 听觉工具箱,假定采样率为 16 kHz,语音带宽为
[133, 6854]
Hz。 此版本还包括面积归一化。 - Skowronski 和 Harris (2004) 的 HFCC-E FB-29(人类因素倒谱系数),假定采样率为 12.5 kHz,语音带宽为
[0, 6250]
Hz。
此代码改编自torchaudio 和librosa。 请注意,torchaudio 的 melscale_fbanks
的默认参数实现了"htk"
滤波器,而 librosa 使用"slaney"
实现。
找到给定window_length
的最佳 FFT 输入大小。 此函数采用给定的窗口长度,如果它不是 2 的幂,则将其向上舍入到下一个 2 的幂。
当输入长度为 2 的幂时,FFT 算法运行速度最快,这可能大于窗口或分析帧的大小。 例如,如果窗口为 400 个样本,则使用 512 个样本的 FFT 输入大小比 400 个样本的 FFT 大小更优化。 使用更大的 FFT 大小不会影响检测到的频率,它只是提供更高的频率分辨率(即频率箱更小)。
transformers.audio_utils.window_function
< source >( window_length: int name: str = 'hann' periodic: bool = True frame_length: Optional = None center: bool = True )
返回一个包含指定窗口的数组。此窗口旨在与 stft
一起使用。
支持以下窗口类型
"boxcar"
: 方形窗"hamming"
: 海明窗"hann"
: 汉宁窗"povey"
: Povey 窗
transformers.audio_utils.spectrogram
< source >( waveform: ndarray window: ndarray frame_length: int hop_length: int fft_length: Optional = None power: Optional = 1.0 center: bool = True pad_mode: str = 'reflect' onesided: bool = True preemphasis: Optional = None mel_filters: Optional = None mel_floor: float = 1e-10 log_mel: Optional = None reference: float = 1.0 min_value: float = 1e-10 db_range: Optional = None remove_dc_offset: Optional = None dtype: dtype = <class 'numpy.float32'> )
参数
- waveform (
np.ndarray
形状为(length,)
) — 输入波形。这必须是一个单一的实值单声道波形。 - window (
np.ndarray
形状为(frame_length,)
) — 应用的加窗函数,包括必要的零填充。实际窗口长度可能小于frame_length
,但我们假设数组已经过零填充。 - frame_length (
int
) — 分析帧的长度(以样本为单位)。在 librosa 中,它始终等于fft_length
,但我们也允许使用更小的尺寸。 - hop_length (
int
) — 相邻分析帧之间的步长(以样本为单位)。 - fft_length (
int
,可选) — FFT 缓冲区的大小(以样本为单位)。这决定了语谱图将有多少个频率 bin。为了获得最佳速度,它应该为 2 的幂。如果为None
,则使用frame_length
。 - power (
float
,可选,默认值为 1.0) — 如果为 1.0,则返回幅度语谱图。如果为 2.0,则返回功率语谱图。如果为None
,则返回复数。 - center (
bool
,可选,默认值为True
) — 是否对波形进行填充,以便帧t
以时间t * hop_length
为中心。如果为False
,则帧t
将从时间t * hop_length
开始。 - pad_mode (
str
,可选,默认值为"reflect"
) — 当center
为True
时使用的填充模式。可能的值有:"constant"
(用零填充)、"edge"
(用边缘值填充)、"reflect"
(用镜像值填充)。 - onesided (
bool
,可选,默认值为True
) — 如果为 True,则仅计算正频率,并返回包含fft_length // 2 + 1
个频率 bin 的语谱图。如果为 False,则还计算负频率,并返回fft_length
个频率 bin。 - preemphasis (
float
,可选) — 应用于 DFT 之前的预加重低通滤波器的系数。 - mel_filters (
np.ndarray
形状为(num_freq_bins, num_mel_filters)
,可选) — 梅尔滤波器组。如果提供,则应用此滤波器组以创建梅尔语谱图。 - reference (
float
, 可选,默认值为 1.0) — 设置对应于 0 dB 的输入频谱值。例如,使用np.max(spectrogram)
将最响亮的部位设置为 0 dB。 必须大于零。 - min_value (
float
, 可选,默认值为1e-10
) — 在转换为分贝之前,频谱将被裁剪到此最小值,以避免取log(0)
。对于功率频谱,默认值1e-10
对应于 -100 dB 的最小值。对于幅度频谱,值1e-5
对应于 -100 dB。 必须大于零。 - db_range (
float
, 可选) — 设置分贝中的最大动态范围。例如,如果db_range = 80
,则峰值与最小值之间的差值永远不会超过 80 dB。 必须大于零。 - remove_dc_offset (
bool
, 可选) — 在预加重之前,从每个帧的波形中减去均值。为了获得与torchaudio.compliance.kaldi.fbank
计算梅尔滤波器时相同的结果,应该将其设置为true
。 - dtype (
np.dtype
, 可选,默认值为np.float32
) — 频谱张量的 数据类型。如果power
为 None,则忽略此参数,数据类型将为np.complex64
。
使用短时傅里叶变换计算单个波形的频谱。
此函数可以创建以下类型的频谱
- 幅度频谱 (
power = 1.0
) - 功率频谱 (
power = 2.0
) - 复数频谱 (
power = None
) - 对数频谱 (使用
log_mel
参数) - 梅尔频谱 (提供
mel_filters
) - 对数梅尔频谱 (提供
mel_filters
和log_mel
)
工作原理
- 输入波形被分成大小为
frame_length
的帧,这些帧通过frame_length
hop_length
个样本部分重叠。
- 每个帧乘以窗口并放置到大小为
fft_length
的缓冲区中。 - 对每个加窗帧进行 DFT。
- 结果被堆叠成频谱。
我们区分以下样本数据“块”,每个块可能具有不同的长度
- 分析帧。这是输入波形被分割成的时隙的大小。
- 窗口。每个分析帧乘以窗口,以避免频谱泄漏。
- FFT 输入缓冲区。这的长度决定了频谱中有多少个频率 bin。
在此实现中,假设窗口被零填充以具有与分析帧相同的大小。可以通过 window_function()
获得填充的窗口。 FFT 输入缓冲区可能大于分析帧,通常是下一个 2 的幂。
注意:此函数尚未针对速度进行优化。它应该与 librosa.stft
和 torchaudio.functional.transforms.Spectrogram
基本兼容,尽管由于构造频谱的不同方式,它更灵活。
transformers.audio_utils.power_to_db
< source > ( spectrogram: ndarray reference: float = 1.0 min_value: float = 1e-10 db_range: Optional = None ) → np.ndarray
参数
- spectrogram (
np.ndarray
) — 输入功率(梅尔)频谱。注意功率频谱的振幅是平方! - 参考值 (
float
, 可选, 默认为 1.0) — 设置对应 0 dB 的输入频谱图值。例如,使用np.max(spectrogram)
将最响的部分设置为 0 dB。必须大于零。 - 最小值 (
float
, 可选, 默认为1e-10
) — 频谱图在转换为分贝之前将被剪切到此最小值,以避免取log(0)
。1e-10
的默认值对应于 -100 dB 的最小值。必须大于零。 - 分贝范围 (
float
, 可选) — 设置分贝中的最大动态范围。例如,如果db_range = 80
,则峰值与最小值之间的差永远不会超过 80 dB。必须大于零。
返回值
np.ndarray
频谱图以分贝表示
将功率频谱图转换为分贝刻度。这计算 10 * log10(spectrogram / reference)
,使用基本对数属性以确保数值稳定性。
在(mel)频谱图上应用对数函数的原因是,人类的听觉并不是线性的。通常,要使声音的感知音量加倍,我们需要将能量增加 8 倍。这意味着,如果声音一开始就很响,则能量的大幅变化听起来可能并不那么不同。这种压缩操作使(mel)频谱图特征更符合人类的实际听觉。
基于 librosa.power_to_db
的实现。
transformers.audio_utils.amplitude_to_db
< 源代码 > ( 频谱图: ndarray 参考值: float = 1.0 最小值: float = 1e-05 分贝范围: Optional = None ) → np.ndarray
参数
- 频谱图 (
np.ndarray
) — 输入幅度(mel)频谱图。 - 参考值 (
float
, 可选, 默认为 1.0) — 设置对应 0 dB 的输入频谱图值。例如,使用np.max(spectrogram)
将最响的部分设置为 0 dB。必须大于零。 - 最小值 (
float
, 可选, 默认为1e-5
) — 频谱图在转换为分贝之前将被剪切到此最小值,以避免取log(0)
。1e-5
的默认值对应于 -100 dB 的最小值。必须大于零。 - 分贝范围 (
float
, 可选) — 设置分贝中的最大动态范围。例如,如果db_range = 80
,则峰值与最小值之间的差永远不会超过 80 dB。必须大于零。
返回值
np.ndarray
频谱图以分贝表示
将幅度频谱图转换为分贝刻度。这计算 20 * log10(spectrogram / reference)
,使用基本对数属性以确保数值稳定性。
在(mel)频谱图上应用对数函数的原因是,人类的听觉并不是线性的。通常,要使声音的感知音量加倍,我们需要将能量增加 8 倍。这意味着,如果声音一开始就很响,则能量的大幅变化听起来可能并不那么不同。这种压缩操作使(mel)频谱图特征更符合人类的实际听觉。