今日arXiv最热大模型论文:点击即可播放!港中文发布大模型写歌神器!

一首歌,包含作词作曲两个部分。擅长作词or作曲就已经很牛了。比如方文山是周杰伦的御用作词人,而周杰伦写过很多耳熟能详的曲子。而兼具作词作曲才华的全能创作人却是难得一见。

最近港中文发布了一款歌曲创作大模型SongComposer,作词作曲都不在话下。 并且擅长让歌词和旋律相互交融,让整首歌听起来更加和谐。

先来几个小demo一起欣赏一下:

根据歌词编写旋律

歌词:突如其来的那一场 谁在路旁 在路旁 听见我自由放声唱 和我一样 背上行囊 脚步丈量远方

根据旋律作词:

给出以下旋律:

生成的歌词:他们也曾像我一样 追着风跑着 却找不到方向 只能像我这样 停在路上 有一点累 却也不觉的 有一点心为了追逐梦想 我总是选择最难的路

最终合成的歌曲:

续写歌曲:

给出歌曲的开头

续写结果

根据文本生成歌曲:

甚至你需要输入“用悠扬的旋律和缓慢的节奏创作一首关于爱和自由的歌曲”,SongComposer就能根据文本提示生成一首包含词曲的歌:

怎么样,是不是听起来还不错,有那味了。如果再加上编曲老师的润色,一首完整度较高的流行歌曲就完成了!

除此之外,作者还发布了用于训练的歌词-旋律配对数据集,以及一套评估生成歌曲质量的指标,相信可以推动智能音乐创作往前迈进一大步!

论文标题:
SongComposer: A Large Language Model for Lyric and Melody Composition in Song Generation

公众号「夕小瑶科技说」后台回复“SongComposer”获取论文PDF!

SongCompose-PT Dataset

本节概述了SongCompose-PT数据集的编制、创建和结构,其中包括单独的歌词、旋律和在单词级别上将歌词与旋律同步的歌词-旋律配对集合。

纯歌词数据集

从两个在线来源收集纯歌词数据集:

  • Kaggle数据集,包括带有Spotify Valence标签的15万首歌曲的歌词。

  • Music Lyric Chatbot数据集,包含14万首中文歌曲的歌词。从28.3万首中英文歌曲中删选而来的高质量的歌词。

纯旋律数据集

为了将旋律数据集组织成基于文本的结构,使用MIDI文件作为纯旋律数据集,其结构简单,能够在没有复杂音频处理的情况下高效提取和操作旋律。

使用pretty midi解析MIDI文件,仅从中提取“旋律”或“人声”轨道,由于MIDI中的旋律被表示为随时间推移的一系列音符,每个音符具有特定的音高、开始和结束时间戳,最终获得一个旋律属性三元组列表,包括{音符音高、音符持续时间、休止符持续时间}。

其中约4.5万条条目来自LMD-matched MIDI数据集,约8万条来自网络爬虫。再进行必要的数据过滤以删除重复和质量不佳的样本,最终剩下大约2万个MIDI样本。

配对歌词-旋律数据集

大量歌词和旋律配对数据对于训练LLM进行歌曲创作非常重要。但是歌曲与旋律的对齐非常困难,需要详细的注释和特定的专业知识。它包括确保歌词与一个或多个旋律音符精确匹配,并标注精确的时间戳,如下图所示:

本文利用了来自LMD-full数据集的7,998首歌曲,以及来自Reddit数据集的4,199首歌曲。此外,还结合了OpenCpop数据集其中100首中文流行歌曲,以及M4Singer数据集其中700首高质量中文歌曲。

