Transformers 文档

MusicGen Melody

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

MusicGen Melody

PyTorch FlashAttention SDPA

概述

MusicGen Melody 模型由 Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi 和 Alexandre Défossez 在 简单可控的音乐生成 中提出。

MusicGen Melody 是一个单阶段自回归 Transformer 模型,能够根据文本描述或音频提示生成高质量的音乐样本。文本描述通过冻结的文本编码器模型,以获得隐藏状态表示序列。然后,MusicGen 被训练来预测离散的音频令牌(或*音频代码*),并以这些隐藏状态为条件。这些音频令牌随后使用音频压缩模型(例如 EnCodec)进行解码,以恢复音频波形。

通过高效的令牌交错模式,MusicGen 不需要文本/音频提示的自监督语义表示,从而无需级联多个模型来预测一组码本(例如分层或上采样)。相反,它能够一次性生成所有码本。

论文摘要如下:

我们解决了条件音乐生成任务。我们引入 MusicGen,一个单一的语言模型 (LM),它操作多个压缩离散音乐表示(即令牌)流。与之前的工作不同,MusicGen 由一个单阶段 Transformer LM 和高效的令牌交错模式组成,这消除了级联多个模型(例如分层或上采样)的需要。遵循这种方法,我们演示了 MusicGen 如何生成高质量的样本,同时以文本描述或旋律特征为条件,从而更好地控制生成的输出。我们进行了广泛的实证评估,包括自动和人工研究,表明所提出的方法在标准文本到音乐基准上优于评估的基线。通过消融研究,我们阐明了构成 MusicGen 的每个组件的重要性。

该模型由 ylacombe 贡献。原始代码可以在 此处 找到。预训练的检查点可以在 Hugging Face Hub 上找到。

与 MusicGen 的区别

与 MusicGen 有两个主要区别

  1. 这里的音频提示用作生成音频样本的条件信号,而在 MusicGen 中则用于音频续接。
  2. 条件文本和音频信号被连接到解码器的隐藏状态,而不是像 MusicGen 中那样用作交叉注意力信号。

[!NOTE] 当使用除 “eager” 之外的所有注意力实现时,`head_mask` 参数将被忽略。如果您有 `head_mask` 并希望它生效,请使用 `XXXModel.from_pretrained(model_id, attn_implementation="eager")` 加载模型

生成

MusicGen Melody 兼容两种生成模式:贪婪模式和采样模式。实际上,采样模式比贪婪模式能带来显著更好的结果,因此我们鼓励尽可能使用采样模式。采样模式默认启用,可以通过在调用 `MusicgenMelodyForConditionalGeneration.generate()` 时设置 `do_sample=True`,或者通过覆盖模型的生成配置(如下所示)来明确指定。

Transformers 支持 MusicGen Melody 的单声道(1 通道)和立体声(2 通道)变体。单声道版本生成一组码本。立体声版本生成两组码本,每个通道(左/右)一个,每组码本都通过音频压缩模型独立解码。每个通道的音频流组合在一起,形成最终的立体声输出。

音频条件生成

该模型可以通过使用 MusicgenMelodyProcessor 预处理输入,根据文本和音频提示生成音频样本。

在以下示例中,我们使用 🤗 Datasets 库加载音频文件,该库可以通过以下命令进行 pip 安装

pip install --upgrade pip
pip install datasets[audio]

我们即将使用的音频文件加载如下

>>> from datasets import load_dataset

>>> dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
>>> sample = next(iter(dataset))["audio"]

理想情况下,音频提示应不含通常由鼓和贝斯等乐器产生的低频信号。Demucs 模型可用于将人声和其他信号与鼓和贝斯部分分离。

如果您希望使用 Demucs,您首先需要遵循此处的安装步骤,然后才能使用以下代码片段

from demucs import pretrained
from demucs.apply import apply_model
from demucs.audio import convert_audio
import torch


wav = torch.tensor(sample["array"]).to(torch.float32)

demucs = pretrained.get_model('htdemucs')

wav = convert_audio(wav[None], sample["sampling_rate"], demucs.samplerate, demucs.audio_channels)
wav = apply_model(demucs, wav[None])

然后您可以使用以下代码片段生成音乐

>>> from transformers import AutoProcessor, MusicgenMelodyForConditionalGeneration

>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-melody")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> inputs = processor(
...     audio=wav,
...     sampling_rate=demucs.samplerate,
...     text=["80s blues track with groovy saxophone"],
...     padding=True,
...     return_tensors="pt",
... )
>>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

您也可以直接传递音频信号而不使用 Demucs,尽管生成质量可能会下降

>>> from transformers import AutoProcessor, MusicgenMelodyForConditionalGeneration

>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-melody")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> inputs = processor(
...     audio=sample["array"],
...     sampling_rate=sample["sampling_rate"],
...     text=["80s blues track with groovy saxophone"],
...     padding=True,
...     return_tensors="pt",
... )
>>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

