Transformers 文档

FeatureExtractors 的实用工具

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

FeatureExtractors 的实用工具

此页面列出了音频 FeatureExtractor 可以使用的所有实用函数,以便使用常见的算法(例如短时傅里叶变换log mel 频谱图)从原始音频中计算特殊特征。

如果您正在研究库中音频处理器的代码,那么这些实用工具中的大多数才有用。

音频转换

transformers.audio_utils.hertz_to_mel

< >

( freq: typing.Union[float, numpy.ndarray] mel_scale: str = 'htk' ) floatnp.ndarray

参数

  • freq (floatnp.ndarray) — 频率,以赫兹 (Hz) 为单位。
  • mel_scale (str, 可选,默认为 "htk") — 要使用的梅尔频率尺度,"htk""kaldi""slaney"

返回

floatnp.ndarray

梅尔刻度上的频率。

将频率从赫兹转换为梅尔。

transformers.audio_utils.mel_to_hertz

< >

( mels: typing.Union[float, numpy.ndarray] mel_scale: str = 'htk' ) floatnp.ndarray

参数

  • mels (floatnp.ndarray) — 频率,以梅尔为单位。
  • mel_scale (str, 可选"htk") — 要使用的梅尔频率尺度,"htk""kaldi""slaney"

返回

floatnp.ndarray

赫兹频率。

将频率从梅尔转换为赫兹。

transformers.audio_utils.mel_filter_bank

< >

( num_frequency_bins: int num_mel_filters: int min_frequency: float max_frequency: float sampling_rate: int norm: typing.Optional[str] = None mel_scale: str = 'htk' triangularize_in_mel_space: bool = False ) 形状为 (num_frequency_bins, num_mel_filters) 的 np.ndarray

参数

  • 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) — 如果启用此选项,则三角形滤波器将应用于梅尔空间而不是频率空间。应将其设置为 true,以便在计算梅尔滤波器时获得与 torchaudio 相同的结果。

返回

形状为 (num_frequency_bins, num_mel_filters) 的 np.ndarray

三角形滤波器组矩阵。这是一个从频谱图到梅尔频谱图的投影矩阵。

创建用于获得梅尔频谱图的频率箱转换矩阵。这被称为梅尔滤波器组,并且存在各种实现,这些实现方式在滤波器数量、滤波器形状、滤波器间距、滤波器带宽以及频谱扭曲方式上有所不同。这些特征的目标是近似人类对音高相对于频率变化的非线性感知。

