MusicGen Melody
概览
MusicGen Melody模型由Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi和Alexandre Défossez在《简单可控音乐生成》一文中提出,该文链接为:https://arxiv.org/abs/2306.05284。
MusicGen Melody是一个单阶段的自回归Transformer模型,能够根据文本描述或音频提示生成高质量的音乐样本。文本描述通过一个冻结的文本编码器模型来获得一系列隐藏状态表示。MusicGen随后被训练以基于这些隐藏状态预测离散的音频标记,或音频代码。这些音频标记随后使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。
通过高效的标记交错模式,MusicGen不需要文本/音频提示的自监督语义表示,从而消除了级联多个模型(例如,分层或上采样)来预测一系列代码簿的需要。相反,它能够在单次前向传输中生成本的所有代码簿。
该论文的摘要如下:
我们解决了条件音乐生成问题。我们介绍了MusicGen,这是一个在多个压缩离散音乐表示(即标记)流上操作的单一语言模型。不同于以前的成果,MusicGen由单阶段的Transformer语言模型和高效的标记交错模式组成,取消了级联多个模型的需要。采用这种方法,我们展示了MusicGen如何根据文本描述或旋律特征生成高质量样本,从而更好地控制生成输出。我们进行了广泛的实证评估,包括自动和人类研究,显示出所提出的方法在标准文本到音乐基准上优于评估的基线。通过消融研究,我们揭示了MusicGen每个组件的重要性。
此模型由ylacombe提供。原始代码可在此处找到。预训练的检查点可在Hugging Face Hub上找到。
与MusicGen的不同之处
与MusicGen的两种主要不同之处:
- 在此处,音频提示用作生成音频样本的条件信号,而在MusicGen中,它用于音频延续。
- 条件文本和音频信号被连接到解码器的隐藏状态,而不是像MusicGen那样用作跨注意力信号。
生成
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)
的三维Torch张量。要播放生成的音频样本,可以将其在ipynb笔记本中播放,或者使用第三方库(例如soundfile)将其保存为.wav
文件
from IPython.display import Audio
sampling_rate = model.config.audio_encoder.sampling_rate
Audio(audio_values[0].numpy(), rate=sampling_rate)
或者
>>> 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)中使用,设置条件对数(从文本提示预测而来)和无条件对数(从无条件或“空”提示预测而来)之间的权重。更高的引导比例鼓励模型生成与输入提示更紧密相关的样本,通常以牺牲声音品质为代价。通过设置 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")
>>>
>>> sample_1 = sample["array"][: len(sample["array"]) // 4]
>>>
>>> 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")
>>>
>>> model.generation_config
>>>
>>> model.generation_config.guidance_scale = 4.0
>>>
>>> model.generation_config.max_length = 256
请注意,传递给 generate 方法的任何参数都将 覆盖 生成配置中的参数,因此,在调用 generate 时设置 do_sample=False
将覆盖生成配置中 model.generation_config.do_sample
的设置。
模型结构
MusicGen模型可以被分解为三个不同的阶段
- 文本编码器:将文本输入映射到一系列隐藏状态表示。预训练的MusicGen模型使用来自T5或Flan-T5的冻结文本编码器。
- MusicGen旋律解码器:一种语言模型(LM),可以根据编码器的隐藏状态表示自回归地生成音频标记(或代码)
- 音频解码器:用于从解码器预测的音频标记中恢复音频波形。
因此,MusicGen模型可以作为独立的解码器模型使用,对应于类MusicgenMelodyForCausalLM,或作为包含文本编码器和音频编码器的复合模型使用,对应于类MusicgenMelodyForConditionalGeneration。如果只需要加载预训练的检查点中的解码器,可以通过首先指定正确的配置,或通过复合模型的.decoder
属性访问
>>> from transformers import AutoConfig, MusicgenMelodyForCausalLM, MusicgenMelodyForConditionalGeneration
>>>
>>> decoder_config = AutoConfig.from_pretrained("facebook/musicgen-melody").decoder
>>> decoder = MusicgenMelodyForCausalLM.from_pretrained("facebook/musicgen-melody", **decoder_config.to_dict())
>>>
>>> decoder = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody").decoder
由于文本编码器和音频编码器模型在训练期间被冻结,MusicGen解码器MusicgenMelodyForCausalLM可以独立于编码器隐藏状态和音频代码的数据集进行训练。对于推理,训练好的解码器可以与冻结的文本编码器和音频编码器结合,以恢复复合的MusicgenMelodyForConditionalGeneration模型。
检查点转换
- 在从此处下载数据的原始检查点后,可以使用位于
src/transformers/models/musicgen_melody/convert_musicgen_melody_transformers.py
的conversion script
对其进行转换,命令如下:
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
类 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
, 可选,默认为 2048) — MusicgenMelodyDecoder 模型的词汇表大小。定义了当调用 MusicgenMelodyDecoder
时可以通过 inputs_ids
传递的不同标记的数量。 - max_position_embeddings (
int
, 可选,默认为 2048) — 该模型可能使用的最大序列长度。通常,为了安全起见,设为较大的值(例如,512 或 1024 或 2048)。 - num_hidden_layers (
int
, 可选,默认为 24) — 解码器层数量。 - ffn_dim (
int
, 可选, 默认为 4096) — 变换器块中“中间层”(通常称为前馈神经网络)的维度。 - num_attention_heads (
int
, 可选, 默认为 16) — 变换器块中每个注意力层的注意力头数。 - layerdrop (
float
, 可选, 默认为 0.0) — 解码器的 LayerDrop 概率。请参阅[LayerDrop 论文](see https://arxiv.org/abs/1909.11556)了解详细信息。 - use_cache (
bool
, 可选, 默认为 True
) — 模型是否返回最后的键/值注意力(不是所有模型都使用) - activation_function (
str
或 function
, 可选, 默认为 "gelu"
) — 解码器和池器中的非线性激活函数(函数或字符串)。如果为字符串,支持 "gelu"
、"relu"
、"silu"
和 "gelu_new"
。 - hidden_size (
int
, 可选, 默认为 1024) — 层和池器层的维度。 - dropout (
float
, 可选, 默认为0.1) — 在嵌入层、文本编码器以及池化器中的所有全连接层的dropout概率。 - attention_dropout (
float
, 可选, 默认为0.0) — 注意力概率的dropout比率。 - activation_dropout (
float
, 可选, 默认为0.0) — 全连接层内激活的dropout比率。 - initializer_factor (
float
, 可选,默认为 0.02) — 初始化所有权重矩阵的截断正态初始化器的标准差。 - scale_embedding (
bool
, 可选,默认为 False
) — 通过除以 sqrt(hidden_size) 来缩放嵌入。 - num_codebooks (
int
, 可选,默认为 4) — 传送到模型中的并行代码簿数量。 - audio_channels (
int
, optional, defaults to 1) — 模型使用的音频通道数(单声或立体声)。立体声模型为左右输出通道生成单独的音频流。单声模型生成单个音频流输出。 - pad_token_id (
int
, optional, defaults to 2048) — 填充令牌的id。 - bos_token_id (
int
, optional, defaults to 2048) — 序列开始令牌的id。 - eos_token_id (
int
, 可选) — 序列结束令牌的id。 - tie_word_embeddings (
bool
, 可选) 当使用默认值时为 False
— 是否将词汇嵌入与文本编码器绑定。
这是存储 MusicgenMelodyDecoder
配置的配置类。它用于根据指定参数实例化 Musicgen 旋律解码器,定义模型架构。使用默认值实例化配置将产生类似 Musicgen 旋律解码器 facebook/musicgen-melody 架构的配置。
配置对象继承自 PretrainedConfig,可以用来控制模型输出。更多信息请参阅 PretrainedConfig 文档。
MusicgenMelodyProcessor
class transformers.MusicgenMelodyProcessor
< source > ( feature_extractor tokenizer )
参数
- feature_extractor (
MusicgenMelodyFeatureExtractor
) — 一个 MusicgenMelodyFeatureExtractor 实例。特性提取器是输入所必需的。 - tokenizer (
T5Tokenizer
) — 一个 T5Tokenizer 实例。分词器是输入所必需的。
构建了一个 MusicGen Melody 处理器,将 Wav2Vec2 特征提取器(用于原始音频波形处理)和 T5 分词器封装到一个处理器类中。
MusicgenProcessor 提供了 MusicgenMelodyFeatureExtractor 和 T5Tokenizer 的所有功能。有关更多信息,请参阅 __call__()
和 decode()。
get_unconditional_inputs
< source > ( num_samples = 1 return_tensors = 'pt' )
参数
- num_samples (int, 可选) — 无条件生成音频样本的数量。
用于获取无条件生成所需空输入的辅助函数,允许模型在不使用特征提取器或分词器的情况下使用。
示例
>>> from transformers import MusicgenMelodyForConditionalGeneration, MusicgenMelodyProcessor
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("facebook/musicgen-melody")
>>>
>>> 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
( 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) — 提取特征的特征维度。 - 采样率 (
int
, 可选, 默认为32000) — 应以赫兹(Hz)表示的音频文件数字化时的采样率。 - 跳长 (
int
, 可选, 默认为4096) — 用于获取梅尔频率系数的STFT中重叠窗口的长度。 - 分块长度 (
int
, 可选, 默认为30) — 用于修剪和填充较长或较短的音频序列的 采样率
样本块的最大数量。 - n_fft (
int
, 可选, 默认值 16384) — 傅里叶变换的大小。 - num_chroma (
int
, 可选, 默认值 12) — 使用的音调 bins 数量。 - padding_value (
float
, 可选, 默认值 0.0) — 用于填充音频的填充值。 - return_attention_mask (bool,可选,默认为False) — 是否返回注意力掩码。在调用特征提取器时可以覆盖。
什么是注意力掩码?
对于Whisper模型,进行批推理时,应始终传递attention_mask
,以避免微妙的错误。
- stem_indices (
List[int]
,可选,默认为[3, 2]) — 如果传递了demucs的输出,则提取的分支通道。
构建一个MusicgenMelody特征提取器。
此特征提取器继承了SequenceFeatureExtractor,其中包含大多数主要方法。用户应参考这个超类以了解有关这些方法的更多信息。
此类从Demucs处理过的音频或从原始音频波形直接提取音程特征。
( audio sampling_rate = None )
参数
- audio (
torch.Tensor
of shape (batch_size, num_stems, channel_size, audio_length)
) — 待处理的 Demucs 模型的输出。/* HTML_TAG_END */ - sampling_rate (
int
, 可选) — Demucs 采样率。如未指定,默认为 44000
。/* HTML_TAG_END */
从 Demucs 音频分离模型的输出中提取声道,然后转换为单声道并重采样到特征提取器的采样率。
MusicgenMelodyConfig
类 transformers.MusicgenMelodyConfig
< source > ( num_chroma = 12 chroma_length = 235 **kwargs )
参数
- num_chroma (
int
, 可选, 默认为 12) — 要使用的音色分桶数。 - chroma_length (
int
, 可选, 默认为 235) — 如果使用音频来控制模型,则最大音色持续时间。对应于训练过程中使用的最大持续时间。 - kwargs (optional) — 关键字参数字典。特别包括:
- text_encoder (预训练配置, optional) — 定义文本编码器配置的配置对象实例。
- audio_encoder (预训练配置, optional) — 定义音频编码器配置的配置对象实例。
- decoder (预训练配置, optional) — 定义解码器配置的配置对象实例。
这是存储 MusicgenMelodyModel 配置的配置类。它用于根据指定的参数实例化一个 Musicgen Melody 模型,定义文本编码器、音频编码器和 Musicgen Melody 解码器配置。使用默认值实例化配置将产生类似于 Musicgen Melody facebook/musicgen-melody 体系结构的配置。
配置对象继承自 PretrainedConfig,可以用来控制模型输出。更多信息请参阅 PretrainedConfig 文档。
示例
>>> from transformers import (
... MusicgenMelodyConfig,
... MusicgenMelodyDecoderConfig,
... T5Config,
... EncodecConfig,
... MusicgenMelodyForConditionalGeneration,
... )
>>>
>>> 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
... )
>>>
>>> model = MusicgenMelodyForConditionalGeneration(configuration)
>>>
>>> configuration = model.config
>>> config_text_encoder = model.config.text_encoder
>>> config_audio_encoder = model.config.audio_encoder
>>> config_decoder = model.config.decoder
>>>
>>> model.save_pretrained("musicgen_melody-model")
>>>
>>> musicgen_melody_config = MusicgenMelodyConfig.from_pretrained("musicgen_melody-model")
>>> model = MusicgenMelodyForConditionalGeneration.from_pretrained("musicgen_melody-model", config=musicgen_melody_config)
MusicgenMelodyModel
类 transformers.MusicgenMelodyModel
< 源 > ( config: MusicgenMelodyDecoderConfig )
裸MusicgenMelody解码模型输出原始隐藏状态,没有顶部任何的具体头。
Musigen Melody模型是在Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi、Alexandre Défossez在简单且可控的音乐生成(Simple and Controllable Music Generation)一文中提出的。这是一个仅在条件音乐生成任务上训练的仅解码器transformer。
该模型从PreTrainedModel继承。查看超级类文档以了解库实现的所有模型(如下载或保存、调整输入嵌入大小、剪枝头部等)的通用方法。
该模型同时也是一个 PyTorch torch.nn.Module 子类。将其作为常规的 PyTorch 模块使用,并参阅 PyTorch 文档了解所有有关通用使用和行为的内容。
forward
< source > ( input_ids: LongTensor = None attention_mask: Optional = None encoder_hidden_states: Optional = None encoder_attention_mask: Optional = None head_mask: Optional = None past_key_values: Optional = None inputs_embeds: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None )
参数
- input_ids (
torch.LongTensor
形状 (batch_size * num_codebooks, sequence_length)
) — 输入序列标记语的索引,对应于音频代码序列。 可以通过对音频提示进行编码(比如使用 EncodecModel)以预测音频代码来获得索引。有关详细信息,请参阅 EncodecModel.encode。
什么是输入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)
,可选) — 避免在填充标记索引上执行注意力的掩码。在代码 [0, 1]
中选择掩码值: 什么是注意力掩码?
- encoder_hidden_states (
torch.FloatTensor
of shape (batch_size, encoder_sequence_length, hidden_size)
, optional) — 代表文本编码器输出和处理过的音频编码器输出的隐藏状态序列。用作条件信号,并将与投影的 decoder_input_ids
连接。 - encoder_attention_mask (
torch.LongTensor
of shape (batch_size, encoder_sequence_length)
, optional) — 用于避免在条件隐藏状态上执行注意力的掩码。掩码值选择在 [0, 1]
: - 1 表示 未掩码 的语素;
- 0 表示 掩码 的语素。
注意掩码是什么?
- head_mask (
torch.Tensor
of shape (decoder_layers, decoder_attention_heads)
, optional) — 用于屏蔽注意力模块中选定头部的掩码。掩码值选择在 [0, 1]
: - past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,当传递use_cache=True
或当config.use_cache=True
时返回)—长度为config.n_layers
的tuple(tuple(torch.FloatTensor))
元组,每个内部的元组包含具有形状(batch_size, num_heads, sequence_length, embed_size_per_head)
的两个张量。 包含预先计算的隐藏状态(在自注意力块中的键和值),这些状态可用于(参见past_key_values
输入)以加快序列解码的速度。
如果使用past_key_values
,则用户可以可选地只输入最后一个decoder_input_ids
(那些没有将过去键值状态提供给此模型的)(形状为(batch_size, 1)
),而不是所有decoder_input_ids
(形状为(batch_size, sequence_length)
)。
- inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
,可选)——除了传递input_ids
之外,您还可以选择直接传递嵌入表示。当希望比模型内部嵌入查找矩阵有更多控制权地将input_ids
索引转换为相关向量时,这很有用。 - output_attentions (
bool
,可选)——是否返回所有注意力的张量。有关更多详细信息,请参见返回的张量下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。更多详细信息请参考返回的张量中的 hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个ModelOutput而不是一个普通的元组。
MusicgenMelodyModel的前向方法,覆盖了__call__
特殊方法。
尽管前向传递的配方需要在这个函数中定义,但应该使用Module
实例来调用它而不是这个(因为前者负责运行前处理和后处理步骤,而后者会默默地忽略它们)。
MusicgenMelodyForCausalLM
类 transformers.MusicgenMelodyForCausalLM
< source > ( config: MusicgenMelodyDecoderConfig )
带有语言模型头的 Musicgen Melody 解码模型。
Musigen Melody模型是在Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi、Alexandre Défossez在简单且可控的音乐生成(Simple and Controllable Music Generation)一文中提出的。这是一个仅在条件音乐生成任务上训练的仅解码器transformer。
该模型从PreTrainedModel继承。查看超级类文档以了解库实现的所有模型(如下载或保存、调整输入嵌入大小、剪枝头部等)的通用方法。
该模型同时也是一个 PyTorch torch.nn.Module 子类。将其作为常规的 PyTorch 模块使用,并参阅 PyTorch 文档了解所有有关通用使用和行为的内容。
forward
< source > ( input_ids: LongTensor = None attention_mask: Optional = None encoder_hidden_states: Optional = None encoder_attention_mask: Optional = None head_mask: Optional = None past_key_values: Optional = None inputs_embeds: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None labels: Optional = None ) → transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPast
或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
格式 (batch_size * num_codebooks, sequence_length)
) — 词汇表中的输入序列令牌索引,对应于音频代码序列。 可以通过使用音频编码模型将音频提示编码以预测音频代码来获取索引,例如使用 EncodecModel。有关详细信息,请参阅 EncodecModel.encode()。
什么是输入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)
,可选) — 用于避免在对填充令牌索引执行注意力的掩码。掩码值选择在 [0, 1]
: 什么是注意力掩码?
- encoder_hidden_states (
torch.FloatTensor
of shape (batch_size, encoder_sequence_length, hidden_size)
, optional) — 表示文本编码器和处理过的音频编码器输出拼接的隐藏状态序列。用作条件信号,将与其拼接的 decoder_input_ids
连接。 - encoder_attention_mask (
torch.LongTensor
of shape (batch_size, encoder_sequence_length)
, optional) — 用于避免在条件隐藏状态上执行注意力的掩码。掩码值在 [0, 1]
内选择: - 1 表示 未掩码 的标记;
- 0 表示 掩码 的标记。
什么是注意力掩码?
- head_mask (
torch.Tensor
of shape (decoder_layers, decoder_attention_heads)
, optional) — 用于屏蔽注意力模块选定头部的掩码。掩码值在 [0, 1]
内选择: - past_key_values (
tuple(tuple(torch.FloatTensor))
, 可选,当传递 use_cache=True
或当 config.use_cache=True
时返回) — 长度为 config.n_layers
的 tuple(tuple(torch.FloatTensor))
,每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。 - inputs_embeds (
torch.FloatTensor
的形状为 (batch_size, sequence_length, hidden_size)
, 可选) — 可选地,您可以选择直接传递一个嵌入表示,而不是传递 input_ids
。当您想要对如何将 input_ids
的索引转换为相关向量有更多控制时,这很有用,比模型的内部嵌入查找矩阵更强大。 - 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.MusicgenMelodyOutputWithPast
或 tuple(torch.FloatTensor)
一个 transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPast
或一个由 torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含根据配置(MusicgenMelodyConfig)和输入的不同元素。
-
loss(《torch.FloatTensor》形状为 (1,)
,可选,当提供 labels
时返回)— 语言模型损失(用于下一个标记的预测)。
-
logits (torch.FloatTensor
的形状为(batch_size, sequence_length, config.vocab_size)
) — 语言模型头部预测得分(SoftMax之前每个词汇单元的得分)。
-
past_key_values (tuple(tuple(torch.FloatTensor))
),可选,在传递use_cache=True
或config.use_cache=True
时返回 — 长度为config.n_layers
的tuple(torch.FloatTensor)
的元组,每个元组包含两个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量
包含预先计算的隐藏状态(自我关注块中的键和值),可以用作(参见past_key_values
输入)来加速顺序解码。
-
hidden_states (tuple(torch.FloatTensor)
),可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回 — 由形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
组成(如果有嵌入层,则为嵌入层的输出,加上每个层的输出)。
模型的每个层的隐藏状态输出以及可选的初始嵌入输出。
-
attentions (tuple(torch.FloatTensor)
),可选,在传递output_attentions=True
或config.output_attentions=True
时返回 — 每个层的形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
的元组。
注意力softmax之后的注意力权重,用于计算自我关注头部中的加权平均值。
-
encoder_hidden_states (torch.FloatTensor
的形状为(batch_size, encoder_sequence_length, hidden_size)
),可选 — 由绘制的文本编码器和绘制的音频编码器输出拼接而成的条件隐藏状态序列。用作条件信号。
MusicgenMelodyForCausalLM前向方法,覆盖了特殊方法__call__
。
尽管前向传递的配方需要在这个函数中定义,但应该使用Module
实例来调用它而不是这个(因为前者负责运行前处理和后处理步骤,而后者会默默地忽略它们)。
点击以下链接查看详细信息: MusicgenMelodyForConditionalGeneration
class transformers.MusicgenMelodyForConditionalGeneration
更多详情请查阅:< source > ( config: MusicgenMelodyConfig = None text_encoder: Optional = None audio_encoder: Optional = None decoder: Optional = None )
参数
- config (MusicgenMelodyConfig) — 包含模型所有参数的模型配置类。使用config文件初始化不会加载与模型关联的权重,只有配置。检查from_pretrained()方法以加载模型权重。
- text_encoder (
Optional[PreTrainedModel]
, 可选) — 文本编码器。 - audio_encoder (
Optional[PreTrainedModel]
,可选)——音频编码器。 - decoder (
Optional[MusicgenMelodyForCausalLM]
,可选)——用于生成音频代码的MusicGen Melody解码器。
一个复合Musicgen Melody模型,包括文本和音频条件模型、MusicgenMelody解码器和音频编码器,用于具有一个或两个文本和音频提示的音乐生成任务。
Musigen Melody模型是在Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi、Alexandre Défossez在简单且可控的音乐生成(Simple and Controllable Music Generation)一文中提出的。这是一个仅在条件音乐生成任务上训练的仅解码器transformer。
该模型从PreTrainedModel继承。查看超级类文档以了解库实现的所有模型(如下载或保存、调整输入嵌入大小、剪枝头部等)的通用方法。
该模型同时也是一个 PyTorch torch.nn.Module 子类。将其作为常规的 PyTorch 模块使用,并参阅 PyTorch 文档了解所有有关通用使用和行为的内容。
forward
< source > ( input_ids: 可选 = Noneattention_mask: 可选 = Noneinput_features: 可选 = Nonedecoder_input_ids: 可选 = Nonedecoder_attention_mask: 可选 = Nonepast_key_values: Tuple = Noneencoder_hidden_states: 可选 = Noneinputs_embeds: 可选 = Nonedecoder_inputs_embeds: 可选 = Nonelabels: 可选 = Noneuse_cache: 可选 = Noneoutput_attentions: 可选 = Noneoutput_hidden_states: 可选 = Nonereturn_dict: 可选 = None**kwargs ) → transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPast
或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
of shape (batch_size, sequence_length)
) — 词汇表中的输入序列标记索引。如果提供了填充,默认情况下将忽略填充。索引可以通过使用 AutoTokenizer 获取。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。 什么是输入 ID?
- attention_mask (
torch.Tensor
的形状为(batch_size, sequence_length)
,可选)—— 用于避免在填充token索引上执行注意力的掩码。掩码值在[0, 1]
之间选择: - 1代表未掩码的token,
- 0代表已掩码的token。
什么是注意掩码?
- 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))》可选,当传递参数
use_cache=True
或config.use_cache=True
时返回)——一个长度为config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含两个形状为(batch_size, num_heads, encoder_sequence_length + sequence_length, embed_size_per_head)
的张量。该元组包含预计算的隐藏状态(自注意力块中的键和值),可用于(查看past_key_values
输入)以加速顺序解码。 如果使用past_key_values
,用户可以选择性地输入形状为(batch_size, 1)
的最后decoder_input_ids
(那些尚未将过去的键值状态传递给这个模型的)而非所有decoder_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_ids
和 decoder_inputs_embeds
均未设置,则 decoder_inputs_embeds
采用 inputs_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.MusicgenMelodyOutputWithPast
或 tuple(torch.FloatTensor)
一个 transformers.models.musicgen_melody.modeling_musicgen_melody.MusicgenMelodyOutputWithPast
或一个由 torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含根据配置(MusicgenMelodyConfig)和输入的不同元素。
-
loss(《torch.FloatTensor》形状为 (1,)
,可选,当提供 labels
时返回)— 语言模型损失(用于下一个标记的预测)。
-
logits (torch.FloatTensor
的形状为(batch_size, sequence_length, config.vocab_size)
) — 语言模型头部预测得分(SoftMax之前每个词汇单元的得分)。
-
past_key_values (tuple(tuple(torch.FloatTensor))
),可选,在传递use_cache=True
或config.use_cache=True
时返回 — 长度为config.n_layers
的tuple(torch.FloatTensor)
的元组,每个元组包含两个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量
包含预先计算的隐藏状态(自我关注块中的键和值),可以用作(参见past_key_values
输入)来加速顺序解码。
-
hidden_states (tuple(torch.FloatTensor)
),可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回 — 由形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
组成(如果有嵌入层,则为嵌入层的输出,加上每个层的输出)。
模型的每个层的隐藏状态输出以及可选的初始嵌入输出。
-
attentions (tuple(torch.FloatTensor)
),可选,在传递output_attentions=True
或config.output_attentions=True
时返回 — 每个层的形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
的元组。
注意力softmax之后的注意力权重,用于计算自我关注头部中的加权平均值。
-
encoder_hidden_states (torch.FloatTensor
的形状为(batch_size, encoder_sequence_length, hidden_size)
),可选 — 由绘制的文本编码器和绘制的音频编码器输出拼接而成的条件隐藏状态序列。用作条件信号。
MusicgenMelodyForConditionalGeneration的前向方法,重写了特殊方法 __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
torch.Size([8, 249, 2048])
< > 在GitHub上更新