当前位置: 首页 > 编程日记 > 正文

程序员拯救乐坛?OpenAI用“逆天”GPT2.0搞了个AI音乐生成器

640?wx_fmt=jpeg

作者 | 琥珀

出品 | AI科技大本营(id:rgznai100)


基于深度神经网络进行语音合成、音乐风格迁移,正成为不少致力于“让人人成为音乐家”的研究人员所追求的事情。像此前我们报道的微软小冰作词又作曲,AI帮清华博士写说唱歌词晋级,甚至不久前中央音乐学院招音乐AI方向博士生。不久前,为了纪念著名作曲家巴赫诞辰,Google 根据巴赫合唱和声训练而成的机器学习模式 Coconet 吸引了不少人前来围观。


最近,OpenAI 最新研发的 MuseNet 的深度神经网络,可以制作 4 分钟时长的音乐作品,其中涵盖 10 种不同的乐器(如钢琴、鼓、贝斯、吉他),甚至还能将诸如乡村风格、莫扎特风格、甲壳虫乐队风格的音乐融合起来。


640?wx_fmt=png


首先需要说明的是,MuseNet 并没有根据人类输入的对音乐理解进行显式编程,而是通过学习预测成千上万个 MIDI 文件的下一个 token 来发现和弦、节奏和风格的模式。MuseNet 采用了无监督神经网络语言模型 GPT2.0(是的,就是此前被誉为可以 BERT 媲美的 NLP 模型 GPT2.0,普遍观点是,经过预训练可以预测上下文,无论是音频还是文本。)


640?wx_fmt=png


据悉,5 月 12 日将正式开放 MuseNet 语言生成工具的试用版本。(以下为学习了肖邦作曲风格的英国女歌手 Adele 的 Someone Like You 的 AI编曲录音。)



传送门:

https://openai.com/blog/musenet/


过程原理


在简单模式(默认显示)中,用户会听到预设生成的随机未切割样本;然后选择某作曲家或风格下的著名作品片段,即可生成各种风格的音乐。


在高级模式下,用户可直接与模型交互。这个过程需要完成的时间会更长,但用户可以创建一个全新的作品。


  • 注意:MuseNet 通过计算所有可能的音符和乐器的概率来生成每个音符,模型会倾向采用你选择的乐器,但也可能会选择逼得乐器;同样,MuseNet 也会搭配不同风格的乐器,如果用户自行选择最接近作家或乐队常用分风格或乐器,产生的音乐会更自然。


研究人员还创建了作曲家和乐器的 token,以便更好地控制 MuseNet 生成的样本类型。训练期间,这些作曲家和乐器 token 将预先添加到每个样本中,因此模型将学习利用该信息进行音符预测。生成音乐时,可以调整模型,如拉赫玛尼诺夫的钢琴曲为前提,以创建选定风格的音乐。


研究人员还将 MuseNet 中的嵌入进行可视化,以深入了解模型所学到的内容。他们采用了 t-SNE 创建各种风格嵌入的余弦相似性。(如下 2D 图像所示,可查看某个特定作曲家或风格之间的关系。)


640?wx_fmt=png


利用 Sparse Transformer 记住长期结构


MuseNet 使用 Sparse Transformer 的重算和优化内核来训练一个具有 24 个注意力头的 72 层网络,并将全部注意力放在 4096 个 token 的上下文中。这个长文本的目的是能够记住一个片段中的长期结构。或者,它还可以创建音乐旋律结构。


音乐生成是测试 Sparse Transformer 的一个有用域,因为它位于文本和图像的中间位置。它具有文本的 token 结构。在图形中,你可以查看 N 个 token,而在音乐中,查看之前的起点没有固定数。此外,还可以很容易听到该模型是否在按照成百上千个 token 顺序来获取长期结构。


数据集


研究人员收集了不同来源的 MuseNet 训练数据(ClassicalArchives、BitMidi、MAESTRO ),涵盖爵士乐、流行乐,以及非洲、印度和阿拉伯等不同风格的音乐。


首先,研究人员采用 transformer 在序列数据上进行训练:给定一组音符,要求它预测其他即将出现的音符。在尝试了几种不同方法后将 MIDI 文件编码为适用于此任务的 token。


在这种其中,他们采用和弦方法,将每次听到的音符组合视为单独的 “和弦”,并为每个和弦指定一个 token。然后,通过仅关注音符开头压缩音乐模式,并尝试使用字节对编码方案进行近一步压缩。