文献中介绍了不同的梅尔滤波器组。支持以下变体

  • MFCC FB-20:由 Davis 和 Mermelstein 在 1980 年引入,它假设采样频率为 10 kHz,语音带宽为 [0, 4600] Hz。
  • MFCC FB-24 HTK:来自 Cambridge HMM Toolkit (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。

此代码改编自 torchaudiolibrosa。请注意,torchaudio 的 melscale_fbanks 的默认参数实现了 "htk" 滤波器,而 librosa 使用 "slaney" 实现。

transformers.audio_utils.optimal_fft_length

< >

( window_length: int )

为给定的 window_length 找到最佳 FFT 输入大小。此函数接受给定的窗口长度,如果还不是 2 的幂,则将其向上舍入到下一个 2 的幂。

当输入长度为 2 的幂时,FFT 算法的工作速度最快,这可能大于窗口或分析帧的大小。例如,如果窗口为 400 个样本,则使用 512 个样本的 FFT 输入大小比 400 个样本的 FFT 大小更优。使用更大的 FFT 大小不会影响检测到的频率,它只是提供更高的频率分辨率(即,频率箱更小)。

transformers.audio_utils.window_function

< >

( window_length: int name: str = 'hann' periodic: bool = True frame_length: typing.Optional[int] = None center: bool = True )

参数

  • window_length (int) — 窗口的长度,以样本为单位。
  • name (str, 可选,默认为 "hann") — 窗口函数的名称。
  • periodic (bool, optional, 默认为 True) — 窗口是周期的还是对称的。
  • frame_length (int, optional) — 分析帧的长度,以采样点为单位。如果窗口小于帧长,请为 frame_length 提供一个值,以便对其进行零填充。
  • center (bool, optional, 默认为 True) — 是否将窗口在 FFT 缓冲区内居中。仅当提供了 frame_length 时使用。

返回一个包含指定窗口的数组。此窗口旨在与 stft 一起使用。

支持以下窗口类型

  • "boxcar": 矩形窗
  • "hamming": 汉明窗
  • "hann": 汉宁窗
  • "povey": Povey 窗

transformers.audio_utils.spectrogram

< >

( waveform: ndarray window: ndarray frame_length: int hop_length: int fft_length: typing.Optional[int] = None power: typing.Optional[float] = 1.0 center: bool = True pad_mode: str = 'reflect' onesided: bool = True dither: float = 0.0 preemphasis: typing.Optional[float] = None mel_filters: typing.Optional[numpy.ndarray] = None mel_floor: float = 1e-10 log_mel: typing.Optional[str] = None reference: float = 1.0 min_value: float = 1e-10 db_range: typing.Optional[float] = None remove_dc_offset: typing.Optional[bool] = 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, optional) — FFT 缓冲区的大小,以采样点为单位。这决定了频谱图将具有多少个频率 bin。为了获得最佳速度,这应该是 2 的幂。如果为 None,则使用 frame_length
  • power (float, optional, 默认为 1.0) — 如果为 1.0,则返回幅度频谱图。如果为 2.0,则返回功率频谱图。如果为 None,则返回复数。
  • center (bool, optional, 默认为 True) — 是否填充波形,使帧 t 以时间 t * hop_length 为中心。如果为 False,帧 t 将从时间 t * hop_length 开始。
  • pad_mode (str, optional, 默认为 "reflect") — 当 centerTrue 时使用的填充模式。可能的值包括:"constant"(用零填充)、"edge"(用边缘值填充)、"reflect"(用镜像值填充)。
  • onesided (bool, optional, 默认为 True) — 如果为 True,则仅计算正频率,并返回包含 fft_length // 2 + 1 个频率 bin 的频谱图。如果为 False,则还会计算负频率,并返回 fft_length 个频率 bin。
  • dither (float, optional, 默认为 0.0) — 添加抖动。换句话说,向每个帧添加少量高斯噪声。例如,使用 4.0 添加抖动,其正态分布以 0.0 为中心,标准差为 4.0,0.0 表示不抖动。抖动具有与 mel_floor 类似的效果。它可以减少信号中硬零部分的高 log_mel_fbank 值,当信号中存在 VAD 截止时。
  • preemphasis (float, optional) — 应用于 DFT 之前的预加重低通滤波器的系数。
  • mel_filters (np.ndarray,形状为 (num_freq_bins, num_mel_filters), optional) — Mel 滤波器组。如果提供,则应用此滤波器组以创建 Mel 频谱图。
  • mel_floor (float, optional, 默认为 1e-10) — Mel 频率组的最小值。
  • log_mel (str, optional) — 如何将频谱图转换为对数刻度。可能的选项包括:None(不转换)、"log"(取自然对数)、"log10"(取以 10 为底的对数)、"dB"(转换为分贝)。仅当 power 不为 None 时才可使用。
  • reference (float, optional, 默认为 1.0) — 设置对应于 0 dB 的输入频谱图值。例如,使用 np.max(spectrogram) 将最响亮的部分设置为 0 dB。必须大于零。
  • min_value (float, optional, 默认为 1e-10) — 频谱图将在转换为分贝之前被裁剪为此最小值,以避免取 log(0)。对于功率频谱图,默认值 1e-10 对应于最小 -100 dB。对于幅度频谱图,值 1e-5 对应于 -100 dB。必须大于零。
  • db_range (float, optional) — 设置以分贝为单位的最大动态范围。例如,如果 db_range = 80,则峰值和最小值之间的差值将永远不会超过 80 dB。必须大于零。
  • remove_dc_offset (bool, optional) — 从每个帧的波形中减去均值,在预加重之前应用。应将其设置为 true,以便在计算 Mel 滤波器时获得与 torchaudio.compliance.kaldi.fbank 相同的结果。
  • dtype (np.dtype, optional, 默认为 np.float32) — 频谱图张量的数据类型。如果 power 为 None,则忽略此参数,并且 dtype 将为 np.complex64

使用短时傅里叶变换计算一个波形的频谱图。

此函数可以创建以下类型的频谱图

  • 幅度频谱图 (power = 1.0)
  • 功率频谱图 (power = 2.0)
  • 复值频谱图 (power = None)
  • 对数频谱图 (使用 log_mel 参数)
  • Mel 频谱图 (提供 mel_filters)
  • 对数 Mel 频谱图 (提供 mel_filterslog_mel)

工作原理

  1. 输入波形被分成大小为 frame_length 的帧,这些帧部分重叠,重叠量为 `frame_length
    • hop_length` 个采样点。
  2. 每个帧都与窗口相乘,并放入大小为 fft_length 的缓冲区中。
  3. 对每个加窗帧进行 DFT 运算。
  4. 结果堆叠成频谱图。

我们区分以下几种样本数据“块”,每种数据块可能具有不同的长度

  • 分析帧。这是输入波形被分割成的时间切片的大小。
  • 窗口。每个分析帧都与窗口相乘,以避免频谱泄漏。
  • FFT 输入缓冲区。此缓冲区的长度决定了频谱图中的频率 bin 的数量。

在此实现中,假定窗口被零填充,使其大小与分析帧相同。可以从 window_function() 获取填充窗口。FFT 输入缓冲区可能大于分析帧,通常为下一个 2 的幂。

注意:此函数尚未针对速度进行优化。它应与 librosa.stfttorchaudio.functional.transforms.Spectrogram 大致兼容,但由于可以构建频谱图的方式不同,因此它更灵活。

transformers.audio_utils.power_to_db

< >

( spectrogram: ndarray reference: float = 1.0 min_value: float = 1e-10 db_range: typing.Optional[float] = None ) np.ndarray

参数

  • spectrogram (np.ndarray) — 输入功率(梅尔)频谱图。请注意,功率频谱图的幅度是平方的!
  • reference (float, 可选, 默认为 1.0) — 设置对应于 0 dB 的输入频谱图值。例如,使用 np.max(spectrogram) 将最响亮的部分设置为 0 dB。必须大于零。
  • min_value (float, 可选, 默认为 1e-10) — 频谱图将在转换为分贝之前被裁剪为此最小值,以避免取 log(0)。 默认值 1e-10 对应于最小 -100 dB。必须大于零。
  • db_range (float, 可选) — 设置分贝的最大动态范围。 例如,如果 db_range = 80,则峰值和最小值之间的差异将永远不会超过 80 dB。必须大于零。

返回

np.ndarray

分贝频谱图

将功率频谱图转换为分贝刻度。 这将计算 10 * log10(spectrogram / reference),并使用基本对数属性以获得数值稳定性。

对(梅尔)频谱图应用对数函数的动机是人类并非在线性尺度上感知响度。通常,要使声音的感知音量加倍,我们需要投入 8 倍的能量。这意味着,如果声音一开始就很大,那么能量的巨大变化听起来可能并没有那么大的不同。这种压缩操作使(梅尔)频谱图特征更接近人类实际听到的声音。

基于 librosa.power_to_db 的实现。

transformers.audio_utils.amplitude_to_db

< >

( spectrogram: ndarray reference: float = 1.0 min_value: float = 1e-05 db_range: typing.Optional[float] = None ) np.ndarray

参数

  • spectrogram (np.ndarray) — 输入幅度(梅尔)频谱图。
  • reference (float, 可选, 默认为 1.0) — 设置对应于 0 dB 的输入频谱图值。例如,使用 np.max(spectrogram) 将最响亮的部分设置为 0 dB。必须大于零。
  • min_value (float, 可选, 默认为 1e-5) — 频谱图将在转换为分贝之前被裁剪为此最小值,以避免取 log(0)。 默认值 1e-5 对应于最小 -100 dB。必须大于零。
  • db_range (float, 可选) — 设置分贝的最大动态范围。 例如,如果 db_range = 80,则峰值和最小值之间的差异将永远不会超过 80 dB。必须大于零。

返回

np.ndarray

分贝频谱图

将幅度频谱图转换为分贝刻度。 这将计算 20 * log10(spectrogram / reference),并使用基本对数属性以获得数值稳定性。

对(梅尔)频谱图应用对数函数的动机是人类并非在线性尺度上感知响度。通常,要使声音的感知音量加倍,我们需要投入 8 倍的能量。这意味着,如果声音一开始就很大,那么能量的巨大变化听起来可能并没有那么大的不同。这种压缩操作使(梅尔)频谱图特征更接近人类实际听到的声音。

< > GitHub 上更新