音频输出是形状为 `(batch_size, num_channels, sequence_length)` 的三维 PyTorch 张量。要收听生成的音频样本,您可以在 ipynb 笔记本中播放它们

from IPython.display import Audio

sampling_rate = model.config.audio_encoder.sampling_rate
Audio(audio_values[0].numpy(), rate=sampling_rate)

或者使用第三方库(例如 `soundfile`)将其保存为 `.wav` 文件

>>> import soundfile as sf

>>> sampling_rate = model.config.audio_encoder.sampling_rate
>>> sf.write("musicgen_out.wav", audio_values[0].T.numpy(), sampling_rate)

仅文本条件生成

同样的 MusicgenMelodyProcessor 可用于预处理仅文本提示。

>>> from transformers import AutoProcessor, MusicgenMelodyForConditionalGeneration

>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-melody")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> inputs = processor(
...     text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
...     padding=True,
...     return_tensors="pt",
... )
>>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

`guidance_scale` 用于无分类器指导 (CFG),设置条件 logits(从文本提示预测)和无条件 logits(从无条件或“空”提示预测)之间的权重。更高的指导尺度鼓励模型生成与输入提示更紧密相关的样本,通常以牺牲较差的音频质量为代价。通过设置 `guidance_scale > 1` 启用 CFG。为获得最佳结果,请使用 `guidance_scale=3`(默认)。

您也可以批量生成

>>> from transformers import AutoProcessor, MusicgenMelodyForConditionalGeneration
>>> from datasets import load_dataset

