大模型学会听音乐了!风格乐器精准分析,还能剪辑合成

腾讯pcg arc实验室 投稿

量子位 | 公众号 qbitai

能处理音乐的多模态大模型,终于出现了!

只见它准确分析出音乐的旋律、节奏,还有使用的乐器,甚至其中的意境也能解读。

【音乐效果请移步公众号】

而且它不仅会听,只要给它一段文字和图片,它就会在理解图片意境之后,结合文字要求来创作:

【音乐效果请移步公众号】

甚至是给静默的视频配上声音:

【音乐效果请移步公众号】

现有的音乐它也能编辑,比如从一段音乐中去除鼓的声音

【音乐效果请移步公众号】

以上的这些效果,都出自腾讯pcg arc实验室新推出的基于多模态模型的音乐理解与生成框架m2ugen

它可以进行音乐理解、音乐编辑以及多模态音乐生成(文本/图像/视频到音乐生成)。

研究团队在模型的五种能力上分别和现有模型进行了一一对比,并在多模态音乐生成的三个子任务上(文本/图像/视频到音乐生成)做了主观评测实验,发现m2ugen模型性能均优于现有模型。

此外,由于没有很多合适数据集用于模型训练,研究团队还研发了一套数据生成方法,制作了mucaps、muedit、muimage、muvideo四个数据集并发布。

目前团队已将模型代码库在github开源,并在huggingface上开放了模型权重和训练所需数据集(需申请)。

那么,m2ugen究竟是怎样实现的呢?

模型共分四个模块

m2ugen模型分为四个模块区域,分别是多模态特征编码器、多模态理解适配器、桥接llm以及音乐理解与生成模块。

下图展示了m2ugen模型的整体框架:

多模态特征编码器

为了实现多模态音乐理解与生成,模型需要处理多模态输入。

基于此,研究团队应用了一些现有的模态编码器,如音乐编码器mert、图像编码器vit和视频编码器vivit。

vit和vivit是视觉领域常用的两个基于transformer的编码器,在现有的一些llm相关工作中经常涉及,因此开发者选用这两个分别作为图像和视频编码器。

对于音乐输入,前序工作mu-llama证明了mert模型显著优于其他比较的音频/音乐编码器,因此在m2ugen中研究团队选用mert作为音乐输入的编码器。

多模态理解适配器

该模块的主要作用是将编码器输出的特征向量进行信息整合,输入到后续的llm中和文本输入一起控制llm的输出。

如下图所示,该模块主要由1d卷积层、线性映射层和一个稠密网络模块(dense network)组成。

最后的稠密网络模块如下图:

该模块由三个子模块组成,包含正则化层(nomarlization)、线性层(linear)、激活函数(silu)等组件。

该过程可由下式表示:

其中xi表示第i个子模块之后的输出嵌入向量,lj,i表示第i个子模块的第j层线性层,ni表示第i个子模块内的正则化层,silu是激活函数。

该稠密网络设计延续自团队的前序工作mu-llama。

在稠密网络之后,输出4096维的嵌入向量,提供给下游的llm使用。

桥接llm

为了将多模态上下文信息引入llm,研究者将来自相邻上游多模态理解适配器的输出接入到llm的指定层。

研究者采用了meta研发的llama 2模型作为底座llm,如下图所示。

这里选用的模型版本是llama 2 7b模型,包含n=32个隐层。

从该模型的顶层算起,每l层(l=6)引入一个模态信息,从上至下依次引入音乐、图像和视频模态信息,并使用零初始值注意力模块,底部的(n-3l-1)层则采用原始的注意力模块。

llm的文本指令从底层,也即第一层输入。利用该技术,llm被赋予了通过其他模态信息来引导llm输出的能力。

音乐理解与生成模块

受next-gpt工作启发,本模型引入了特定的音频标记[aud],用来区分音乐问答和生成任务。

在模型训练阶段,对于以音乐作为输出(即音乐生成任务)的训练样本对(如文本指令-音乐对),这些音频标记会添加在llm输出的末尾,用于指示下游的音乐输出。

