文章目录
- 昇思MindSpore应用实践
- 1、MusicGen模型简介
- 残差矢量量化(RVQ)
- SoundStream
- Encodec
- 2、生成音乐
- 无提示生成
- 文本提示生成
- 音频提示生成
- Reference
昇思MindSpore应用实践
本系列文章主要用于记录昇思25天学习打卡营的学习心得。
1、MusicGen模型简介
MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研究成果参考论文《Simple and Controllable Music Generation》。
MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:
- 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示。
- 训练MusicGen解码器来预测离散的隐形状态音频token。
- 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。
MusicGen 直接使用谷歌的t5-base及其权重作为文本编码器模型,并使用EnCodec 32kHz及其权重作为音频压缩模型。MusicGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。
MusicGen 的新颖之处在于音频代码的预测方式。传统上,每个码本都必须由一个单独的模型(即分层)或通过不断优化 Transformer 模型的输出(即上采样)进行预测。与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。
MusicGen 属于后深度学习时代计算机听觉领域的一个 High-Level 阶段性成果,其多模态文本提示功能结合了 NLP 领域的工作t5-base,不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构,并用到了音视频、流媒体线上会议中语音压缩的重要技术EnCodec,而EnCodec再往下细分,还涉及到很多关于音频、语音信号处理 Low-Level的技术,如矢量量化、语音压缩与增强-SoundStream等。
残差矢量量化(RVQ)
传统的压缩算法一直集中在减少数据序列中的冗余-无论是在图像,视频还是音频中-以大量减少文件大小为代价,从原始信息中丢失一些信息。 MP3的有损压缩编码算法极大地改变了我们存储和共享音乐数据的方式,并成为一个著名的例子。
基于神经网络、深度学习的模型压缩技术作为一种新的方法,采用神经网络来表示压缩和重建数据,可能实现高压缩率,几乎零感知信息损失。无论是音频压缩还是图像超分、视频压缩,都起到了重要作用。
压缩旨在将各种数据类型,无论是像素形式(图像),波形(音频)还是帧序列(视频),转换为更紧凑的表示,如矢量。关键在于,这种压缩编码/矢量转换不仅仅是简单地减少数据大小:它产生了一种新的数据表示,更容易让模型进行模式自动识别,存储,然后用于重建。 这种表示被称为矢量量化嵌入,广泛用于深度学习,无论是从NLP语言模型还是AIGC图像生成。
上图介绍了矢量量化单个量化步骤的基本逻辑,该步骤将Encoder输出的具有128个维度的矢量最终减少到可以用码书中的单个数字表示(码本中的索引),从而压缩信息。
残差矢量量化RVQ将量化过程分解为多个层,每个层处理前一层的残差,逐层寻找与前一层最相似的矢量。 这允许系统被缩放以在不同的比特率上操作(通过缩放层的数量)。这种分层的方法使得每个阶段都集中在前一阶段的残差上,因此,RVQ不是试图用单个码本直接对高维向量进行编码,而是分解了该问题,以显著降低的计算成本,并维持高精度。
SoundStream
在传统的音频处理PipeLine中,压缩和增强(去除背景噪声)通常由不同的模块执行。例如,音频增强算法可以应用在发送端(在压缩音频之前),或接收端(在音频解码之后)。在这样的设置中,每个处理步骤都会带来端到端的延迟。
相反,SoundStream 的设计是压缩和增强可以由同一模型联合执行,而不会增加整体延迟。
Encodec
整体结构与 SoundStream 相似,Encoder-Decoder 支持 streaming & non-streaming 两种推理方式,
1、Encoder 编码器用于获取未压缩的数据并将其转换为更高维度和更低帧率的表示;
2、Quantizer 量化器的 base module 替换成了 transformer,通过训练量化器保留最重要的信息来重建原始信号。
3、Decoder 解码器:将压缩信号转换回与原始信号尽可能相似的波形,有损压缩的关键是识别人类无法感知的变化,因为在低比特率下完美的重建是不可能的。为此,EnCodec 使用鉴别器来提高生成样本的感知质量,创建了一个类似GAN的机制,其中鉴别器的工作是区分真实样本和重建样本。压缩模型试图通过推动重建的样本在感知上与原始样本更加相似来生成样本来欺骗鉴别器,以此获得更好的重建质量。
4、除此之外,EnCodec 模型还计算其他类型的损失。 这些损失包括将重建的波形和梅尔频谱图与原始波形和梅尔频谱图进行比较,以及评估承诺损失以稳定编码器的输出。 最终目标是确保音频的输出与初始输入密切相关。
2、生成音乐
MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采样模式得到的结果要显著优于贪心模式。因此我们默认启用采样模式,并且可以在调用MusicgenForConditionalGeneration.generate
时设置do_sample=True
来显式指定使用采样模式。
无提示生成
我们可以通过方法 MusicgenForConditionalGeneration.get_unconditional_inputs
获得网络的随机输入,然后使用 .generate
方法进行自回归生成,指定 do_sample=True
来启用采样模式:
%%time
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)
import scipy
from IPython.display import Audio
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
audio_length_in_s = 256 / model.config.audio_encoder.frame_rate
audio_length_in_s
文本提示生成
首先基于文本提示,通过AutoProcessor
对输入进行预处理。然后将预处理后的输入传递给 .generate
方法以生成文本条件音频样本。同样,我们通过设置“do_sample=True”来启用采样模式。
其中,guidance_scale
用于无分类器指导(CFG),设置条件对数之间的权重(从文本提示中预测)和无条件对数(从无条件或空文本中预测)。guidance_scale
越高表示生成的模型与输入的文本更加紧密。通过设置guidance_scale > 1
来启用 CFG。为获得最佳效果,使用guidance_scale=3
(默认值)生成文本提示音频。
%%time
from mindnlp.transformers import AutoProcessor
from IPython.display import Audio
processor = AutoProcessor.from_pretrained("facebook/musicgen-small") # 导入musicgen预训练权重,如果small失效的话换medium试试
inputs = processor(
text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
padding=True,
return_tensors="ms",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
scipy.io.wavfile.write("musicgen_out_text.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
音频提示生成
AutoProcessor
同样可以对用于音频预测的音频提示进行预处理。在以下示例中,我们首先加载音频文件,然后进行预处理,并将输入给到网络模型来进行音频生成。最后,我们将生成出来的音频文件保存为musicgen_out_audio.wav
%%time
from datasets import load_dataset
from IPython.display import Audio
processor = AutoProcessor.from_pretrained("facebook/musicgen-small") # 同样不建议用-small
dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]
# take the first half of the audio sample
sample["array"] = sample["array"][: len(sample["array"]) // 2]
inputs = processor(
audio=sample["array"],
sampling_rate=sample["sampling_rate"],
text=["80s blues track with groovy saxophone"],
padding=True,
return_tensors="ms",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
scipy.io.wavfile.write("musicgen_out_audio.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
Reference
[1] 昇思大模型平台
[2] 昇思官方文档-基于MindNLP+MusicGen生成自己的个性化音乐
[3] Pi酱鸭力山大-阅读笔记:MUSICGEN——Simple and Controllable Music Generation(2023.06)
[4] 深度学习在音乐信息检索(MIR)方向的应用介绍
[5] What is Residual Vector Quantization?