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