>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-melody")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> # take the first quarter of the audio sample
>>> sample_1 = sample["array"][: len(sample["array"]) // 4]

>>> # take the first half of the audio sample
>>> sample_2 = sample["array"][: len(sample["array"]) // 2]

>>> inputs = processor(
...     audio=[sample_1, sample_2],
...     sampling_rate=sample["sampling_rate"],
...     text=["80s blues track with groovy saxophone", "90s rock song with loud guitars and heavy drums"],
...     padding=True,
...     return_tensors="pt",
... )
>>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

无条件生成

无条件(或“空”)生成的输入可以通过 MusicgenMelodyProcessor.get_unconditional_inputs() 方法获得

>>> from transformers import MusicgenMelodyForConditionalGeneration, MusicgenMelodyProcessor

>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")
>>> unconditional_inputs = MusicgenMelodyProcessor.from_pretrained("facebook/musicgen-melody").get_unconditional_inputs(num_samples=1)

>>> audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)

生成配置

控制生成过程的默认参数,例如采样、指导尺度和生成的令牌数量,可以在模型的生成配置中找到,并根据需要进行更新

>>> from transformers import MusicgenMelodyForConditionalGeneration

>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> # inspect the default generation config
>>> model.generation_config

>>> # increase the guidance scale to 4.0
>>> model.generation_config.guidance_scale = 4.0

>>> # decrease the max length to 256 tokens
>>> model.generation_config.max_length = 256

请注意,传递给生成方法的任何参数都将**覆盖**生成配置中的参数,因此在调用生成时设置 `do_sample=False` 将覆盖生成配置中的 `model.generation_config.do_sample` 设置。

模型结构

MusicGen 模型可分解为三个不同的阶段

  1. 文本编码器:将文本输入映射到隐藏状态表示序列。预训练的 MusicGen 模型使用来自 T5 或 Flan-T5 的冻结文本编码器。
  2. MusicGen Melody 解码器:一个语言模型 (LM),根据编码器隐藏状态表示自动回归生成音频令牌(或代码)
  3. 音频解码器:用于从解码器预测的音频令牌中恢复音频波形。

因此,MusicGen 模型既可以作为独立的解码器模型使用,对应于 MusicgenMelodyForCausalLM 类,也可以作为包含文本编码器和音频编码器的复合模型使用,对应于 MusicgenMelodyForConditionalGeneration 类。如果只需要从预训练检查点加载解码器,可以通过首先指定正确的配置来加载,或者通过复合模型的 `.decoder` 属性访问

>>> from transformers import AutoConfig, MusicgenMelodyForCausalLM, MusicgenMelodyForConditionalGeneration

>>> # Option 1: get decoder config and pass to `.from_pretrained`
>>> decoder_config = AutoConfig.from_pretrained("facebook/musicgen-melody").decoder
>>> decoder = MusicgenMelodyForCausalLM.from_pretrained("facebook/musicgen-melody", **decoder_config.to_dict())

>>> # Option 2: load the entire composite model, but only return the decoder
>>> decoder = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody").decoder

由于文本编码器和音频编码器模型在训练期间被冻结,MusicGen 解码器 MusicgenMelodyForCausalLM 可以独立地在编码器隐藏状态和音频代码的数据集上进行训练。对于推理,训练好的解码器可以与冻结的文本编码器和音频编码器结合,以恢复复合 MusicgenMelodyForConditionalGeneration 模型。

检查点转换

  • 此处下载原始检查点后,您可以使用 src/transformers/models/musicgen_melody/convert_musicgen_melody_transformers.py 提供的**转换脚本**通过以下命令进行转换
python src/transformers/models/musicgen_melody/convert_musicgen_melody_transformers.py \
    --checkpoint="facebook/musicgen-melody" --pytorch_dump_folder /output/path 

技巧

  • MusicGen 在 Encodec 的 32kHz 检查点上进行训练。您应该确保使用兼容版本的 Encodec 模型。
  • 采样模式通常比贪婪模式提供更好的结果 - 您可以通过在调用 `MusicgenMelodyForConditionalGeneration.generate()` 时使用变量 `do_sample` 来切换采样。

MusicgenMelodyDecoderConfig

class transformers.MusicgenMelodyDecoderConfig

< >

( vocab_size = 2048 max_position_embeddings = 2048 num_hidden_layers = 24 ffn_dim = 4096 num_attention_heads = 16 layerdrop = 0.0 use_cache = True activation_function = 'gelu' hidden_size = 1024 dropout = 0.1 attention_dropout = 0.0 activation_dropout = 0.0 initializer_factor = 0.02 scale_embedding = False num_codebooks = 4 audio_channels = 1 pad_token_id = 2048 bos_token_id = 2048 eos_token_id = None tie_word_embeddings = False **kwargs )

参数

  • vocab_size (int, optional, 默认为 2048) — MusicgenMelodyDecoder 模型的词汇表大小。定义了在调用 MusicgenMelodyDecoder 时传递的 inputs_ids 可以表示的不同令牌的数量。
  • max_position_embeddings (int, optional, 默认为 2048) — 此模型可能使用的最大序列长度。通常,为以防万一将其设置为较大的值(例如 512 或 1024 或 2048)。
  • num_hidden_layers (int, optional, 默认为 24) — 解码器层数。
  • ffn_dim (int, optional, 默认为 4096) — Transformer 块中“中间”(通常称为前馈)层的维度。
  • num_attention_heads (int, optional, 默认为 16) — Transformer 块中每个注意力层的注意力头数量。
  • layerdrop (float, optional, 默认为 0.0) — 解码器的 LayerDrop 概率。有关更多详细信息,请参阅 [LayerDrop 论文](参见 https://huggingface.co/papers/1909.11556)。
  • use_cache (bool, optional, 默认为 True) — 模型是否应返回最后的 key/value 注意力(并非所有模型都使用)
  • activation_function (str or function, optional, 默认为 "gelu") — 解码器和池化器中的非线性激活函数(函数或字符串)。如果是字符串,则支持 "gelu", "relu", "silu""gelu_new"
  • hidden_size (int, optional, 默认为 1024) — 层和池化层的维度。
  • dropout (float, optional, 默认为 0.1) — 嵌入、text_encoder 和池化器中所有全连接层的 dropout 概率。
  • attention_dropout (float, optional, 默认为 0.0) — 注意力概率的 dropout 比率。
  • activation_dropout (float, optional, 默认为 0.0) — 全连接层内部激活的 dropout 比率。
  • initializer_factor (float, optional, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。
  • scale_embedding (bool, optional, 默认为 False) — 通过除以 sqrt(hidden_size) 来缩放嵌入。
  • num_codebooks (int, optional, 默认为 4) — 转发到模型的并行码本数量。
  • audio_channels (int, optional, 默认为 1) — 模型使用的音频通道数(单声道或立体声)。立体声模型为左右输出通道生成单独的音频流。单声道模型生成单个音频流输出。
  • pad_token_id (int, optional, 默认为 2048) — 填充令牌的 ID。
  • bos_token_id (int, optional, 默认为 2048) — 序列开始令牌的 ID。
  • eos_token_id (int, optional) — 序列结束令牌的 ID。
  • tie_word_embeddings (bool, optional, 默认为 False) — 是否将词嵌入与文本编码器绑定。

这是用于存储 MusicgenMelodyDecoder 配置的配置类。它用于根据指定的参数实例化 Musicgen Melody 解码器,定义模型架构。使用默认值实例化配置将产生与 Musicgen Melody facebook/musicgen-melody 架构相似的配置。

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。

MusicgenMelodyProcessor

class transformers.MusicgenMelodyProcessor

< >

( feature_extractor tokenizer )

参数

  • feature_extractor (MusicgenMelodyFeatureExtractor) — MusicgenMelodyFeatureExtractor 的实例。特征提取器是必需的输入。
  • tokenizer (T5Tokenizer) — T5Tokenizer 的实例。分词器是必需的输入。

构建一个 MusicGen Melody 处理器,它封装了一个 Wav2Vec2 特征提取器(用于原始音频波形处理)和一个 T5 分词器到一个单一的处理器类中。

MusicgenProcessor 提供了 MusicgenMelodyFeatureExtractorT5Tokenizer 的所有功能。有关更多信息,请参阅 __call__()decode()

get_unconditional_inputs

< >

( num_samples = 1 return_tensors = 'pt' )

参数

  • num_samples (int, 可选) — 无条件生成的音频样本数量。

辅助函数,用于获取无条件生成所需的空输入,使模型无需特征提取器或分词器即可使用。

示例

>>> from transformers import MusicgenMelodyForConditionalGeneration, MusicgenMelodyProcessor

>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> # get the unconditional (or 'null') inputs for the model
>>> processor = MusicgenMelodyProcessor.from_pretrained("facebook/musicgen-melody")
>>> unconditional_inputs = processor.get_unconditional_inputs(num_samples=1)

>>> audio_samples = model.generate(**unconditional_inputs, max_new_tokens=256)

MusicgenMelodyFeatureExtractor

class transformers.MusicgenMelodyFeatureExtractor

< >

( feature_size = 12 sampling_rate = 32000 hop_length = 4096 chunk_length = 30 n_fft = 16384 num_chroma = 12 padding_value = 0.0 return_attention_mask = False stem_indices = [3, 2] **kwargs )

参数

  • feature_size (int, 可选, 默认为 12) — 提取特征的特征维度。
  • sampling_rate (int, 可选, 默认为 32000) — 音频文件应以赫兹 (Hz) 表示的数字化采样率。
  • hop_length (int, 可选, 默认为 4096) — 用于获取梅尔频率系数的短时傅里叶变换重叠窗口的长度。
  • chunk_length (int, 可选, 默认为 30) — 用于修剪和填充更长或更短音频序列的 sampling_rate 样本块的最大数量。
  • n_fft (int, 可选, 默认为 16384) — 傅里叶变换的大小。
  • num_chroma (int, 可选, 默认为 12) — 要使用的色度谱段数。
  • padding_value (float, 可选, 默认为 0.0) — 用于填充音频的填充值。
  • return_attention_mask (bool, 可选, 默认为 False) — 是否返回注意力掩码。可以在调用特征提取器时覆盖。

    什么是注意力掩码?

    对于 Whisper 模型,在批量推理时应始终传递 attention_mask,以避免细微的错误。

  • stem_indices (list[int], 可选, 默认为 [3, 2]) — 如果传入 demucs 输出,要提取的茎通道。

构建 MusicgenMelody 特征提取器。

此特征提取器继承自 SequenceFeatureExtractor,其中包含大多数主要方法。用户应参阅此超类以获取有关这些方法的更多信息。

此类别从 Demucs 处理的音频或直接从原始音频波形中提取色度特征。

MusicgenMelodyConfig

class transformers.MusicgenMelodyConfig

< >

( num_chroma = 12 chroma_length = 235 **kwargs )

参数

  • num_chroma (int, 可选, 默认为 12) — 要使用的色度谱段数。
  • chroma_length (int, 可选, 默认为 235) — 如果音频用于模型条件化,则为最大色度持续时间。对应于训练期间使用的最大持续时间。
  • kwargs (可选) — 关键字参数字典。特别是:

    • text_encoder (PretrainedConfig, 可选) — 定义文本编码器配置的配置对象实例。
    • audio_encoder (PretrainedConfig, 可选) — 定义音频编码器配置的配置对象实例。
    • decoder (PretrainedConfig, 可选) — 定义解码器配置的配置对象实例。

这是用于存储 MusicgenMelodyModel 配置的配置类。它用于根据指定参数实例化 Musicgen Melody 模型,定义文本编码器、音频编码器和 Musicgen Melody 解码器配置。使用默认值实例化配置将产生与 Musicgen Melody facebook/musicgen-melody 架构类似的配置。

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。

示例

>>> from transformers import (
...     MusicgenMelodyConfig,
...     MusicgenMelodyDecoderConfig,
...     T5Config,
...     EncodecConfig,
...     MusicgenMelodyForConditionalGeneration,
... )

>>> # Initializing text encoder, audio encoder, and decoder model configurations
>>> text_encoder_config = T5Config()
>>> audio_encoder_config = EncodecConfig()
>>> decoder_config = MusicgenMelodyDecoderConfig()

>>> configuration = MusicgenMelodyConfig.from_sub_models_config(
...     text_encoder_config, audio_encoder_config, decoder_config
... )

>>> # Initializing a MusicgenMelodyForConditionalGeneration (with random weights) from the facebook/musicgen-melody style configuration
>>> model = MusicgenMelodyForConditionalGeneration(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
>>> config_text_encoder = model.config.text_encoder
>>> config_audio_encoder = model.config.audio_encoder
>>> config_decoder = model.config.decoder

>>> # Saving the model, including its configuration
>>> model.save_pretrained("musicgen_melody-model")

>>> # loading model and config from pretrained folder
>>> musicgen_melody_config = MusicgenMelodyConfig.from_pretrained("musicgen_melody-model")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("musicgen_melody-model", config=musicgen_melody_config)

from_sub_models_config

< >

( text_encoder_config: PretrainedConfig audio_encoder_config: PretrainedConfig decoder_config: MusicgenMelodyDecoderConfig **kwargs ) MusicgenMelodyConfig

返回

MusicgenMelodyConfig

一个配置对象的实例

从文本编码器、音频编码器和解码器配置实例化 MusicgenMelodyConfig (或派生类)。

MusicgenMelodyModel

class transformers.MusicgenMelodyModel

< >

( config: MusicgenMelodyDecoderConfig )

参数

  • config (MusicgenMelodyDecoderConfig) — 模型的配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。有关加载模型权重的信息,请参阅 from_pretrained() 方法。

裸 Musicgen Melody 模型,输出原始隐藏状态,顶部没有任何特定头部。

此模型继承自 PreTrainedModel。有关库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)的更多信息,请参阅超类文档。

此模型也是 PyTorch torch.nn.Module 的子类。将其作为常规 PyTorch 模块使用,并参阅 PyTorch 文档以获取所有与通用用法和行为相关的事项。

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None encoder_hidden_states: typing.Optional[torch.FloatTensor] = None encoder_attention_mask: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.Tensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) transformers.modeling_outputs.BaseModelOutputWithPasttuple(torch.FloatTensor)

参数

  • input_ids (torch.LongTensor,形状为 (batch_size * num_codebooks, sequence_length)) — 词汇表中输入序列 token 的索引,对应于音频代码序列。

    可以通过使用音频编码器模型(例如 EncodecModel)编码音频提示以预测音频代码来获取索引。有关详细信息,请参阅 EncodecModel.encode()

    什么是 input ID?

    在正向传递中,input_ids 将自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果您从音频编码模型(例如 EncodecModel)获取音频代码,请确保帧数等于 1,并在将其作为 input_ids 传递之前,将音频代码从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)

  • attention_mask (torch.Tensor,形状为 (batch_size, sequence_length)可选) — 避免对填充 token 索引执行注意力的掩码。掩码值选择范围为 [0, 1]

    • 1 表示 token 未被掩码
    • 0 表示 token 已被掩码

    什么是注意力掩码?

  • encoder_hidden_states (torch.FloatTensor,形状为 (batch_size, encoder_sequence_length, hidden_size)可选) — 表示文本编码器输出和处理后的音频编码器输出串联的隐藏状态序列。用作条件信号,因此将与投影的 decoder_input_ids 串联。
  • encoder_attention_mask (torch.LongTensor,形状为 (batch_size, encoder_sequence_length)可选) — 避免对条件隐藏状态执行注意力的掩码。掩码值选择范围为 [0, 1]

    • 1 表示 token 未被掩码
    • 0 表示 token 已被掩码

    什么是注意力掩码?

  • head_mask (torch.Tensor,形状为 (num_heads,)(num_layers, num_heads)可选) — 用于使自注意力模块的选定头部无效的掩码。掩码值选择范围为 [0, 1]

    • 1 表示头部未被掩码
    • 0 表示头部已被掩码
  • past_key_values (tuple[tuple[torch.FloatTensor]], 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码前一阶段返回的 past_key_values,当 use_cache=Trueconfig.use_cache=True 时。

    允许两种格式:

    • Cache 实例,请参阅我们的 kv 缓存指南
    • 长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量)。这也被称为旧版缓存格式。

    模型将输出与输入相同的缓存格式。如果没有传递 past_key_values,则将返回旧版缓存格式。

    如果使用 past_key_values,用户可以选择只输入形状为 (batch_size, 1) 的最后 input_ids(那些没有将其过去键值状态提供给此模型的),而不是形状为 (batch_size, sequence_length) 的所有 input_ids

  • inputs_embeds (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size)可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递 input_ids。如果您希望对 input_ids 索引如何转换为相关向量比模型的内部嵌入查找矩阵有更多控制,这将很有用。
  • use_cache (bool, 可选) — 如果设置为 True,则返回 past_key_values 键值状态,可用于加速解码(请参阅 past_key_values)。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 hidden_states
  • return_dict (bool, 可选) — 是否返回 ModelOutput 而不是普通元组。

返回

transformers.modeling_outputs.BaseModelOutputWithPasttuple(torch.FloatTensor)

一个 transformers.modeling_outputs.BaseModelOutputWithPast 或一个 torch.FloatTensor 元组(如果传递 return_dict=False 或当 config.return_dict=False 时),包含取决于配置 (MusicgenMelodyConfig) 和输入的各种元素。

  • last_hidden_state (torch.FloatTensor, 形状为 (batch_size, sequence_length, hidden_size)) — 模型最后一层输出的隐藏状态序列。

    如果使用了 past_key_values,则只输出形状为 (batch_size, 1, hidden_size) 的序列的最后一个隐藏状态。

  • past_key_values (Cache, 可选,当传递 use_cache=True 或当 config.use_cache=True 时返回) — 这是一个 Cache 实例。有关更多详细信息,请参阅我们的 kv 缓存指南

    包含预计算的隐藏状态(自注意力块和交叉注意力块中的键和值,如果 config.is_encoder_decoder=True 则可选),可用于(参见 past_key_values 输入)加速顺序解码。

  • hidden_states (tuple(torch.FloatTensor), 可选,当传递 output_hidden_states=True 或当 config.output_hidden_states=True 时返回) — torch.FloatTensor 元组(一个用于嵌入层的输出,如果模型有嵌入层,加上每个层的输出)形状为 (batch_size, sequence_length, hidden_size)

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple(torch.FloatTensor), 可选,当传递 output_attentions=True 或当 config.output_attentions=True 时返回) — torch.FloatTensor 元组(每个层一个)形状为 (batch_size, num_heads, sequence_length, sequence_length)

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