研究人员还尝试了标记时间推移的两种不同方法:一是根据音乐节奏进行缩放的 token,代表节拍或节拍的一小部分;二是以绝对时间为单位来标记 token。他们采用了一种结合了表现力和简洁性的编码方式:将音高、音量以及乐器信息组合称一个 token。


在训练中,


  • 通过提高和降低音高来调换音符。(之后的训练中,减少了调换数量,使得每个乐器都有生成的音符。)

  • 提高音量,调高或降低不同样本的整体音量。

  • 增加时间,当使用以秒为单位的绝对时间编码时,可有效稍微减缓或加速片段。

  • 在 token 嵌入空间中使用 mixup。


研究人员还创建了一个内部评测,在训练中,通过模型预测给定的样本是否来自数据集还是之前生成的样本,进行评判。


嵌入


为了给模型提供更加结构化的上下文,研究人员还添加几种不同类型的嵌入。


除了标准位置嵌入外,还有学习到的嵌入,可在给定的样本中追踪时间推移;然后,他们还在每个和弦中的音符添加了嵌入;最后,他们添加了两个结构化嵌入,该嵌入可表明模型既定的音乐样本在较大音乐片段中的位置。


(本文为AI科技大本营整理文章,转载请微信联系 1092722531)

长三角开发者联盟

代码就是力量,长三角的开发者联合起来!

加入「长三角开发者联盟」将获得以下权益

长三角地区明星企业内推岗位
CSDN独家技术与行业报告
CSDN线下活动优先参与权
CSDN线上分享活动优先参与权


扫码添加联盟小助手,回复关键词“长三角2”,加入「长三角开发者联盟」。

640?wx_fmt=jpeg

推荐阅读:

  • 打开阿兹海默之门:华裔张复伦利用RNN成功解码脑电波,合成语音 | Nature

  • Python程序员Debug利器,和Print说再见 | 技术头条

  • 前端程序员别哭,优化性能的经验分享给你

  • 如何使用Python玩转PDF各种骚操作?

  • 人工智能先驱 Nils Nilsson 去世,吴恩达、Yann LeCun 悼念!

  • 关于谷歌云,你应该知道的一切! | 技术头条

  • 养生 996 的崛起:马云竟给他最痛恨的「兔子」站台?

  • 澳洲生活7年, 前阿里程序员谈我们的区块链差距究竟在哪?

  • 她说:为啥程序员都特想要机械键盘?这答案我服!

640?wx_fmt=png


点击阅读原文,了解CTA核心技术及应用峰会

相关文章:

centos7 JDK1.8

安装之前先检查一下系统有没有自带open-jdk rpm -qa |grep java rpm -qa |grep jdk 卸载找出的已安装Java相关rpm文件:rpm -e --nodeps 重新输入rpm -qa |grep java ,卸载完成 下载jdk1.8 for linux的安装包 jdk-8u11-linux-x64.tar.gz,下载…

【FFmpeg】详解FFmpeg解封装、解码流程

目录 1、获取媒体信息头2、获取媒体流信息3、准备解码器3.1 获取视频、音频、字幕流在解封装上下文 AVFormatContext 的流列表 AVStream **streams 中的索引3.2 使用已经获取的流信息创建对应的解码器及其上下文,以视频解码器为例3.3 初始化解码器上下文4、准备用于保存解码前…

Win2008远程多用户登陆的配置方法

核心提示:在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法 在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法: 首先要启用远程桌面这一功能…

策略梯度搜索:不使用搜索树的在线规划和专家迭代 | 技术头条

作者 | Thomas Anthony、Robert Nishihara、Philipp Moritz、Tim Salimans、John Schulman译者 | 李倩编辑 | Rachel、Jane出品 | AI科技大本营(ID:rgznai100)蒙特卡罗树搜索(MCTS)算法执行基于模拟的搜索以改进在线策…

【FFmpeg】解码时refcounted_frames标志的使用

1、refcounted_frames说明 在接口 avcodec_decode_video2 的注释中,有关于 refcounted_frames 的详细说明: (1)当 AVCodecContext.refcounted_frames 被设置为1,该 AVFrame 被引用计数,返回的引用属于调用者。当不再需要 AVFrame 时,调用者必须使用 av_frame_unref() 来…

python-selenum3 第五天定位——不常用定位与css定位详

使用tag来定位tag定位的是标签,不常用例如:百度的输入框标签是input最终会报错,因为百度首页input标签太多了 driver webdriver.Firefox(executable_path"d:\\geckodriver") driver.get("https://www.baidu.com")driver…

