Transformers 文件
EnCodec
並獲得增強的文件體驗
開始使用
EnCodec
概述
EnCodec 神經編解碼器模型由 Alexandre Défossez、Jade Copet、Gabriel Synnaeve 和 Yossi Adi 在 高保真神經音訊壓縮 中提出。
論文摘要如下:
我們引入了一種利用神經網路的最先進的即時、高保真音訊編解碼器。它由一個端到端訓練的帶有量化潛在空間的流式編解碼器架構組成。我們透過使用單一的多尺度頻譜圖對抗器來簡化和加速訓練,該對抗器有效地減少了偽影並生成了高質量的樣本。我們引入了一種新穎的損失均衡機制來穩定訓練:損失的權重現在定義了它應該表示的整體梯度的分數,從而將此超引數的選擇與損失的典型尺度分離。最後,我們研究瞭如何使用輕量級Transformer模型進一步壓縮所獲得的表示,最高可達40%,同時仍比即時更快。我們詳細描述了所提出模型的關鍵設計選擇,包括:訓練目標、架構更改以及對各種感知損失函式的研究。我們針對一系列頻寬和音訊領域進行了廣泛的主觀評估(MUSHRA測試),包括語音、嘈雜混響語音和音樂。在所有評估設定中,考慮到24 kHz單聲道和48 kHz立體聲,我們的方法都優於基線方法。
此模型由 Matthijs、Patrick Von Platen 和 Arthur Zucker 貢獻。原始程式碼可在此處找到。
使用示例
以下是一個如何使用此模型進行音訊編碼和解碼的快速示例
>>> from datasets import load_dataset, Audio
>>> from transformers import EncodecModel, AutoProcessor
>>> librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> model = EncodecModel.from_pretrained("facebook/encodec_24khz")
>>> processor = AutoProcessor.from_pretrained("facebook/encodec_24khz")
>>> librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=processor.sampling_rate))
>>> audio_sample = librispeech_dummy[-1]["audio"]["array"]
>>> inputs = processor(raw_audio=audio_sample, sampling_rate=processor.sampling_rate, return_tensors="pt")
>>> encoder_outputs = model.encode(inputs["input_values"], inputs["padding_mask"])
>>> audio_values = model.decode(encoder_outputs.audio_codes, encoder_outputs.audio_scales, inputs["padding_mask"])[0]
>>> # or the equivalent with a forward pass
>>> audio_values = model(inputs["input_values"], inputs["padding_mask"]).audio_values
EncodecConfig
class transformers.EncodecConfig
< 源 >( target_bandwidths = [1.5, 3.0, 6.0, 12.0, 24.0] sampling_rate = 24000 audio_channels = 1 normalize = False chunk_length_s = None overlap = None hidden_size = 128 num_filters = 32 num_residual_layers = 1 upsampling_ratios = [8, 5, 4, 2] norm_type = 'weight_norm' kernel_size = 7 last_kernel_size = 7 residual_kernel_size = 3 dilation_growth_rate = 2 use_causal_conv = True pad_mode = 'reflect' compress = 2 num_lstm_layers = 2 trim_right_ratio = 1.0 codebook_size = 1024 codebook_dim = None use_conv_shortcut = True **kwargs )
引數
- target_bandwidths (
list[float]
, 可選, 預設為[1.5, 3.0, 6.0, 12.0, 24.0]
) — 模型可以編碼音訊的不同頻寬範圍。 - sampling_rate (
int
, 可選, 預設為 24000) — 音訊波形數字化時的取樣率,以赫茲 (Hz) 表示。 - audio_channels (
int
, 可選, 預設為 1) — 音訊資料中的通道數。單聲道為 1,立體聲為 2。 - normalize (
bool
, 可選, 預設為False
) — 傳入音訊時是否進行歸一化。 - chunk_length_s (
float
, 可選) — 如果定義,音訊將被預處理成長度為chunk_length_s
的塊,然後進行編碼。 - overlap (
float
, 可選) — 定義每個塊之間的重疊。它用於使用以下公式計算chunk_stride
:int((1.0 - self.overlap) * self.chunk_length)
。 - hidden_size (
int
, 可選, 預設為 128) — 中間表示維度。 - num_filters (
int
, 可選, 預設為 32) — 第一個EncodecConv1d
下采樣層的卷積核數量。 - num_residual_layers (
int
, 可選, 預設為 1) — 殘差層數量。 - upsampling_ratios (
Sequence[int]
, 可選, 預設為[8, 5, 4, 2]
) — 核大小和步長比率。編碼器使用下采樣比率而不是上取樣比率,因此它將使用與此處指定的必須與解碼器順序匹配的比率相反的比率。 - norm_type (
str
, 可選, 預設為"weight_norm"
) — 歸一化方法。應為["weight_norm", "time_group_norm"]
中的一種。 - kernel_size (
int
, 可選, 預設為 7) — 初始卷積的核大小。 - last_kernel_size (
int
, 可選, 預設為 7) — 最後一層卷積的核大小。 - residual_kernel_size (
int
, 可選, 預設為 3) — 殘差層的核大小。 - dilation_growth_rate (
int
, 可選, 預設為 2) — 每層擴張率增加的量。 - use_causal_conv (
bool
, 可選, 預設為True
) — 是否使用完全因果卷積。 - pad_mode (
str
, 可選, 預設為"reflect"
) — 卷積的填充模式。 - compress (
int
, 可選, 預設為 2) — 殘差分支中的降維(來自 Demucs v3)。 - num_lstm_layers (
int
, 可選, 預設為 2) — 編碼器末尾的 LSTM 層數。 - trim_right_ratio (
float
, 可選, 預設為 1.0) — 在use_causal_conv = True
設定下,轉置卷積右側修剪的比率。如果等於 1.0,則表示所有修剪都在右側完成。 - codebook_size (
int
, 可選, 預設為 1024) — 構成 VQVAE 的離散程式碼的數量。 - codebook_dim (
int
, 可選) — 碼本向量的維度。如果未定義,則使用hidden_size
。 - use_conv_shortcut (
bool
, 可選, 預設為True
) — 是否在EncodecResnetBlock
塊中使用卷積層作為“跳躍”連線。如果為 False,將使用恆等函式,提供一個通用的殘差連線。
這是一個用於儲存 EncodecModel 配置的配置類。它用於根據指定引數例項化 Encodec 模型,定義模型架構。使用預設值例項化配置將生成與 facebook/encodec_24khz 架構類似的配置。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。有關這些方法的更多資訊,請參閱 PretrainedConfig 文件。
示例
>>> from transformers import EncodecModel, EncodecConfig
>>> # Initializing a "facebook/encodec_24khz" style configuration
>>> configuration = EncodecConfig()
>>> # Initializing a model (with random weights) from the "facebook/encodec_24khz" style configuration
>>> model = EncodecModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
EncodecFeatureExtractor
class transformers.EncodecFeatureExtractor
< 源 >( feature_size: int = 1 sampling_rate: int = 24000 padding_value: float = 0.0 chunk_length_s: typing.Optional[float] = None overlap: typing.Optional[float] = None **kwargs )
引數
- feature_size (
int
, 可選, 預設為 1) — 提取特徵的特徵維度。單聲道使用 1,立體聲使用 2。 - sampling_rate (
int
, 可選, 預設為 24000) — 音訊波形數字化時的取樣率,以赫茲 (Hz) 表示。 - padding_value (
float
, 可選, 預設為 0.0) — 用於填充填充值的值。 - chunk_length_s (
float
, 可選) — 如果定義,音訊將被預處理成長度為chunk_length_s
的塊,然後進行編碼。 - overlap (
float
, 可選) — 定義每個塊之間的重疊。它用於使用以下公式計算chunk_stride
:int((1.0 - self.overlap) * self.chunk_length)
。
構建一個 EnCodec 特徵提取器。
此特徵提取器繼承自 SequenceFeatureExtractor,其中包含大部分主要方法。使用者應參閱此超類以獲取有關這些方法的更多資訊。
使用預設值例項化特徵提取器將生成與 facebook/encodec_24khz 架構類似的配置。
__call__
< 源 >( raw_audio: typing.Union[numpy.ndarray, list[float], list[numpy.ndarray], list[list[float]]] padding: typing.Union[bool, str, transformers.utils.generic.PaddingStrategy, NoneType] = None truncation: typing.Optional[bool] = False max_length: typing.Optional[int] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None sampling_rate: typing.Optional[int] = None )
引數
- raw_audio (
np.ndarray
,list[float]
,list[np.ndarray]
,list[list[float]]
) — 要處理的序列或序列批次。每個序列可以是 numpy 陣列、浮點值列表、numpy 陣列列表或浮點值列表的列表。對於單聲道音訊(feature_size = 1
),numpy 陣列的形狀必須為(num_samples,)
;對於立體聲音訊(feature_size = 2
),必須為(2, num_samples)
。 - padding (
bool
,str
或 PaddingStrategy, 可選, 預設為True
) — 在以下策略中選擇一種來填充返回的序列(根據模型的填充側和填充索引):True
或'longest'
:填充到批次中最長的序列(如果只提供一個序列,則不填充)。'max_length'
:填充到由引數max_length
指定的最大長度,或者如果未提供該引數,則填充到模型可接受的最大輸入長度。False
或'do_not_pad'
(預設):不填充(即,可以輸出具有不同長度序列的批次)。
- truncation (
bool
, 可選, 預設為False
) — 啟用截斷以將長於max_length
的輸入序列截斷為max_length
。 - max_length (
int
, 可選) — 返回列表的最大長度和可選的填充長度(見上文)。 - return_tensors (
str
或 TensorType, 可選) — 如果設定,將返回張量而不是 Python 整數列表。可接受的值為:'tf'
:返回 TensorFlowtf.constant
物件。'pt'
:返回 PyTorchtorch.Tensor
物件。'np'
:返回 Numpynp.ndarray
物件。
- sampling_rate (
int
, 可選) —audio
輸入的取樣率。強烈建議在轉發呼叫時傳遞sampling_rate
,以防止靜默錯誤。
對一個或多個序列進行特徵化併為模型準備的主方法。
EncodecModel
class transformers.EncodecModel
< source >( config: EncodecConfig )
引數
- config (EncodecConfig) — 模型的配置類,包含模型的所有引數。使用配置檔案初始化並不會載入與模型相關的權重,只加載配置。請檢視 from_pretrained() 方法來載入模型權重。
EnCodec 神經網路音訊編解碼器模型。
此模型繼承自 PreTrainedModel。請檢視超類文件,瞭解庫為其所有模型實現的一般方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件中所有與一般用法和行為相關的事項。
decode
< source >( audio_codes: Tensor audio_scales: Tensor padding_mask: typing.Optional[torch.Tensor] = None return_dict: typing.Optional[bool] = None )
引數
- audio_codes (形狀為
(batch_size, nb_chunks, chunk_length)
的torch.LongTensor
,可選) — 使用model.encode
計算的離散程式碼嵌入。 - audio_scales (形狀為
(batch_size, nb_chunks)
的torch.Tensor
,可選) — 每個audio_codes
輸入的縮放因子。 - padding_mask (形狀為
(batch_size, channels, sequence_length)
的torch.Tensor
) — 用於填充input_values
的填充掩碼。 - return_dict (
bool
, 可選) — 是否返回 ModelOutput 而不是普通元組。
將給定幀解碼為輸出音訊波形。
請注意,輸出可能比輸入稍大。在這種情況下,末尾的任何額外步驟都可以剪下。
編碼
< source >( input_values: Tensor padding_mask: typing.Optional[torch.Tensor] = None bandwidth: typing.Optional[float] = None return_dict: typing.Optional[bool] = None )
引數
- input_values (形狀為
(batch_size, channels, sequence_length)
的torch.Tensor
) — 輸入音訊波形的浮點值。 - padding_mask (形狀為
(batch_size, channels, sequence_length)
的torch.Tensor
) — 用於填充input_values
的填充掩碼。 - bandwidth (
float
, 可選) — 目標頻寬。必須是config.target_bandwidths
之一。如果為None
,則使用最小可能的頻寬。頻寬表示為其千分之一,例如 6kbps 頻寬表示為 bandwidth == 6.0
將輸入音訊波形編碼為離散程式碼。
forward
< source >( input_values: Tensor padding_mask: typing.Optional[torch.Tensor] = None bandwidth: typing.Optional[float] = None audio_codes: typing.Optional[torch.Tensor] = None audio_scales: typing.Optional[torch.Tensor] = None return_dict: typing.Optional[bool] = None ) → transformers.models.encodec.modeling_encodec.EncodecOutput
或 tuple(torch.FloatTensor)
引數
- input_values (形狀為
(batch_size, channels, sequence_length)
的torch.FloatTensor
,可選) — 原始音訊輸入,轉換為浮點數並填充到適當長度,以便使用長度為self.chunk_length
且步幅為config.chunk_stride
的塊進行編碼。 - padding_mask (形狀為
(batch_size, channels, sequence_length)
的torch.BoolTensor
,可選) — 用於避免在填充標記索引上計算縮放因子的掩碼(我們能否避免在這些標記上計算卷積?)。掩碼值選擇在[0, 1]
中:- 1 表示**未被掩碼**的標記,
- 0 表示**被掩碼**的標記。
除非輸入被截斷或未填充,否則應始終傳遞
padding_mask
。這是因為為了有效處理張量,輸入音訊應進行填充,以便input_length % stride = step
,其中step = chunk_length-stride
。這確保了所有塊都具有相同的形狀。 - bandwidth (
float
, 可選) — 目標頻寬。必須是config.target_bandwidths
之一。如果為None
,則使用最小可能的頻寬。頻寬表示為其千分之一,例如 6kbps 頻寬表示為bandwidth == 6.0
- audio_codes (形狀為
(batch_size, nb_chunks, chunk_length)
的torch.LongTensor
,可選) — 使用model.encode
計算的離散程式碼嵌入。 - audio_scales (形狀為
(batch_size, nb_chunks)
的torch.Tensor
,可選) — 每個audio_codes
輸入的縮放因子。 - return_dict (
bool
, 可選) — 是否返回 ModelOutput 而不是普通元組。
返回
transformers.models.encodec.modeling_encodec.EncodecOutput
或 tuple(torch.FloatTensor)
一個 transformers.models.encodec.modeling_encodec.EncodecOutput
或一個 torch.FloatTensor
元組(如果傳遞了 return_dict=False
或 config.return_dict=False
),包含根據配置(EncodecConfig)和輸入的不同元素。
- audio_codes (形狀為
(batch_size, nb_chunks, chunk_length)
的torch.LongTensor
,可選) — 使用model.encode
計算的離散程式碼嵌入。 - audio_values (形狀為
(batch_size, segment_length)
的torch.FloatTensor
,可選) — 解碼後的音訊值,使用 Encodec 的解碼器部分獲得。
EncodecModel 的 forward 方法,重寫了 __call__
特殊方法。
儘管前向傳播的實現需要在該函式中定義,但之後應該呼叫 Module
例項而不是直接呼叫此函式,因為前者會處理預處理和後處理步驟,而後者會默默忽略它們。
示例
>>> from datasets import load_dataset
>>> from transformers import AutoProcessor, EncodecModel
>>> dataset = load_dataset("hf-internal-testing/ashraq-esc50-1-dog-example")
>>> audio_sample = dataset["train"]["audio"][0]["array"]
>>> model_id = "facebook/encodec_24khz"
>>> model = EncodecModel.from_pretrained(model_id)
>>> processor = AutoProcessor.from_pretrained(model_id)
>>> inputs = processor(raw_audio=audio_sample, return_tensors="pt")
>>> outputs = model(**inputs)
>>> audio_codes = outputs.audio_codes
>>> audio_values = outputs.audio_values