为了进一步丰富配对歌词-旋律数据,本文还抓取网络信息创建了一个包含4,000首经典中文歌曲的数据集。收集歌词-旋律数据的流程如下图所示:

  1. 数据来源爬取:搜集大量的mp3文件及其对应的歌词文件,包括句级别的时间戳。

  2. 歌词清理:使用GPT-4清理歌词文本中的不相关细节,如歌曲标题、艺术家姓名和制作信息。

  3. 分段切片:为了减轻长时间对齐的挑战和误差积累,根据歌词文件中提供的时间戳将音频和歌词切片为大约10秒的配对段落(每个段落大约三句)。

  4. 音乐源分离:利用UVR4这个公开的音乐分离工具,从原始音频中分离人声和伴奏部分。

  5. 歌声转录:使用数字音频工作站软件FL Studio5自动生成初步的乐谱,捕捉每个音符的音高和起始-结束时间。

  6. 词边界注释:通过Pypinyin6将歌词转换为音素序列,然后利用音频对齐工具——Montreal Forced Aligner获取歌词中每个词语的边界。

  7. 词级别对齐:利用动态时间扭曲(DTW)算法,根据起始-结束时间对单词和音符进行对齐。

最后,本文开发了一个包含约15K个配对歌词-旋律条目的数据集,其中约5K首为中文,10K首为英文。

SongComposer

LLM友好的歌曲表示

元组数据格式

为了将歌词和旋律输入到LLM中,一个直观的策略是按顺序排列它们,从一系列歌词开始,然后是一系列音符值和时长。然而,由于其顺序化方法,模型很难对齐歌词和旋律,导致产生不对齐的输出。

作者提出了一种统一的输入组织方式,利用基于元组的格式,其中每个元组代表一个离散的音乐单元,可以是一个歌词,一个旋律,或者一个歌词-旋律对。

具体来说,在纯歌词数据的情况下,在每个元组中插入一个单词。对于纯旋律,在每个元组中包括音调、音符时长和休息时长。对于歌词-旋律对,将歌词和相应的音符元素合并在同一个元组内。由于一个单词可以对应多个音符,一个单元组可能包含一个单词以及多个音符和它们各自的时长。使用竖线(|)来分隔不同的元组,并将元组序列作为LLM的输入,如下图所示。

这种元组格式明确地为模型提供了歌词和旋律之间的相互映射,有助于掌握元素之间的对应关系。

离散化时长

为了有效处理旋律中的时长信息,采用对数编码方案将时长分为预定义数量的bin,将连续的时长范围转换为一组离散值。这种为LLM提供的组织良好且简洁的输入增强了模型捕捉音乐内容的精确时间变化的能力。

具体来说,根据时长的统计分布,将它们截取到 [xmin, xmax]。对于任意时长x,编码过程定义如下:

设置 [xmin, xmax] = [-0.3, 6],bins = 512,ϵ = 1,这使得时长可编码为512个离散整数,最高可达6.3秒。相反,要将离散化值解码为原始时长:

词汇扩展

为了确保清晰度,通过引入由〈•〉符号表示的辅助标记,针对离散化的时间单位和音符值在模型词汇中推广表示形式。对于时间离散化,扩展了512个独特token,表示为。对于音乐音符的表示,标记了十个八度内的12个音高类别,从而添加了120个不同的音乐token。

两阶段训练

预训练阶段

为了丰富LLM的基础音乐知识,首先在大量纯歌词和纯旋律的语料库上对模型进行预训练。

对于旋律,采用音高移调来增强数据集。具体来说,将音高移动高低四个半音,从而将数据集扩大了九倍。

对于歌词将整首歌曲的数据拆分成基于句子的样本,每个样本包含五到十行。这种制定使得模型能够获得更加专注和相关的学习上下文,有助于更连贯地生成歌曲。

通过这种纯歌词和旋律的训练过程,模型已经获得了扎实的音乐知识基础,为更加关注歌词和旋律之间对应关系的高级学习奠定了坚实基础。随后,使用配对数据引导模型生成对齐的歌词-旋律对。根据经验,为了保留模型处理旋律和歌词的能力,以1:1:1样本比例向模型输入相等数量的纯旋律、纯歌词和配对数据。

总共有0.23B个歌词tokens、0.28B个旋律tokens和0.16B个配对数据tokens。所有数据都是使用元组数据格式输入的。

监督微调阶段

在将大量乐谱和歌词引入模型后,为歌曲生成制作指令遵循数据,包括给定歌词创建旋律、为旋律写歌词、扩展歌曲部分以及根据文本描述生成歌曲。其中,为前三个任务手动准备了3K个问答对。对于最后一个任务,使用GPT-4生成了1K首歌曲摘要,这些摘要又形成了一个文本到歌曲的数据集,指导了歌曲创作过程。

