生成音乐使用MusicGen在AMD GPU上

Music Generation With MusicGen on an AMD GPU — ROCm Blogs

2024年3月8日 作者:Phillip Dang

MusicGen是一种基于变换器的自回归模型,它根据前面片段预测一段音乐的下一个片段。这种方法类似于语言模型预测下一个词元。

MusicGen能够使用以下输入生成音乐:

  • 无输入源(例如,无条件生成)

  • 文本描述(例如,基于文本的条件生成)

  • 输入音乐序列(例如,基于旋律的条件生成)

想要深入了解MusicGen的内部工作机制,请参考简单且可控的音乐生成

在这篇博客中,我们演示了如何使用AMD GPU和ROCm无缝地运行MusicGen的推理。我们使用此模型来自Hugging Face,并展示了上述三种输入方式。

前提条件

要在本地运行 MusicGen,您至少需要一块 GPU。按照本博客进行操作时,您需要以下软件:

要检查您的硬件并确保系统识别您的 GPU,运行以下命令:

rocm-smi --showproductname

您的输出应该如下所示:

================= ROCm System Management Interface ================
========================= Product Info ============================
GPU[0] : Card series: Instinct MI210
GPU[0] : Card model: 0x0c34
GPU[0] : Card vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[0] : Card SKU: D67301
===================================================================
===================== End of ROCm SMI Log =========================

要确保 PyTorch 识别您的 GPU,运行以下 Python 代码:

import torch
print(f"number of GPUs: {torch.cuda.device_count()}")
print([torch.cuda.get_device_name(i) for i in range(torch.cuda.device_count())])

您的输出应该类似如下:

number of GPUs: 1
['AMD Radeon Graphics']

一旦确认系统识别您的设备,您就可以安装所需的库并生成一些音乐。

在本博客中,我们使用 facebook/musicgen-small 变体。

您可以使用 Hugging Face 的 transformer 库来运行 MusicGen。要安装所需的库,请运行以下命令:

! pip install -q transformers

使用 Hugging Face 的 MusicGen

从版本 4.31.0 开始,MusicGen 可以在 Hugging Face 的 Transformers 库中使用。让我们来看看如何使用它。在本节中,我们将按照 Hugging Face 的示例 进行操作。我们将在介绍中解释的 3 种不同模式下生成音乐。

无条件生成

让我们从无需任何输入生成音乐开始。

from transformers import MusicgenForConditionalGeneration

# 初始化模型和模型输入
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)

# 生成音频
audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)

你可以直接在笔记本中播放音频,也可以使用*scipy*将音频保存为WAV文件。

  • 要在笔记本中播放音频,运行:

    from IPython.display import Audio
    
    sampling_rate = model.config.audio_encoder.sampling_rate
    
    # 播放音频样本
    Audio(audio_values[0].cpu(), rate=sampling_rate)
    
  • 要保存音频,运行:

    import scipy
    
    sampling_rate = model.config.audio_encoder.sampling_rate
    scipy.io.wavfile.write("audio/unconditional.wav", rate=sampling_rate, data=audio_values[0, 0].cpu().numpy())
    

文本条件生成

接下来,我们来生成与文本输入相对应的音乐。这个过程分为三个步骤:

  1. 文本描述会传递到文本编码模型中,以获取隐藏状态表示序列。

  2. MusicGen 会训练来预测音频令牌或音频代码,这些代码是基于这些隐藏状态的。

  3. 使用音频压缩模型(如 EnCodec)对音频令牌进行解码,以恢复音频波形。

要看到这一过程,请运行以下代码:

from transformers import AutoProcessor, MusicgenForConditionalGeneration

# 初始化模型
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

# 设置设备为 GPU
device = 'cuda'
model = model.to(device)

# 模型的文本描述
input_text = ["epic movie theme", "sad jazz"]

# 创建输入
inputs = processor(
    text=input_text,
    padding=True,
    return_tensors="pt",
).to(device)

# 生成音频
audio_values_from_text = model.generate(**inputs, max_new_tokens=512)

print(audio_values_from_text.shape)
输出:
torch.Size([2, 1, 325760])

请注意,音频输出是一个三维的 Torch 张量,其形状为 batch_size、`num_channels` 和 sequence_length。如同无条件生成一样,你可以通过 Audio 库来收听生成的音频:

from IPython.display import Audio

sampling_rate = model.config.audio_encoder.sampling_rate

# 收听第一段根据输入文本"epic music theme"生成的音频
Audio(audio_values_from_text[0].cpu(), rate=sampling_rate)

# 收听第二段根据输入文本"sad jazz"生成的音频
Audio(audio_values_from_text[1].cpu(), rate=sampling_rate)

我们已经将这两段 WAV 文件分别保存为 audio/conditional1.wav 和 audio/conditional2.wav,存储在 this GitHub folder 中,所以你无需运行代码即可收听。

音频提示生成 

你也可以通过提供一个旋律和文本描述来生成音乐,从而指导生成过程。我们使用之前从文本描述 “sad jazz” 生成的样本的前半部分作为我们的音频提示:

# 提取生成音频的前半部分
sample = audio_values_from_text[1][0].cpu().numpy()
sample = sample[: len(sample) // 2]

# 作为输入使用
inputs = processor(
    audio=sample,
    sampling_rate=sampling_rate,
    text=["sad jazz"],
    padding=True,
    return_tensors="pt",
).to(device)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

你可以使用以下代码来收听生成的音频:

Audio(audio_values[0].cpu(), rate=sampling_rate)

我们将这个文件保存在这个 GitHub 文件夹中的`audio/audio_prompted.wav`。

尽管在这篇博客中我们只使用了小模型,但我们鼓励你探索中型和大型模型。我们还鼓励你使用自己的自定义音频数据集对模型进行微调。

猜你喜欢

转载自blog.csdn.net/eidolon_foot/article/details/143312798