MusicgenMelodyModel 的前向方法,覆盖了 __call__ 特殊方法。

虽然前向传递的配方需要在此函数中定义,但之后应该调用 Module 实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。

MusicgenMelodyForCausalLM

class transformers.MusicgenMelodyForCausalLM

< >

( config: MusicgenMelodyDecoderConfig )

参数

  • config (MusicgenMelodyDecoderConfig) — 模型的配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。有关加载模型权重的信息,请参阅 from_pretrained() 方法。

带语言建模头的 Musicgen Melody 解码器模型。

此模型继承自 PreTrainedModel。有关库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)的更多信息,请参阅超类文档。

此模型也是 PyTorch torch.nn.Module 的子类。将其作为常规 PyTorch 模块使用,并参阅 PyTorch 文档以获取所有与通用用法和行为相关的事项。

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None encoder_hidden_states: typing.Optional[torch.FloatTensor] = None encoder_attention_mask: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.Tensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None labels: typing.Optional[torch.LongTensor] = None ) transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPasttuple(torch.FloatTensor)

参数

  • input_ids (torch.LongTensor,形状为 (batch_size * num_codebooks, sequence_length)) — 词汇表中输入序列 token 的索引,对应于音频代码序列。

    可以通过使用音频编码器模型(例如 EncodecModel)编码音频提示以预测音频代码来获取索引。有关详细信息,请参阅 EncodecModel.encode()

    什么是 input ID?

    在正向传递中,input_ids 将自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果您从音频编码模型(例如 EncodecModel)获取音频代码,请确保帧数等于 1,并在将其作为 input_ids 传递之前,将音频代码从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)

  • attention_mask (torch.Tensor,形状为 (batch_size, sequence_length)可选) — 避免对填充 token 索引执行注意力的掩码。掩码值选择范围为 [0, 1]

    • 1 表示 token 未被掩码
    • 0 表示 token 已被掩码

    什么是注意力掩码?

  • encoder_hidden_states (torch.FloatTensor,形状为 (batch_size, encoder_sequence_length, hidden_size)可选) — 表示文本编码器输出和处理后的音频编码器输出串联的隐藏状态序列。用作条件信号,因此将与投影的 decoder_input_ids 串联。
  • encoder_attention_mask (torch.LongTensor,形状为 (batch_size, encoder_sequence_length)可选) — 避免对条件隐藏状态执行注意力的掩码。掩码值选择范围为 [0, 1]

    • 1 表示 token 未被掩码
    • 0 表示 token 已被掩码

    什么是注意力掩码?

  • head_mask (torch.Tensor,形状为 (num_heads,)(num_layers, num_heads)可选) — 用于使自注意力模块的选定头部无效的掩码。掩码值选择范围为 [0, 1]

    • 1 表示头部未被掩码
    • 0 表示头部已被掩码
  • past_key_values (tuple[tuple[torch.FloatTensor]], 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码前一阶段返回的 past_key_values,当 use_cache=Trueconfig.use_cache=True 时。

    允许两种格式:

    • Cache 实例,请参阅我们的 kv 缓存指南
    • 长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量)。这也被称为旧版缓存格式。

    模型将输出与输入相同的缓存格式。如果没有传递 past_key_values,则将返回旧版缓存格式。

    如果使用 past_key_values,用户可以选择只输入形状为 (batch_size, 1) 的最后 input_ids(那些没有将其过去键值状态提供给此模型的),而不是形状为 (batch_size, sequence_length) 的所有 input_ids

  • inputs_embeds (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size)可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递 input_ids。如果您希望对 input_ids 索引如何转换为相关向量比模型的内部嵌入查找矩阵有更多控制,这将很有用。
  • use_cache (bool, 可选) — 如果设置为 True,将返回 past_key_values 键值状态,可用于加速解码(参见 past_key_values)。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。更多详细信息请参见返回张量中的 attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。更多详细信息请参见返回张量中的 hidden_states
  • return_dict (bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
  • labels (torch.LongTensor,形状为 (batch_size, sequence_length, num_codebooks), 可选) — 语言模型的标签。请注意,模型内部的标签已偏移,即您可以设置 labels = input_ids。索引选择范围为 [-100, 0, ..., config.vocab_size]。所有设置为 -100 的标签将被忽略(遮蔽),损失仅针对 [0, ..., config.vocab_size] 范围内的标签计算。

返回

transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPasttuple(torch.FloatTensor)

一个 transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPast 或一个 torch.FloatTensor 的元组(如果传入 return_dict=Falseconfig.return_dict=False),包含根据配置(MusicgenMelodyConfig)和输入的不同元素。

  • loss (torch.FloatTensor 形状为 (1,)可选,当提供 labels 时返回) — 语言建模损失(用于下一个 token 预测)。

  • logits (形状为 (batch_size, sequence_length, config.vocab_size)torch.FloatTensor) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。

  • past_key_values (tuple(tuple(torch.FloatTensor)), 可选, 当传入 use_cache=Trueconfig.use_cache=True 时返回) — 长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量)

    包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见 past_key_values 输入)加速顺序解码。

  • hidden_states (tuple[torch.FloatTensor], 可选, 当传入 output_hidden_states=Trueconfig.output_hidden_states=True 时返回) — torch.FloatTensor 的元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 每个层的输出一个),形状为 (batch_size, sequence_length, hidden_size)

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple[torch.FloatTensor], 可选, 当传入 output_attentions=Trueconfig.output_attentions=True 时返回) — torch.FloatTensor 的元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

  • encoder_hidden_states (torch.FloatTensor,形状为 (batch_size, encoder_sequence_length, hidden_size), 可选) — 表示投影文本编码器输出和投影音频编码器输出的连接的条件隐藏状态序列。用作条件信号。