客观评价指标

本文还构建了一个包含1188首歌曲的验证集。其中,415首是中文歌曲,773首是英文歌曲。在后续测试中,将一些歌曲随机分割成5至10个句子。客观评估的重点是评估生成的输出与真实样本之间的相似性。

旋律生成

对于旋律评估,采用了SongMASS(提出的度量标准。其中包括音高分布相似度(PD)、时长分布相似度(DD)和旋律距离(MD)。由于与SongMASS相比的校准策略的不同,通过加法对齐ground truth和生成音符的平均音高。

歌词生成

在歌词生成方面,使用CoSENT模型,评估句子级别的对齐。该模型允许输入歌词,并计算生成歌词与原始歌词之间的余弦相似性。此外,结合ROUGE-2分数和BERT分数作为另外两个用于评估歌词生成的度量标准。ROUGE-2分数关注生成文本和原始文本之间的二元组重叠。BERT分数利用BERT-base multilingual uncased 模型基于上下文嵌入来衡量文本相似度。

主观评价指标

选取30名参与者对每个任务中有10个案例进行评价。评分范围为1到5,得分越高表示质量更高。

歌词到旋律生成

歌词到旋律生成要求根据给定的歌词创作出一段合适的旋律。对旋律进行评估包括:(1)和声(HMY.):评估旋律的整体质量。

(2)旋律-歌词兼容性(MLC.):检查生成的旋律与给定歌词之间的契合程度。

旋律到歌词生成

旋律到歌词生成旨在产生与提供的旋律相匹配的歌词。对歌词进行评估包括:(1)流畅性(FLN.):考虑生成歌词的语法正确性和语义连贯性。

(2)旋律-歌词兼容性(MLC.):检查生成歌词与给定旋律的契合程度。

歌曲延续性

歌曲延续涉及在旋律和歌词方面延长已有歌曲的部分。评估延续的质量包括:(1)整体质量(OVL.):衡量生成歌曲的整体质量,以其音乐吸引力为标准。(2)与歌曲提示的一致性(COH.):分析延续与提供的歌曲提示之间的自然融合,评估旋律、歌词和其他音乐元素的连贯性。

文本到歌曲生成

歌曲延续根据文本描述生成完整的歌曲,以音乐和歌词的形式捕捉其本质。评估重点包括:(1)整体质量(OVL.):衡量生成歌曲的整体质量,以其音乐吸引力为标准。(2)与文本输入相关性(REL.):检查生成歌曲与输入文本的对齐度和相关性。

实验结果

歌词到旋律生成

如上表所示,该方法在调性分布相似度(PD)和时长分布相似度(DD)方面优于先进的语言模型,比GPT-4高出10个多点,并在中英双语中实现了最低的旋律距离(MD)。

▲主观评估

另外,在主观评估中发现SongComposer在和声和旋律-歌词的搭配方面比GPT-3.5和GPT-4要好很多。这意味SongComposer更擅长让歌词和旋律相互配合得更好,让整首歌听起来更和谐。

旋律至歌词生成

该方法在生成与原始歌词紧密匹配的歌词方面非常有效。主观评估显示,用户们一致认为SongComposer在产生歌词方面非常流畅且与旋律高度相关,能够有效地捕捉并补充底层旋律的节奏。

歌曲延续

SongComposer不仅能够独立产出高质量的歌词和旋律,还能够将它们结合起来,使整首歌听起来更和谐。

文本至歌曲生成

在文本至歌曲生成的主观评估中,SongComposer可以根据文本提示创作出旋律优美、主题和情感完美契合的歌曲。

消融实验

在消融研究中本文报告了针对歌词到旋律和旋律到歌词任务的旋律距离(MD)和BERT分数。

预训练数据集

为了探究专门数据集对模型学习的影响,作者使用了不同纯歌词和纯旋律数据集的配对数据进行训练实验,结果如下表所示:

研究结果显示,如果省略了纯歌词和纯旋律的数据集,模型的性能会明显下降。这表明在训练的早期阶段,基础旋律和抒情知识的重要性。纯歌词数据集主要提高了旋律到歌词任务的性能,而纯旋律数据集则更明显地提高了旋律生成的水平。而结合歌词和旋律数据集能够带来最佳的效果。

旋律知识的扩展词汇

为了了解专门用于旋律知识的标记是否有利于SongComposer的性能,本文对不同的标记组合进行了消融,评估它们对模型处理和生成音乐内容的影响,如下表所示:

首先,在时长标记方面,直接将原始基于浮点数的秒数输入到SongComposer中,而非应用离散数字。缺乏特殊时间标记将导致模型无法为歌词到旋律任务生成正确结果。

相反,引入离散时长标记显著提高了旋律到歌词任务的表现,无论是否引入音符标记,BERT分数都提高了超过0.03。这验证了时长离散化对掌握旋律结构的重要性。

其次,采用音符标记在两个任务中都带来了显著改进,使用音符标记有助于模型更好地理解音符的含义,并提高了学习的效果。

结论

SongComposer利用符号化的歌曲表示法来生成旋律和歌词,在各种任务中表现出色,如将歌词转换为旋律、旋律生成歌词、歌曲延续和基于文本描述的歌曲创作,甚至在性能上超越了像GPT-4这样的先进LLM模型。

相信SongComposer可以为LLM在音乐领域的创意应用开辟新的途径。

公众号「夕小瑶科技说」后台回复“SongComposer”获取论文PDF!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自测-1 打印沙漏

文章预览: 题目算法代码 题目 算法 以前做过这个,那次是c语言写的,一点一点处理一层一层完成,这次我换了一种语言用了另一种思想使用递归去写,还是我们要先求出应该有多少层这个很容易,中间输出部分我们算…

常见查找算法Java实现

顺序&#xff08;线性&#xff09;查找二分查找/折半查找插值查找斐波那契查找 线性查找 判断数列是否包含要求&#xff0c;如果找到了&#xff0c;就提示找到了&#xff0c;并给出下标值 // 线性查找 public static ArrayList<Integer> seqSearch(int[] arr, int value…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

深度学习 精选笔记(8)梯度消失和梯度爆炸

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

带你快速初步了解Python列表

1.列表 列表主要是用来存储多个数据&#xff0c;是有序的集合 2.创建列表 """ 语法&#xff1a;变量名 [数据1,数据2,数据3......] 注意&#xff1a;列表中的数据类型可以是各种不同的数据类型 """ 创建空列表 list1 [] print(list1) …

Gitlab: 私有化部署

目录 1. 说明 2. 资源要求 3. 安装 4. 配置实践 4.1 服务器 4.2 人员与项目 4.2 部署准备 4.2.1 访问变量及用户账号设置 4.2.2 Runner设置 4.2.3 要点 5. 应用项目 CI/CD 6. 参考 1. 说明 gitlab是一个强大且免费的代码管理/部署工具&#xff0c;能统一集成代码仓…

Freesia项目目录结构

目录结构 前端目录&#xff1a; &#xff08;目录结构来自layui-vue-admin&#xff09; src文件下 api&#xff08;前端请求后端服务的路由&#xff09;assert&#xff08;一些内置或必要的资源文件&#xff09;layouts&#xff08;全局框架样式组件&#xff09;router&…

【转载】深度学习笔记——详解损失函数

原文链接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN账号: Purepisces github账号: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 损失函数 根据您使用的神经网络类型和数…

第四十七回 一丈青单捉王矮虎 宋公明二打祝家庄-强大而灵活的python装饰器

四面全是埋伏&#xff0c;宋江和众人一直绕圈跑不出去。正在慌乱之时&#xff0c;石秀及时赶到&#xff0c;教大家碰到白杨树就转弯走。走了一段时间&#xff0c;发现围的人越来越多&#xff0c;原来祝家庄以灯笼指挥号令。花荣一箭射下来红灯龙&#xff0c;伏兵自己就乱起来了…

Northwestern University-844计算机科学与技术/软件工程-复试注意事项【考研复习】

本文提到的西北大学是位于密歇根湖泊畔的西北大学。西北大学&#xff08;英语&#xff1a;Northwestern University&#xff0c;简称&#xff1a;NU&#xff09;是美国的一所著名私立研究型大学。它由九人于1851年创立&#xff0c;目标是建立一所为西北领地地区的人服务的大学。…

【力扣白嫖日记】550.游戏玩法分析IV

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 550.游戏玩法分析IV 表&#xff1a;Activity 列名类型player_idintdevice_idintevent_datedategames_played…

从 iOS 设备恢复数据的 20 个iOS 数据恢复工具

作为 iPhone、iPad 或 iPod 用户&#xff0c;您可能普遍担心自己可能会丢失存储在珍贵 iOS 设备中的所有宝贵数据。数据丢失的原因多种多样&#xff0c;这里列出了一些常见原因&#xff1a; 1. iOS 软件更新 2. 恢复出厂设置 3. 越狱 4. 误操作删除数据 5. iOS 设备崩溃 …

C++笔记(五)--- 虚函数(virtual)

目录 虚函数介绍 虚函数、覆盖和重载区别 虚函数介绍 C的虚函数是多态性的表现 1.构造函数不能为虚函数2.子类继承时虚函数仍为虚函数3.虚函数类外实现时&#xff0c;不需要加virtual4.有虚函数的类&#xff0c;析构函数一定要写成虚函数&#xff08;否则可能会造成内存泄漏&…

【代码随想录python笔记整理】第十六课 · 出现频率最高的字母

前言:本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。 一、哈希表初步 在之前的学习中,我们使用数组、字符串、链表等等,假如需要找到某个节点,则都要从头开始,逐一比较,直到找到为止。为了能够直接通过要查找的记录找到其存储位置,我们选…

、JMETER与它的组件们

os进程取样器 这个取样器可以让jmeter直接调用python写的测试数据 这样就可以调用python写的测试数据给到jmeter进行调用 注意&#xff1a;1建议python返回转json格式dumps一下&#xff1b;2py文件中需要把结果打印出来&#xff0c;可以不用函数直接编写 传到jmeter之后可以用…

你真的了解C语言中的【柔性数组】吗~

柔性数组 1. 什么是柔性数组2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的优势 1. 什么是柔性数组 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它确实是存在的。 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员…

MyBatis 学习(五)之 高级映射

目录 1 association 和 collection 介绍 2 案例分析 3 一对一关联和一对多关联 4 参考文档 1 association 和 collection 介绍 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 标签&#xff0c;这两个标签是用来关联查询的&#xff0c;它们的属…

算法--时空复杂度分析以及各个数据量对应的可使用的算法(C++;1s内)

这里写目录标题 由数据范围反推算法时间复杂度以及算法内容分析时间复杂度看循环实例1实例2 固定时间复杂度快排和归并排序二分高精度算法双指针算法单链表插入删除操作栈和队列的操作单调栈和单调队列KMPTire并查集堆哈希表BFS、DFS图的深度优先、宽度优先遍历dijkstra算法朴素…

瑞_Redis_Redis的Java客户端

文章目录 1 Redis的Java客户端1.1 Jedis快速入门1.1.1 入门案例1.1.1.1 项目构建1.1.1.2 引入依赖1.1.1.3 建立连接1.1.1.4 释放资源1.1.1.5 测试1.1.1.6 完整测试类代码 1.1.2 Jedis连接池1.1.2.1 连接池工具类1.1.2.2 改造原始代码 &#x1f64a; 前言&#xff1a;本文章为瑞…

常用sql语句及其优化

文章目录 介绍常用sql语句1. 数据查询1.1 SELECT 语句1.2 DISTINCT 关键字1.3 WHERE 子句1.4 ORDER BY 子句1.5 LIMIT 关键字 2. 数据更新2.1 INSERT INTO 语句2.2 UPDATE 语句2.3 DELETE FROM 语句 3. 数据管理3.1 CREATE TABLE 语句3.2 ALTER TABLE 语句3.3 DROP TABLE 语句 …