Transformers 文件
Mimi
並獲得增強的文件體驗
開始使用
Mimi
概述
Mimi 模型由 Alexandre Défossez、Laurent Mazaré、Manu Orsini、Amélie Royer、Patrick Pérez、Hervé Jégou、Edouard Grave 和 Neil Zeghidour 在論文 Moshi: a speech-text foundation model for real-time dialogue 中提出。Mimi 是 Kyutai 團隊開發的一款高保真音訊編解碼器模型,它將語義和聲學資訊組合成音訊詞元,以 12Hz 的頻率和 1.1kbps 的位元率執行。換句話說,它可以用於將音訊波形對映成“音訊詞元”,即“碼本”。
論文摘要如下:
我們介紹了 Moshi,一個語音-文字基礎模型和全雙工口語對話方塊架。當前的口語對話系統依賴於多個獨立元件的流水線,即語音活動檢測、語音識別、文字對話和文字到語音轉換。這樣的框架無法模擬真實對話的體驗。首先,它們的複雜性導致互動之間有幾秒鐘的延遲。其次,由於文字是對話的中間模態,那些能改變意義的非語言資訊——如情感或非語音聲音——在互動中會丟失。最後,它們依賴於將對話分割為說話人輪次,這沒有考慮到重疊的語音、打斷和插話。Moshi 透過將口語對話視為語音到語音的生成,一次性解決了這些獨立的問題。Moshi 從一個文字語言模型骨幹出發,將語音生成為來自神經音訊編解碼器殘差量化器的詞元,同時將其自身的語音和使用者的語音分別建模為並行流。這使得我們能夠去除明確的說話人輪次,並建模任意的對話動態。此外,我們擴充套件了先前工作中分層的語義到聲學詞元生成方法,首先將時間對齊的文字詞元作為音訊詞元的字首進行預測。這種“內心獨白”方法不僅顯著提高了生成語音的語言質量,我們還展示了它如何能提供流式語音識別和文字到語音轉換。我們得到的模型是第一個即時全雙工口語大語言模型,理論延遲為 160ms,實際延遲為 200ms,可在 github.com/kyutai-labs/moshi 獲取。
其架構基於 Encodec,但有幾個主要區別:
- 它使用低得多的幀率。
- 它使用額外的 Transformer 進行編碼和解碼,以實現更好的潛在語境化。
- 它使用了一種不同的量化方案:一個碼本專門用於語義投影。
用法示例
以下是一個如何使用此模型進行音訊編碼和解碼的快速示例
>>> from datasets import load_dataset, Audio
>>> from transformers import MimiModel, AutoFeatureExtractor
>>> librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> # load model and feature extractor
>>> model = MimiModel.from_pretrained("kyutai/mimi")
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("kyutai/mimi")
>>> # load audio sample
>>> librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
>>> audio_sample = librispeech_dummy[-1]["audio"]["array"]
>>> inputs = feature_extractor(raw_audio=audio_sample, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt")
>>> encoder_outputs = model.encode(inputs["input_values"], inputs["padding_mask"])
>>> audio_values = model.decode(encoder_outputs.audio_codes, inputs["padding_mask"])[0]
>>> # or the equivalent with a forward pass
>>> audio_values = model(inputs["input_values"], inputs["padding_mask"]).audio_values
該模型由 Yoach Lacombe (ylacombe) 貢獻。原始程式碼可在 此處 找到。
MimiConfig
class transformers.MimiConfig
< 源 >( sampling_rate = 24000 frame_rate = None audio_channels = 1 hidden_size = 512 num_filters = 64 num_residual_layers = 1 upsampling_ratios = None kernel_size = 7 last_kernel_size = 3 residual_kernel_size = 3 dilation_growth_rate = 2 use_causal_conv = True pad_mode = 'constant' compress = 2 trim_right_ratio = 1.0 codebook_size = 2048 codebook_dim = 256 num_quantizers = 32 use_conv_shortcut = False vector_quantization_hidden_dimension = 256 num_semantic_quantizers = 1 upsample_groups = 512 num_hidden_layers = 8 intermediate_size = 2048 num_attention_heads = 8 num_key_value_heads = 8 head_dim = None hidden_act = 'gelu' max_position_embeddings = 8000 initializer_range = 0.02 norm_eps = 1e-05 use_cache = False use_streaming = False rope_theta = 10000.0 sliding_window = 250 attention_dropout = 0.0 layer_scale_initial_scale = 0.01 attention_bias = False **kwargs )
引數
- sampling_rate (
int
, 可選, 預設為 24000) — 音訊波形數字化的取樣率,以赫茲 (Hz) 表示。 - frame_rate (
float
, 可選) — 應從其他引數計算得出,但為了向後相容而保留。 - audio_channels (
int
, 可選, 預設為 1) — 音訊資料中的通道數。1 表示單聲道,2 表示立體聲。 - hidden_size (
int
, 可選, 預設為 512) — 中間表示的維度。 - num_filters (
int
, 可選, 預設為 64) — 第一個MimiConv1d
下采樣層的卷積核數量。 - num_residual_layers (
int
, 可選, 預設為 1) — 殘差層的數量。 - upsampling_ratios (
Sequence[int]
, 可選) — 卷積核大小和步幅比率。編碼器使用下采樣比率而不是上取樣比率,因此它將以與此處指定的比率相反的順序使用,必須與解碼器順序匹配。如果未指定,將預設為[8, 6, 5, 4]
。 - kernel_size (
int
, 可選, 預設為 7) — 初始卷積的卷積核大小。 - last_kernel_size (
int
, 可選, 預設為 3) — 最後一個卷積層的卷積核大小。 - residual_kernel_size (
int
, 可選, 預設為 3) — 殘差層的卷積核大小。 - dilation_growth_rate (
int
, 可選, 預設為 2) — 每層增加的擴張率。 - use_causal_conv (
bool
, 可選, 預設為True
) — 是否使用完全因果卷積。 - pad_mode (
str
, 可選, 預設為"constant"
) — 卷積的填充模式。 - compress (
int
, 可選, 預設為 2) — 殘差分支中的降維。 - trim_right_ratio (
float
, 可選, 預設為 1.0) — 在use_causal_conv = True
設定下,用於在轉置卷積右側進行修剪的比率。如果等於 1.0,則表示所有的修剪都在右側完成。 - codebook_size (
int
, 可選, 預設為 2048) — 每個碼本中的離散碼的數量。 - codebook_dim (
int
, 可選, 預設為 256) — 未量化的碼本向量的維度。如果未定義,則使用hidden_size
。 - num_quantizers (
int
, 可選, 預設為 32) — 量化器中的量化器通道數或碼本數。 - use_conv_shortcut (
bool
, 可選, 預設為False
) — 是否在MimiResnetBlock
塊中使用卷積層作為“跳躍”連線。如果為 False,將使用恆等函式,提供一個通用的殘差連線。 - vector_quantization_hidden_dimension (
int
, 可選, 預設為 256) — 殘差向量量化空間中的中間表示維度。 - num_semantic_quantizers (
int
, 可選, 預設為 1) — 語義量化器中的語義量化器通道數或碼本數。必須低於num_quantizers
。 - upsample_groups (
int
, 可選, 預設為 512) — 如果frame_rate!=encodec_frame_rate
,表示在從一個速率轉換到另一個速率的上取樣操作中使用的組數。 - num_hidden_layers (
int
, 可選, 預設為 8) — Transformer 模型中的隱藏層數量。 - intermediate_size (
int
, 可選, 預設為 2048) — MLP 表示的維度。 - num_attention_heads (
int
, 可選, 預設為 8) — Transformer 編碼器中每個注意力層的注意力頭數量。 - num_key_value_heads (
int
, 可選, 預設為 8) — 這是用於實現分組查詢注意力的鍵值頭數量。如果num_key_value_heads=num_attention_heads
,模型將使用多頭注意力 (MHA),如果num_key_value_heads=1
,模型將使用多查詢注意力 (MQA),否則使用 GQA。將多頭檢查點轉換為 GQA 檢查點時,每個分組的鍵和值頭應透過對該組內所有原始頭進行均值池化來構建。更多細節,請檢視 這篇論文。如果未指定,將預設為8
。 - head_dim (
int
, 可選, 預設為hidden_size // num_attention_heads
) — 注意力頭的維度。 - hidden_act (
str
或function
, 可選, 預設為"gelu"
) — 解碼器中的非線性啟用函式 (函式或字串)。 - max_position_embeddings (
int
, 可選, 預設為 8000) — 此模型可能使用的最大序列長度。Mimi 的滑動視窗注意力允許長達 8000 個詞元的序列。 - initializer_range (
float
, 可選, 預設為 0.02) — 用於初始化所有權重矩陣的截斷正態分佈初始化器的標準差。 - norm_eps (
float
, 可選, 預設為 1e-05) — LayerNorm 歸一化層使用的 epsilon 值。 - use_cache (
bool
, 可選, 預設為False
) — 模型是否應返回最後的鍵/值注意力(並非所有模型都使用)。僅在config.is_decoder=True
時相關。 - use_streaming (
bool
, 可選, 預設為False
) — 是否使用流式模式。如果為True
,模型編碼方法將返回填充快取,可用於後續對編碼方法的呼叫。 - rope_theta (
float
, 可選, 預設為 10000.0) — RoPE 嵌入的基期。 - sliding_window (
int
, 可選, 預設為 250) — 滑動視窗注意力的視窗大小。如果未指定,將預設為250
。 - attention_dropout (
float
, 可選, 預設為 0.0) — 注意力機率的 dropout 比率。 - layer_scale_initial_scale (
float
, 可選, 預設為 0.01) — Transformer 模型中殘差重縮放操作的初始尺度。 - attention_bias (
bool
, 預設為False
, 可選, 預設為False
) — 是否在自注意力期間的查詢、鍵、值和輸出投影層中使用偏置。
這是用於儲存 MimiModel 配置的配置類。它用於根據指定的引數例項化一個 Mimi 模型,定義模型架構。使用預設值例項化配置將產生與 kyutai/mimi 架構類似的配置。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。請閱讀 PretrainedConfig 的文件以獲取更多資訊。
示例
>>> from transformers import MimiModel, MimiConfig
>>> # Initializing a "kyutai/mimi" style configuration
>>> configuration = MimiConfig()
>>> # Initializing a model (with random weights) from the "kyutai/mimi" style configuration
>>> model = MimiModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
MimiModel
class transformers.MimiModel
< 源 >( config: MimiConfig )
引數
- config (MimiConfig) — 包含模型所有引數的模型配置類。用配置檔案初始化不會載入與模型相關的權重,只加載配置。請檢視 from_pretrained() 方法來載入模型權重。
Mimi 神經音訊編解碼器模型。
此模型繼承自 PreTrainedModel。請檢視超類文件,瞭解該庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
該模型也是 PyTorch torch.nn.Module 的子類。可以像常規 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與常規用法和行為相關的事項。
decode
< 源 >( audio_codes: Tensor padding_mask: typing.Optional[torch.Tensor] = None decoder_past_key_values: typing.Union[list[torch.FloatTensor], transformers.cache_utils.Cache, NoneType] = None return_dict: typing.Optional[bool] = None )
引數
- audio_codes (
torch.LongTensor
,形狀為(batch_size, num_quantizers, codes_length)
, 可選) — 使用model.encode
計算的離散碼嵌入。 - padding_mask (
torch.Tensor
,形狀為(batch_size, channels, sequence_length)
) — 指示由於填充而應忽略哪些輸入,其中元素為 1 表示未掩碼,0 表示已掩碼。 - decoder_past_key_values (
Cache
, 可選) — 預計算的隱藏狀態(自注意力塊中的鍵和值),可用於加速解碼器 Transformer 的序列解碼。這通常包括在解碼的前一階段,當use_cache=True
或config.use_cache=True
時模型返回的past_key_values
。模型將輸出與輸入相同的快取格式。
如果使用
past_key_values
,使用者可以選擇只輸入最後的 `audio_values` 或 `audio_codes`(即那些尚未將過去的鍵值狀態提供給此模型的輸入)。 - return_dict (
bool
, 可選) — 是否返回一個 ModelOutput 而不是一個普通的元組。
將給定幀解碼為輸出音訊波形。
注意,輸出可能比輸入稍大。在這種情況下,可以修剪掉末尾的任何多餘步驟。
編碼
< 源 >( input_values: Tensor padding_mask: typing.Optional[torch.Tensor] = None num_quantizers: typing.Optional[float] = None encoder_past_key_values: typing.Union[list[torch.FloatTensor], transformers.cache_utils.Cache, NoneType] = None padding_cache: typing.Optional[transformers.models.mimi.modeling_mimi.MimiConv1dPaddingCache] = None use_streaming: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None )
引數
- input_values (
torch.Tensor
,形狀為(batch_size, channels, sequence_length)
) — 輸入音訊波形的浮點數值。 - padding_mask (
torch.Tensor
,形狀為(batch_size, channels, sequence_length)
) — 指示由於填充而應忽略哪些輸入,其中元素為 1 表示未掩碼,0 表示已掩碼。 - num_quantizers (
int
, 可選) — 要使用的量化器(即碼本)的數量。預設情況下,使用所有量化器。 - encoder_past_key_values (
Cache
, 可選) — 預計算的隱藏狀態(自注意力塊中的鍵和值),可用於加速編碼器 Transformer 的序列解碼。這通常包括在解碼的前一階段,當use_cache=True
或config.use_cache=True
時模型返回的past_key_values
。模型將輸出與輸入相同的快取格式。
如果使用
past_key_values
,使用者可以選擇只輸入最後的 `audio_values` 或 `audio_codes`(即那些尚未將過去的鍵值狀態提供給此模型的輸入)。 - return_dict (
bool
, 可選) — 是否返回一個 ModelOutput 而不是一個普通的元組。
將輸入音訊波形編碼為離散程式碼。
forward
< 源 >( input_values: Tensor padding_mask: typing.Optional[torch.Tensor] = None num_quantizers: typing.Optional[int] = None audio_codes: typing.Optional[torch.Tensor] = None encoder_past_key_values: typing.Union[list[torch.FloatTensor], transformers.cache_utils.Cache, NoneType] = None decoder_past_key_values: typing.Union[list[torch.FloatTensor], transformers.cache_utils.Cache, NoneType] = None return_dict: typing.Optional[bool] = None ) → transformers.models.mimi.modeling_mimi.MimiOutput
或 tuple(torch.FloatTensor)
引數
- input_values (
torch.FloatTensor
,形狀為(batch_size, channels, sequence_length)
, 可選) — 轉換為浮點數的原始音訊輸入。 - padding_mask (
torch.Tensor
,形狀為(batch_size, sequence_length)
, 可選) — 指示由於填充而應忽略哪些輸入,其中元素為 1 表示未掩碼,0 表示已掩碼。 - num_quantizers (
int
, 可選) — 要使用的量化器(即碼本)的數量。預設情況下,使用所有量化器。 - audio_codes (
torch.LongTensor
,形狀為(batch_size, num_quantizers, codes_length)
, 可選) — 使用model.encode
計算的離散碼嵌入。 - encoder_past_key_values (
Cache
, 可選) — 預計算的隱藏狀態(自注意力塊中的鍵和值),可用於加速編碼器 Transformer 的序列解碼。這通常包括在解碼的前一階段,當use_cache=True
或config.use_cache=True
時模型返回的past_key_values
。模型將輸出與輸入相同的快取格式。
如果使用
past_key_values
,使用者可以選擇只輸入最後的 `audio_values` 或 `audio_codes`(即那些尚未將過去的鍵值狀態提供給此模型的輸入)。 - decoder_past_key_values (
Cache
, 可選) — 預計算的隱藏狀態(自注意力塊中的鍵和值),可用於加速解碼器 Transformer 的序列解碼。這通常包括在解碼的前一階段,當use_cache=True
或config.use_cache=True
時模型返回的past_key_values
。模型將輸出與輸入相同的快取格式。
如果使用
past_key_values
,使用者可以選擇只輸入最後的 `audio_values` 或 `audio_codes`(即那些尚未將過去的鍵值狀態提供給此模型的輸入)。 - return_dict (
bool
, 可選) — 是否返回一個 ModelOutput 而不是一個普通的元組。
返回
transformers.models.mimi.modeling_mimi.MimiOutput
或 tuple(torch.FloatTensor)
一個 transformers.models.mimi.modeling_mimi.MimiOutput
或一個 `torch.FloatTensor` 的元組(如果傳遞了 return_dict=False
或當 config.return_dict=False
時),根據配置(MimiConfig)和輸入,包含各種元素。
-
audio_codes (
torch.LongTensor
,形狀為(batch_size, num_quantizers, codes_length)
, 可選) — 使用model.encode
計算的離散碼嵌入。 -
audio_values (
torch.FloatTensor
,形狀為(batch_size, sequence_length)
, 可選) — 解碼後的音訊值,使用 Mimi 的解碼器部分獲得。 -
encoder_past_key_values (
Cache
, 可選) — 預計算的隱藏狀態(自注意力塊中的鍵和值),可用於加速編碼器 Transformer 的序列解碼。這通常包括在解碼的前一階段,當use_cache=True
或config.use_cache=True
時模型返回的past_key_values
。模型將輸出與輸入相同的快取格式。
如果使用
past_key_values
,使用者可以選擇只輸入最後的 `audio_values` 或 `audio_codes`(即那些尚未將過去的鍵值狀態提供給此模型的輸入)。 -
decoder_past_key_values (
Cache
, 可選) — 預計算的隱藏狀態(自注意力塊中的鍵和值),可用於加速解碼器 Transformer 的序列解碼。這通常包括在解碼的前一階段,當use_cache=True
或config.use_cache=True
時模型返回的past_key_values
。模型將輸出與輸入相同的快取格式。
如果使用
past_key_values
,使用者可以選擇只輸入最後的 `audio_values` 或 `audio_codes`(即那些尚未將過去的鍵值狀態提供給此模型的輸入)。
MimiModel 的 forward 方法重寫了 __call__
特殊方法。
雖然前向傳播的邏輯需要在此函式內定義,但之後應呼叫 Module
例項而不是此函式,因為前者會處理預處理和後處理步驟,而後者會靜默地忽略它們。
示例
>>> from datasets import load_dataset
>>> from transformers import AutoFeatureExtractor, MimiModel
>>> dataset = load_dataset("hf-internal-testing/ashraq-esc50-1-dog-example")
>>> audio_sample = dataset["train"]["audio"][0]["array"]
>>> model_id = "kyutai/mimi"
>>> model = MimiModel.from_pretrained(model_id)
>>> feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)
>>> inputs = feature_extractor(raw_audio=audio_sample, return_tensors="pt")
>>> outputs = model(**inputs)
>>> audio_codes = outputs.audio_codes
>>> audio_values = outputs.audio_values