https://storage.googleapis.com/magentadata/datasets/maestro/v3.0.0/maestro-v3.0.0-midi.zip 下载之后解压缩到./data目录下
源数据集地址:MAESTRO 数据集地址
一种符号音乐生成模型(可以采用GPT架构)
符号音乐,由若干个音符组合而成,每个音符包含:起始和终止时间start和end,音高pitch,强弱velocity四个属性,可以将其看作符号token,用于生成任务
对于符号音乐的token表示方式,有以下三种方案:
- 基于流程控制(对于每一个音符,都使用起始和终止符号)
- 使用duration
- 使用钢琴卷帘
但是符号音乐生成,不同于文本生成,存在以下挑战:
- 多音轨(可能很多种类乐器,不同音符可能同时响起)
- 多维度:一个音符有多种属性(如强弱,音高,持续时间)
我们只考虑钢琴这一种乐器,但是依然存在同一段时间很多音符响起的问题 如何解决?
- 对音符进行组合编码。使用基于BPE的子词聚合算法,但是不能很好地处理每个音符的独立属性
如何表示音符?
- 嵌入时间信息,正余弦位置编码
- 嵌入音高,考虑到音高的周期性,以12为周期(12平均律),正余弦位置编码
- 强弱信息,0-1连续实值嵌入
- 将起始和终止符号视作一种特殊的音高
Velocity: 125 Pitch: 108 Duration: 9.78 Interval: 15.63
如何解码音符? 使用多头分类器,分别输出音高pitch,强弱velocity,持续时间duration,距离上一个音符的偏移量offset
-
音高使用离散分类器[50, 108]
-
强弱输出层velocity不采用激活函数,clip到-1到1.
-
duration离散化(0, 2.5),使用分类器
-
offset离散化[0, 4),使用分类器
-
velocity: (mean=64.69024144892079, std=19.02232476382681)
-
预处理: 切割序列,得到输入表示tokens
-
模型结构
- GPT架构
- 词嵌入维度:64
- 层数:6
- pad长度128
- token个数:(多维度,pitch128,offset和duration暂定)
- 对于duration, offset和pitch输出层,添加HMM模型
-
解码模块 将token序列解码为midi音乐 将midi音乐合成为音频
- 统计其中第一个音乐的音频统计特征,绘制图表
- 需求分析
- 概要设计(5月28日前)
- 使用GPT架构的一个demo
- 实现一个前端,以供展示音乐生成