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从神经音频编解码器的残差量化器中生成语音标记,同时将其自身语音和用户语音分别建模为并行流。这允许去除显式的说话者轮次,并建模任意对话动态。我们进一步扩展了先前工作的分层语义到声学标记生成,首先预测时间对齐的文本标记作为音频标记的前缀。这种“内心独白”方法不仅显著提高了生成语音的语言质量,还展示了如何提供流式语音识别和文本到语音。我们的最终模型是第一个实时全双工语音大语言模型,理论延迟为160毫秒,实际延迟为200毫秒,可在github.com/kyutai-labs/moshi上获取。
其架构基于Encodec,但有以下几个主要区别:
- 它使用了更低的帧率。
- 它使用额外的转换器进行编码和解码,以实现更好的潜在上下文化
- 它使用了一种不同的量化方案:一个码本专门用于语义投影。
使用示例
这里是一个如何使用该模型编码和解码音频的快速示例:
>>> 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
类 transformers.MimiConfig
< source >( 采样率 = 24000 帧率 = 12.5 音频通道 = 1 隐藏层大小 = 512 滤波器数量 = 64 残差层数量 = 1 上采样比率 = None 卷积核大小 = 7 最后卷积核大小 = 3 残差卷积核大小 = 3 扩张增长率 = 2 使用因果卷积 = True 填充模式 = 'constant' 压缩 = 2 右侧修剪比率 = 1.0 码本大小 = 2048 码本维度 = 256 量化器数量 = 32 使用卷积捷径 = False 向量量化隐藏维度 = 256 语义量化器数量 = 1 上采样组 = 512 隐藏层数量 = 8 中间层大小 = 2048 注意力头数量 = 8 键值头数量 = 8 头维度 = None 隐藏层激活函数 = 'gelu' 最大位置嵌入 = 8000 初始化范围 = 0.02 归一化epsilon = 1e-05 使用缓存 = False rope_theta = 10000.0 滑动窗口 = 250 注意力丢弃率 = 0.0 层缩放初始比例 = 0.01 注意力偏置 = False **kwargs )
参数
- sampling_rate (
int
, optional, defaults to 24000) — 音频波形应被数字化的采样率,以赫兹(Hz)表示。 - frame_rate (
float
, optional, defaults to 12.5) — 模型的帧率。 - audio_channels (
int
, optional, 默认为 1) — 音频数据中的通道数。1 表示单声道,2 表示立体声。 - hidden_size (
int
, optional, 默认为 512) — 中间表示的维度。 - num_filters (
int
, 可选, 默认为 64) — 第一个MimiConv1d
下采样层的卷积核数量。 - num_residual_layers (
int
, optional, defaults to 1) — 残差层的数量。 - upsampling_ratios (
Sequence[int]
, 可选) — 内核大小和步幅比率。编码器使用下采样比率而不是上采样比率,因此它将使用与此处指定的比率相反的顺序,这些比率必须与解码器顺序匹配。 如果未指定,将默认为[8, 6, 5, 4]
- kernel_size (
int
, optional, defaults to 7) — 初始卷积的核大小。 - last_kernel_size (
int
, optional, defaults to 3) — 最后一个卷积层的核大小。 - residual_kernel_size (
int
, optional, defaults to 3) — 残差层的核大小。 - dilation_growth_rate (
int
, optional, defaults to 2) — 每层增加多少扩张率. - use_causal_conv (
bool
, optional, defaults toTrue
) — 是否使用完全因果卷积。 - pad_mode (
str
, optional, defaults to"constant"
) — 卷积的填充模式。 - compress (
int
, optional, defaults to 2) — 残差分支中的降维。 - trim_right_ratio (
float
, 可选, 默认为 1.0) — 在use_causal_conv = True
设置下,用于在转置卷积的右侧进行修剪的比例。如果 等于1.0,意味着所有的修剪都在右侧进行。 - codebook_size (
int
, optional, defaults to 2048) — 每个代码本中的离散代码数量。 - codebook_dim (
int
, 可选, 默认为 256) — 未量化的码书向量的维度。如果未定义,则使用hidden_size
. - num_quantizers (
int
, optional, defaults to 32) — 量化器中的量化器通道或码本的数量。 - use_conv_shortcut (
bool
, 可选, 默认为False
) — 是否在MimiResnetBlock
块中使用卷积层作为“跳过”连接。如果为 False, 将使用恒等函数,提供一个通用的残差连接。 - vector_quantization_hidden_dimension (
int
, optional, defaults to 256) — 残差向量量化空间中的中间表示维度。 - num_semantic_quantizers (
int
, 可选, 默认为 1) — 语义量化器中的语义量化通道或码本的数量。必须小于num_quantizers
. - upsample_groups (
int
, optional, 默认为 512) — 如果frame_rate!=encodec_frame_rate
,表示在上采样操作中用于从一个速率转换到另一个速率的组数。 - num_hidden_layers (
int
, optional, 默认为 8) — Transformer 模型中的隐藏层数量。 - intermediate_size (
int
, optional, 默认为 2048) — MLP 表示的维度。 - num_attention_heads (
int
, optional, 默认为 8) — Transformer 编码器中每个注意力层的注意力头数。 - num_key_value_heads (
int
, 可选, 默认为 8) — 这是用于实现分组查询注意力(Grouped Query Attention)的键值头数量。如果num_key_value_heads=num_attention_heads
,模型将使用多头注意力(MHA),如果num_key_value_heads=1
,模型将使用多查询注意力(MQA),否则将使用GQA。当 将多头检查点转换为GQA检查点时,每个组的键和值头应通过平均池化该组中的所有原始头来构建。 更多详情请查看这篇论文。如果未指定,将默认为8
. - head_dim (
int
, optional, defaults tohidden_size // num_attention_heads
) — 注意力头的维度. - hidden_act (
str
或function
, 可选, 默认为"gelu"
) — 解码器中的非线性激活函数(函数或字符串)。 - max_position_embeddings (
int
, optional, 默认为 8000) — 该模型可能使用的最大序列长度。Mimi 的滑动窗口注意力机制允许最多 8000 个标记的序列。 - initializer_range (
float
, 可选, 默认值为 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。 - norm_eps (
float
, optional, 默认为 1e-05) — LayerNorm 归一化层使用的 epsilon 值。 - use_cache (
bool
, 可选, 默认为False
) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。仅在config.is_decoder=True
时相关。 - rope_theta (
float
, optional, 默认为 10000.0) — RoPE 嵌入的基础周期。 - sliding_window (
int
, 可选, 默认为 250) — 滑动窗口注意力窗口大小。如果未指定,将默认为250
. - attention_dropout (
float
, optional, 默认为 0.0) — 注意力概率的丢弃比例。 - layer_scale_initial_scale (
float
, optional, 默认为 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
类 transformers.MimiModel
< source >( config: MimiConfig )
参数
- config (MimiConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化时不会加载与模型相关的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
Mimi神经音频编解码器模型。 该模型继承自PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
解码
< source >( audio_codes: Tensor padding_mask: typing.Optional[torch.Tensor] = None decoder_past_key_values: typing.Union[transformers.cache_utils.Cache, typing.List[torch.FloatTensor], NoneType] = None return_dict: typing.Optional[bool] = None )
参数
- audio_codes (
torch.LongTensor
形状为(batch_size, num_quantizers, codes_length)
, 可选) — 使用model.encode
计算的离散代码嵌入. - padding_mask (
torch.Tensor
of shape(batch_size, channels, sequence_length)
) — 指示哪些输入由于填充而被忽略,其中元素为1表示未屏蔽,0表示屏蔽. - decoder_past_key_values (
Cache
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the decoder transformer. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.模型将输出与输入相同的缓存格式。
如果使用了
past_key_values
,用户可以选择仅输入最后的audio_values
或`audio_codes(那些没有将其过去的关键值状态提供给此模型的)。 - return_dict (
bool
, 可选) — 是否返回一个ModelOutput而不是一个普通的元组。
将给定的帧解码为输出音频波形。
请注意,输出可能比输入稍大。在这种情况下,可以修剪末尾的任何额外步骤。
编码
< source >( input_values: Tensor padding_mask: Tensor = None num_quantizers: typing.Optional[float] = None encoder_past_key_values: typing.Union[transformers.cache_utils.Cache, typing.List[torch.FloatTensor], NoneType] = None return_dict: typing.Optional[bool] = None )
参数
- input_values (
torch.Tensor
of shape(batch_size, channels, sequence_length)
) — 输入音频波形的浮点值。 - padding_mask (
torch.Tensor
of shape(batch_size, channels, sequence_length)
) — 指示哪些输入由于填充而被忽略,其中元素为1表示未屏蔽,0表示屏蔽. - num_quantizers (
int
, 可选) — 使用的量化器(即码本)数量。默认情况下,使用所有量化器。 - encoder_past_key_values (
Cache
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the encoder transformer. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.模型将输出与输入相同的缓存格式。
如果使用了
past_key_values
,用户可以选择只输入最后的audio_values
或`audio_codes(那些没有将其过去的关键值状态提供给此模型的)。 - return_dict (
bool
, 可选) — 是否返回一个ModelOutput而不是一个普通的元组。
将输入的音频波形编码为离散代码。
前进
< source >( 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[transformers.cache_utils.Cache, typing.List[torch.FloatTensor], NoneType] = None decoder_past_key_values: typing.Union[transformers.cache_utils.Cache, typing.List[torch.FloatTensor], NoneType] = None return_dict: typing.Optional[bool] = None ) → transformers.models.mimi.modeling_mimi.MimiOutput
或 tuple(torch.FloatTensor)
参数
- input_values (
torch.FloatTensor
of shape(batch_size, channels, sequence_length)
, optional) — 原始音频输入转换为浮点数。 - padding_mask (
torch.Tensor
of shape(batch_size, sequence_length)
, optional) — 指示哪些输入由于填充而被忽略,其中元素为1表示未屏蔽,0表示屏蔽. - num_quantizers (
int
, 可选) — 使用的量化器(即码本)数量。默认情况下,使用所有量化器。 - audio_codes (
torch.LongTensor
形状为(batch_size, num_quantizers, codes_length)
, 可选) — 使用model.encode
计算的离散代码嵌入. - encoder_past_key_values (
Cache
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the encoder transformer. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.模型将输出与输入相同的缓存格式。
如果使用了
past_key_values
,用户可以选择只输入最后的audio_values
或`audio_codes(那些没有将其过去的关键值状态提供给此模型的)。 - decoder_past_key_values (
Cache
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the decoder transformer. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.模型将输出与输入相同的缓存格式。
如果使用了
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
, 可选) — 预先计算的隐藏状态(自注意力块中的键和值),可用于加速编码器变压器的顺序解码。 这通常包括模型在解码的先前阶段返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values
,用户可以选择仅输入最后的audio_values
或 `audio_codes(那些没有将其过去的键值状态提供给此模型的)。 -
decoder_past_key_values (
Cache
, 可选) — 预先计算的隐藏状态(自注意力块中的键和值),可用于加速解码器变压器的顺序解码。 这通常包括模型在解码的先前阶段返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values
,用户可以选择仅输入最后的audio_values
或 `audio_codes(那些没有将其过去的键值状态提供给此模型的)。
MimiModel 的前向方法,重写了 __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