nagios监控三部曲之——为什么nagios不能发送报警邮件(2)

最近我写了关于naigos监控的安装与配置的技术文档,公司运维按照我的文档部署naigos,发现不能发送报警邮件,经过我的检查,发现问题如下: 1、hosts里的配置 [rootnagios ~]# cat /etc/hosts # Do not remove the follow…

小样,加张图你就不认识我了?“补丁”模型骗你没商量!| 技术头条

作者 | Simen Thys, Wiebe Van Ranst(共同一作)译者 | 刘畅编辑 | Rachel、Jane出品 | AI科技大本营(id:agznai100)【导语】本文介绍了一个可以生成欺骗性补丁的系统模型,通过将该补丁放置在固定位置,人们能够使自己在…

【经验】如何查看gcc、g++不加-std时的默认版本

一、测试gcc 1、测试代码:c.c #include <stdio.h>int main(void) { #ifdef __STDC_VERSION__printf("__STDC_VERSION__ %ld \n", __STDC_VERSION__); #endif #ifdef __STRICT_ANSI__printf("__STRICT_ANSI__ %d \n", __STRICT_ANSI__); #endifre…

发布开源框架到CocoaPods入坑指南

个人原文博客地址: 发布开源框架到CocoaPods入坑指南在开发过程中一定会用到一些第三方框架, 只要安装了CocoaPods, 然后通过pod install命令, 就可以集成框架到项目中了可是如果想要把自己的框架或者组件也开源出去, 让别人也可以使用, 那该如何入手 ?对于CocoaPods还不是很了…

linux下打印机共享及监控

操作系统:centos6.0 主要软件&#xff1a;cups&#xff0c;samba&#xff0c;ghostpostscript 打印机&#xff1a;richo 3025 主要功能&#xff1a;通过samba将打印机共享给局域网用户&#xff0c;并实现对打印内容的监控 主要有三大步&#xff1a;本机安装打印机&#xff0c;通…

【H.264】x264命令详解:x264 --fullhelp

1、简述 宏区块: macroblock:。是一种图像压缩的术语。 宏区块是运动预测的基本单位,一张完整的图像(frame)通常会被切割成几个宏区块。h.264 的宏区块大小是可变的,常用 16x16 pixels。 帧类型 “帧”基础知识: 影片可以看作是由一张张连续的图片组成的,每幅图片就…

东大漆桂林、清华李涓子、复旦肖仰华等大牛确认出席CTA峰会!5月一起打卡杭州...

5月26日-27日&#xff0c;由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心召开。首届CTA核心技术及应用峰会将聚焦人工智能&#xff0c;邀请技术领航者&#xff0c;与开发者共同探讨机器学习和知识图谱的前沿研究及应用。20…

【Oracle Database】数据库用户管理

创建用户 SQL> create user soe identified by soe default tablespace soe temporary tablespace temp; User created.查询用户的默认表空间 SQL> set line 200 SQL> col username for a30 SQL> col account_status for a20 SQL> select username,account_stat…

MySQL两主多从,且故障转移配置

一、角色划分1、MySQL数据库规划主机名 IP地址 角色 mysql_server_idweiliaodb1 192.168.1.233 master1 1weiliaodb2 192.168.1.234 master2 2weiliaodb3 192.168.1.235 slave1 3monitor 192.168.1.240 mmm_mon -2、虚拟IP规划IP地址 角色192.168.1.10 writer192.168.1.20 read…

Go开发者路线图2019,请收下这份指南

整理 | Rachel责编 | 阿司匹林出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;Go是Google开发的一种静态、强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的类C编程语言。2009以开源项目的形式发布&#xff0c;2012年发布1.0稳定版本&#xff0c;距今已经十…

【Ubuntu】在Ubuntu中设置永久的DNS

1、问题描述 ping不通域名&#xff0c;比如“ping www.baidu.com”时&#xff0c;报错“ping: unknown host www.baidu.com”。这是因为ubuntu默认情况下没有设置DNS。 在ubuntu上设置DNS的方法&#xff0c;修改“/etc/resolv.conf”&#xff0c;添加“nameserver 8.8.8.8”&a…

实习期间问题总结

主要针对实习期间&#xff0c;接触的部分问题进行总结&#xff0c;后续会不间断的补充&#xff0c;作为实习期间的回顾。 1&#xff0c;git ,github和gitlab的关系 git 是一个版本控制工具&#xff0c;github是一个用git做版本控制的项目托管平台&#xff0c;他是一个网站&…

在windows sever 2008系统中如何添加桌面体验功能