MusicgenMelodyForCausalLM 的 forward 方法,覆盖了 __call__ 特殊方法。

虽然前向传递的配方需要在此函数中定义,但之后应该调用 Module 实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。

示例

MusicgenMelodyForConditionalGeneration

class transformers.MusicgenMelodyForConditionalGeneration

< >

( config: MusicgenMelodyConfig = None text_encoder: typing.Optional[transformers.modeling_utils.PreTrainedModel] = None audio_encoder: typing.Optional[transformers.modeling_utils.PreTrainedModel] = None decoder: typing.Optional[transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyForCausalLM] = None )

参数

  • config (MusicgenMelodyConfig) — 模型的配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法来加载模型权重。
  • text_encoder (PreTrainedModel, 可选) — 将文本编码为用于条件生成的隐藏状态的文本编码器模型。
  • audio_encoder (PreTrainedModel, 可选) — 将音频编码为用于条件生成的隐藏状态的音频编码器模型。
  • decoder (MusicgenForCausalLM, 可选) — 根据条件信号生成音频标记的解码器模型。

Musicgen Melody 模型,用于基于其他模态(例如,图像-文本-到-文本生成)进行条件化的标记生成。

此模型继承自 PreTrainedModel。有关库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)的更多信息,请参阅超类文档。

