本文提出了一种新的合成音乐的方法,直接从MIDI音符序列合成为由不同乐器演奏的音乐,并且可以自由地对音色进行操控,具体来说:网络输入MIDI音符序列,输出梅尔频谱,乐器嵌入作为对网络的约束,有了约束之后,网络就可以生成特定乐器的梅尔频谱,在将频谱输入到WaveNet声码器,声码器输出合成的特定乐器的音乐。
本文的方法并不是第一次出现,之前已经有了Tacotron和DeepVoice这两中类似的模型,这两个模型都是文本到语音转换模型,输入一段文本,输出该文本对应的梅尔频谱,跟着WaveNet声码器输出音频波形。TimbreTron也使用了的WaveNet模型作为声码器,和本文不同的是它应用在乐器音色转换。
什么是MIDI文件?
MIDI文件是一种描述性的“音乐语言”,它将所要演奏的乐曲信息用字节进行描述。譬如在某一时刻,使用什么乐器,以什么音符开始,以什么音调结束,加以什么伴奏等等,MIDI文件本身并不包含波形数据,所以MIDI文件非常小巧.
本文实验数据集:
MIDI数据集包含了10种乐器,通过FluidSynth合成对应的音乐,每种乐器合成334个音频文件,其中320用来训练,14个用来验证。为什么要用合成的音乐呢,作者解释说自然乐器演奏的音乐数据集MusicNet中,乐器独奏的音频文件很少,而且还有标签错误。不过我觉得主要是利用合成的音频文件可以进行有监督的训练,即本文模型是监督模型,我们看一下损失函数:
a b s M S E = E [ ( S t r u e − S p r e d ) 2 ] \mathbf { a b s } \mathbf { M S E } = \mathbb { E } \left[ \left( S _ { \mathrm { true } } - S _ { \mathrm { pred } } \right) ^ { 2 } \right] absMSE=E[(Strue−Spred)2]
log − a b s M S E = E [ ( log S t r u e − log S p r e d ) 2 ] \log -abs MSE = \mathbb { E } \left[ \left( \log S _ {true } - \log S _ { pred } \right) ^ { 2 } \right] log−absMSE=E[(logStrue−logSpred)2]
t a n h − l o g − a b s M S E = E [ ( tanh 1 4 log S t r u e − tanh 1 4 log S p r e d ) 2 ] tanh-log-abs MSE = \mathbb { E } \left[ \left( \tanh \frac { 1 } { 4 } \log S _ { true } - \tanh \frac { 1 } { 4 } \log S _ { pred } \right) ^ { 2 } \right] tanh−log−absMSE=E[(tanh41logStrue−tanh41logSpred)2]
其中 S t r u e S_{true} Strue 即为真实频谱, S p r e d S_{pred} Spred即为合成的梅尔频谱,用监督学习训练模型能够拟合训练集。本文的模型是一种判别模型,即学习 p ( y ∣ x ) p(y|x) p(y∣x) ,给定音符序列,学习到其最可能的梅尔频谱表示。也可以将其转变为生成模型,即学习 p ( x , y ) p(x,y) p(x,y),即给定音符序列和目标乐器嵌入合成具有目标乐器音色的音乐。
本文网络结构:
将MIDI文件转换为钢琴卷轴表示(piano roll representation),这种表示包含了88个钢琴键的时间和速度。在将钢琴卷轴表示转化为矩阵。网络的输入就是两个88维的钢琴卷轴表示的连接,共176维,一个是音符起始时间,一个是帧。
输入为Onsets和Frames的连接,即
X = [ X onset ; X frame ] X p , t onset = v the active note ⋅ 1 anote at pitch p is frirst active at time t X p , t frame = v the active note ⋅ 1 anote at pitch p is active at time t \begin{aligned} \mathbf { X } & = \left[ \mathbf { X } ^ { \text { onset } } ; \mathbf { X } ^ { \text { frame } } \right] \\ \mathbf { X } _ { p , t } ^ { \text { onset } } & = v _ { \text { the active note } } \cdot \mathbb { 1 } _ { \text { anote at pitch } p \text { is frirst active at time } t } \\ \mathbf { X } _ { p , t } ^ { \text { frame } } & = v _ { \text { the active note } } \cdot \mathbb { 1 } _ { \text { anote at pitch } p \text { is active at time } t } \end{aligned} XXp,t onset Xp,t frame =[X onset ;X frame ]=v the active note ⋅1 anote at pitch p is frirst active at time t=v the active note ⋅1 anote at pitch p is active at time t
X为176维向量
输入X经过 1x1卷积,输入到FiLM约束层,再经过双向LSTM层,FiLM约束层,1x1卷积层,输出梅尔频谱,梅尔频谱输入WaveNet声码器,输出音频波形。
实验部分:
网络为什么这么设计 ?
作者做了脱离实验(ablation study):
设置了不同的条件来探索那种模型结构较好,训练集和验证集损失作为评价标准。只输入Frame或者Onset结果都是极差的,从“Second FiLM only”这一行可以看出,如果去掉第一个FiLM层,模型在验证集上的损失达到最大,可以说明第一个FiLM层可以帮助循环层学习到音色特征。做脱离实验来说明模型的有效性,在这个具体的模型结构上来说是可以的,但是可能还有其他更好的模型结构作者没有去探索。
合成的音频质量怎么样?
评价指标包括主观和客观评价。因为模型在不同的阶段都会产生导致音频质量的下降,比如 u − l a w u-{law} u−law 量化和WaveNet合成。使用皮尔逊相关系数来度量乐器在不同阶段音频质量下降的程度。下图绘制了原始音频和合成音频之间的皮尔逊相关系数,相关系数越低,音频质量下降的越厉害。
图a中黄线是真实的频谱通过WaveNet后合成的音频和原始音频的相关系数,代表了模型的合成性能的上限。绿色,红色和紫色线代表了不同损失函数下的相关系数,可以看到使用abs损失的模型相关系数最低,模型最差,而使用log-abs函数损失的两个模型性能差不多,更加接近性能上限。图b是图a中绿色线所对应的模型在10种乐器上的相关系数,不同乐器之间的差别很大,大部分乐器在音高较低的部分相关系数很小,也就是音频质量下降的厉害。
主观MOS评分的结果和上图结果一致,使用了tanh-log-abs MSE损失的网络效果最好。
音色嵌入空间
本文一个重要的点就是音色嵌入空间,嵌入空间包含了音色信息。作者创建了320x320的网格,包含了所有乐器的嵌入,然后使用网格中的每个像素点来预测其对应的梅尔频谱。谱中心点和平均能量中心点如下图所示:
谱中心比较高代表泛音部分较强,较低则代表更接近于单音符。平均能量较高代表音符持续时间长,平均能量较低表示音符短暂而且衰减的很快。两图的结果是一致的。