1.开启THEMES服务&#xff1a;运行&#xff0d;services.msc &#xff0d;找到Themes服务项&#xff0c;默认是禁用&#xff0c;改为自动。 2.运行服务器管理器&#xff1a;左窗口选择功能&#xff0d;右边点“添加功能”在弹出的“添加功能向导”窗口中拖到最下面&#xff0c;…

17篇论文入选CVPR 2019,百度AI都在关注什么?(附论文地址)

整理 | 阿司匹林出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;计算机视觉和模式识别大会CVPR 2019即将于6月在美国长滩召开&#xff0c;作为人工智能领域计算机视觉方向的重要学术会议&#xff0c;CVPR每年都会吸引全球最顶尖的学术机构和公司的研…

【GStreamer】在x264enc中设置profile级别

1、问题描述 在使用GStreamer生成h.264的rtmp流时,不知道怎么设置h.264的profile级别。默认一直是“high”: video/x-h264, ... profile=(string)high, ...2、解决方法 查看官网手册中,有如下解释 The H264 profile that is eventually used depends on a few settings. …

js 使用a标签 下载资源

文档 let data new Blob([hello ajanuw], {type: application/text})let src window.URL.createObjectURL(data)let dl document.createElement(a)dl.href src;dl.download hello.txtdl.click() 切片下载 let data new Blob([hello ajanuw], {type: application/text }) …

linux 新增swap分区

由于用vmware 物理机转换成虚拟机时 忘记把swap 分区转过来了&#xff0c;只能手动在系统里添加了 1建立1G 大小的交换分区 # dd if/dev/zore of/opt/swapfile bs1M count1024 2,设置交换分区文件 # mkswap /opt/swapfile 3.立即启用交换分区文件 # swapon /opt/swapfile 4.使系…

通过cookies跳过验证码登陆页面,直接访问网站的其它URL

我每次手动访问去NN网的一家酒店&#xff0c;就不需要登陆&#xff0c;一旦我用脚本打开就会让我登陆&#xff0c;而登陆页面又有验证码&#xff0c;不想识别验证码&#xff0c;所以就想&#xff1a;“通过cookies跳过验证码登陆页面&#xff0c;直接访问网站的其它URL”转载虫…

可视化深入理解损失函数与梯度下降 | 技术头条

作者 | Hugegene译者 | 刘畅责编 | Rachel出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;【导语】本文对梯度函数和损失函数间的关系进行了介绍&#xff0c;并通过可视化方式进行了详细展示。另外&#xff0c;作者对三种常见的损失函数和两种常用的激活函…

【Qt】Linux上设置自启动后qApp->applicationDirPath()的返回值问题

1、问题描述 开发程序过程中&#xff0c;使用qApp->applicationDirPath()返回程序所在目录&#xff0c;一直没问题。但是在设置自启动后&#xff0c;qApp->applicationDirPath()返回的目录不是程序所在目录。 2、原因分析 查看qApp->applicationDirPath()官方手册&…

sqlserver 行转列

还写了一篇Linq 实现 DataTable 行转列有时间大家可以看一下 sqlserver把行转成列在我们编码中是经常遇到的我做一个小例子大家看一下 1 --创建一个表 2 create table PayPhoneMoney 3 ( 4 id int identity(1,1), 5 userName Nvarchar(20), 6 payType nvarchar(20)…

Javascript闭包和闭包的几种写法及用途

好久没有写博客了&#xff0c;过了一个十一长假都变懒了&#xff0c;今天总算是恢复状态了。好了&#xff0c;进入正题&#xff0c;今天来说一说javascript里面的闭包吧&#xff01;本篇博客主要讲一些实用的东西&#xff0c;主要将闭包的写法、用法和用途。 一、什么是闭包和闭…

【GStreamer】使用capsfilter设置x264enc中的profile级别

1、问题描述 在【GStreamer】在x264enc中设置profile级别中,通过设置x264enc的属性,只将profile由high级别切换到main,但是在切换到baseline时,失败了。 2、解决方法 这里使用capsfilter,直接指定x264enc的profile。相关代码如下: // 创建元素 GstElement *h264enc =…

一文帮你梳理清楚:奇异值分解和矩阵分解 | 技术头条

作者 | K. Delphino译者 | Linstancy编辑 | Rachel出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;【导读】在推荐系统的相关研究中&#xff0c;我们常常用到两个相关概念&#xff1a;矩阵分解和奇异值分解。这两个概念是同一种算法吗&#xff1f;两者到底…