此模型也是 PyTorch torch.nn.Module 的子类。将其作为常规 PyTorch 模块使用,并参阅 PyTorch 文档以获取所有与通用用法和行为相关的事项。

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.BoolTensor] = None input_features: typing.Optional[torch.FloatTensor] = None decoder_input_ids: typing.Optional[torch.LongTensor] = None decoder_attention_mask: typing.Optional[torch.BoolTensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None encoder_hidden_states: typing.Optional[torch.FloatTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None decoder_inputs_embeds: typing.Optional[torch.FloatTensor] = None labels: typing.Optional[torch.LongTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None **kwargs ) transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPasttuple(torch.FloatTensor)

参数

  • input_ids (torch.LongTensor,形状为 (batch_size, sequence_length), 可选) — 词汇表中输入序列标记的索引。默认情况下会忽略填充。

    索引可以使用 AutoTokenizer 获取。有关详细信息,请参见 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什么是输入 ID?

  • attention_mask (torch.BoolTensor,形状为 (batch_size, sequence_length), 可选) — 遮罩,用于避免对填充标记索引执行注意力操作。遮罩值在 [0, 1] 中选择:

    • 1 表示未被遮罩的标记,
    • 0 表示被遮罩的标记。

    什么是注意力遮罩?

  • input_features (torch.FloatTensor,形状为 (batch_size, audio_sequence_length, num_chroma)) — 输入音频特征。这应该由 MusicgenMelodyFeatureExtractor 类返回,您也可以从 AutoFeatureExtractor 中检索。有关详细信息,请参见 MusicgenMelodyFeatureExtractor.__call__()
  • decoder_input_ids (torch.LongTensor,形状为 (batch_size * num_codebooks, target_sequence_length), 可选) — 解码器输入序列标记的词汇表索引,对应于音频代码序列。

    索引可以通过使用音频编码器模型(例如 EncodecModel)对音频提示进行编码来预测音频代码来获取。有关详细信息,请参见 EncodecModel.encode()

    什么是解码器输入 ID?

    decoder_input_ids 将自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length) 在前向传播中。如果您从音频编码模型(例如 EncodecModel)获取音频代码,请确保帧数等于 1,并且在将它们作为 decoder_input_ids 传递之前,将音频代码从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)

  • decoder_attention_mask (torch.LongTensor,形状为 (batch_size, target_sequence_length), 可选) — 默认行为:生成一个在 decoder_input_ids 中忽略填充标记的张量。默认情况下也会使用因果遮罩。
  • past_key_values (tuple[tuple[torch.FloatTensor]], 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码上一阶段返回的 past_key_values,当 use_cache=Trueconfig.use_cache=True 时。

    允许两种格式:

    • 一个 Cache 实例,请参见我们的 kv 缓存指南
    • 长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量)。这也被称为旧版缓存格式。

    模型将输出与作为输入提供的缓存格式相同的缓存格式。如果没有传入 past_key_values,将返回旧版缓存格式。

    如果使用 past_key_values,用户可以选择仅输入最后一个 input_ids(那些没有将过去的键值状态提供给此模型的)形状为 (batch_size, 1),而不是所有 input_ids 形状为 (batch_size, sequence_length)

  • encoder_hidden_states (torch.FloatTensor,形状为 (batch_size, encoder_sequence_length, hidden_size), 可选) — 表示投影文本编码器输出和投影音频编码器输出的连接的条件隐藏状态序列。用作条件信号,因此将与投影的 decoder_input_ids 连接。
  • inputs_embeds (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size), 可选) — 或者,您可以选择直接传递嵌入表示,而不是传递 input_ids。如果您希望对 input_ids 索引如何转换为相关向量有比模型内部嵌入查找矩阵更多的控制,这将非常有用。
  • decoder_inputs_embeds (torch.FloatTensor,形状为 (batch_size, target_sequence_length, hidden_size), 可选) — 或者,您可以选择直接传递嵌入表示,而不是传递 decoder_input_ids。如果使用 past_key_values,则可以选择仅输入最后一个 decoder_inputs_embeds(参见 past_key_values)。如果您希望对 decoder_input_ids 索引如何转换为相关向量有比模型内部嵌入查找矩阵更多的控制,这将非常有用。

    如果 decoder_input_idsdecoder_inputs_embeds 都未设置,则 decoder_inputs_embedsinputs_embeds 的值。

  • labels (torch.LongTensor,形状为 (batch_size, sequence_length, num_codebooks), 可选) — 语言模型的标签。请注意,模型内部的标签已偏移,即您可以设置 labels = input_ids。索引选择范围为 [-100, 0, ..., config.vocab_size]。所有设置为 -100 的标签将被忽略(遮罩),损失仅针对 [0, ..., config.vocab_size] 范围内的标签计算。
  • use_cache (bool, 可选) — 如果设置为 True,将返回 past_key_values 键值状态,可用于加速解码(参见 past_key_values)。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。更多详细信息请参见返回张量中的 attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。更多详细信息请参见返回张量中的 hidden_states
  • return_dict (bool, 可选) — 是否返回 ModelOutput 而不是普通元组。

