Transformers 文件

FeatureExtractor 的實用工具

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

FeatureExtractor 實用工具

本頁面列出了音訊 FeatureExtractor 可以使用的所有實用函式,以便使用常見演算法(如短時傅立葉變換或對數梅爾頻譜圖)從原始音訊計算特殊特徵。

其中大多數僅在您研究庫中音訊處理器的程式碼時有用。

音訊變換

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 ) np.ndarray 形態為 (num_frequency_bins, num_mel_filters)

引數

  • num_frequency_bins (int) — 頻率桶的數量(應與 n_fft // 2 + 1 相同,其中 n_fft 是用於計算頻譜圖的傅立葉變換的大小)。
  • num_mel_filters (int) — 要生成的梅爾濾波器數量。
  • min_frequency (float) — 感興趣的最低頻率,單位為赫茲。
  • max_frequency (float) — 感興趣的最高頻率,單位為赫茲。這不應超過 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。此版本還包括面積歸一化。
  • HFCC-E FB-29 (人因倒譜系數) by Skowronski and Harris (2004),假設取樣率為 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, 可選, 預設為 True) — 視窗是週期性的還是對稱的。
  • frame_length (int, 可選) — 分析幀的樣本長度。如果視窗小於幀長度,則提供 frame_length 的值,以便進行零填充。
  • center (bool, 可選, 預設為 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, 可選) — FFT 緩衝區的樣本大小。這決定了頻譜圖將有多少個頻率桶。為了獲得最佳速度,這應該是一個 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") — 當 centerTrue 時使用的填充模式。可能的值有:"constant"(用零填充)、"edge"(用邊緣值填充)、"reflect"(用映象值填充)。
  • onesided (bool, 可選, 預設為 True) — 如果為 True,則僅計算正頻率並返回包含 fft_length // 2 + 1 頻率桶的頻譜圖。如果為 False,則還會計算負頻率並返回 fft_length 頻率桶。
  • dither (float, 可選, 預設為 0.0) — 新增抖動。換句話說,向每個幀新增小的 Gaussian 噪聲。例如,使用 4.0 新增標準差為 4.0,以 0.0 為中心的正常分佈的抖動,0.0 表示不抖動。抖動與 mel_floor 具有類似的效果。它降低了具有硬零部分訊號的高 log_mel_fbank 值,當訊號中存在 VAD 截止時。
  • preemphasis (float, 可選) — 在 DFT 之前應用預加重低通濾波器的係數。
  • mel_filters (np.ndarray 形態為 (num_freq_bins, num_mel_filters), 可選) — 梅爾濾波器組。如果提供,將此濾波器組應用於建立梅爾頻譜圖。
  • mel_floor (float, 可選, 預設為 1e-10) — 梅爾頻率帶的最小值。
  • log_mel (str, 可選) — 如何將頻譜圖轉換為對數刻度。可能的選項有:None(不轉換)、"log"(取自然對數)、"log10"(取以 10 為底的對數)、"dB"(轉換為分貝)。僅當 power 不為 None 時才能使用。
  • 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_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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.