在模型推理阶段,假如用户输入的指令和音乐生成有关,比如generate a music using flute(用笛子生成一段音乐),则llm的输出会包含音频标记,从而下游的音乐解码器会接收该指令并生成以笛子作为演奏乐器的音乐;

反之如果llm的输出没有音频标记,则表明用户期望的是音乐理解任务,此时由llm直接回应用户提问。

研究人员尝试了两种音乐解码器——audioldm 2和musicgen,其中musicgen的音乐生成表现相较audioldm 2更好。

提出新数据集,训练分三阶段

训练数据集

如本文研究贡献所述,本研究构造了四组数据集mucaps、muedit、muimage和muvideo,数据样本示例如下图所示。

mucaps数据集

约1200小时来自audioset和一些网站的公开音乐;

利用mu-llama模型对搜集的音乐文件生成音乐注解组成音乐-文本对。

muedit数据集

从audioset构建音乐池(音乐池和mucaps不同),并筛选出约60小时相似的音乐-音乐对;

筛选条件包括速度(tempo)、beats(节拍)等,从而得到大体相似,但有一定区别的音乐-音乐对(比如使用的乐器不同);

将音乐-音乐对看作是源-目标对,将源音乐的注解文本输入给mpt-7b[14]模型得到人类端对话,目标音乐的注解文本输入给mpt-7b模型得到模型端对话,也即源音乐和目标音乐都得到对应指令用于模型训练。

muimage/muvideo数据集

从audioset再另外采样一些图像/视频-音乐对(和mucaps/muedit中的音乐均不同,最小化音乐重复),用blip/videomae模型对图像/视频做图像/视频注解;

将图像/视频+音乐的注解文本输入到mpt-7b模型,分别得到人类端和模型端对话。

以上数据集构造脚本可参见:

https://github.com/shansongliu/m2ugen/tree/main/datasets

而m2ugen模型的训练参考了next-gpt的训练方式,分为三个阶段,分别是编码端训练、解码端训练和编解码联合训练。

阶段1:编码端训练

该阶段冻结多模态编码器和llm,只训练多模态理解适配器;

利用来自mucaps/coco/muvideo的音乐/图像/视频-文本对做阶段1训练;

训练损失为交叉熵损失,即比较llm的输出和目标注解文本。

阶段2:解码端训练

这一阶段不考虑编码测(模态编码器和适配器),冻结llm,训练输出映射模块;

此阶段旨在训练llm生成指示下游音乐解码器输出音乐的指令,或直接根据输入指令对输入的音乐做问答或注解;

需要对齐的是音乐解码器(audioldm 2/musicgen)的文本编码器输出和m2ugen模型输出映射模块产生的条件嵌入向量,即对输出端进行对齐;

此阶段在训练时,通过添加特定的音频标记[aud]来指示是否生成音乐。如果llm的输出中包含[aud],则同时生成文本+音乐(音乐生成),如果不包含,则只生成文本(音乐问答);

损失函数采用交叉熵和均方误差,其中交叉熵是比较llm输出的音频标记和真值音频标记,均方误差是比较m2ugen模型输出映射模块产生的条件嵌入向量和音乐解码器的文本编码器的输出文本嵌入向量。

阶段3:编解码联合训练

该阶段冻结多模态编码器和llm,训练多模态理解适配器和输出映射模块,以及llm中的lora参数;

此阶段训练时训练数据有alpaca(通用知识)、musicqa、muimage、muvideo和muedit;

为了使模型可以同时生成音乐和文本, muimage、muvideo和muedit三个数据集在阶段3训练时llm输出端添加了特定的音频标记(和阶段2训练类似)。

未来,研究团队的工作重点是进一步提升模型的细粒度音乐理解能力,并改善生成音乐与输入指令之间的相关性,也使音乐编辑能力更加精确。

论文地址:https://arxiv.org/pdf/2311.11255.pdf