返回

transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPasttuple(torch.FloatTensor)

一个 transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPast 或一个 torch.FloatTensor 的元组(如果传入 return_dict=Falseconfig.return_dict=False),包含根据配置(MusicgenMelodyConfig)和输入的不同元素。

  • loss (torch.FloatTensor 形状为 (1,)可选,当提供 labels 时返回) — 语言建模损失(用于下一个 token 预测)。

  • logits (形状为 (batch_size, sequence_length, config.vocab_size)torch.FloatTensor) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。

  • past_key_values (tuple(tuple(torch.FloatTensor)), 可选, 当传入 use_cache=Trueconfig.use_cache=True 时返回) — 长度为 config.n_layerstuple(torch.FloatTensor) 元组,每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量)

    包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见 past_key_values 输入)加速顺序解码。

  • hidden_states (tuple[torch.FloatTensor], 可选, 当传入 output_hidden_states=Trueconfig.output_hidden_states=True 时返回) — torch.FloatTensor 的元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 每个层的输出一个),形状为 (batch_size, sequence_length, hidden_size)

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple[torch.FloatTensor], 可选, 当传入 output_attentions=Trueconfig.output_attentions=True 时返回) — torch.FloatTensor 的元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

  • encoder_hidden_states (torch.FloatTensor,形状为 (batch_size, encoder_sequence_length, hidden_size), 可选) — 表示投影文本编码器输出和投影音频编码器输出的连接的条件隐藏状态序列。用作条件信号。

MusicgenMelodyForConditionalGeneration 的 forward 方法,覆盖了 __call__ 特殊方法。

虽然前向传递的配方需要在此函数中定义,但之后应该调用 Module 实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。

示例

>>> from transformers import AutoProcessor, MusicgenMelodyForConditionalGeneration
>>> import torch

>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-melody")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")

>>> inputs = processor(
...     text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
...     padding=True,
...     return_tensors="pt",
... )

>>> pad_token_id = model.generation_config.pad_token_id
>>> decoder_input_ids = (
...     torch.ones((inputs.input_ids.shape[0] * model.decoder.num_codebooks, 1), dtype=torch.long)
...     * pad_token_id
... )

>>> logits = model(**inputs, decoder_input_ids=decoder_input_ids).logits
>>> logits.shape  # (bsz * num_codebooks, encoder_len + tgt_len, vocab_size)
torch.Size([8, 249, 2048])
< > 在 GitHub 上更新