零、写在前面
现在来看,这是一次失败的实验,因为突然有新的想法,就先搁置下。但在开始新实验前,暂且先把失败的这个记录下来。
为了使用seq2seq模型进行“交响乐翻译”, 需要以乐句为单位的输入。人为标注效率太低,所以要做一个自动实现乐句分割的功能。
一、原理
这一神经网络的灵感来自trigger word detection,它将音频的频谱图输入至循环神经网络作为x,而y是1或者0:在触发词结束瞬间之后的n=50个时间步内y为1,其余为0。
神经网络的结构是这样的:最底层是对频谱图的1维卷积(可视为卷积核的高等于总高的卷积,即没有卷积核的换行),卷积后的结果输入至两层GRU循环神经网络。最后的输出因为目标y为0或1,所以使用sigmoid函数作为激活函数。
在本实验中,神经网络的架构基本不变,只是输出替换为交响乐midi文件的piano_roll(取消了乐器的标注,合并所有乐器在一个piano_roll矩阵中)。piano_roll是一个二位矩阵,两个维度分别为时间和音高。时间的单位为0.01,音高在0-128之间。矩阵每个位置上的数值代表了该音符的力度。
输出与之前的触发词检测类似,是手工标注的一维01数列,这里n=20。作为初步实验,只是用一首midi文件(贝多芬第七交响曲第四乐章)作为训练集。
另外,为了方便处理midi文件,我用了python的pretty_midi库。
二、代码
引入库文件:
import numpy as np
import pretty_midi
import matplotlib.pyplot as plt
import keras
处理输入与输出
file_name = 'Symphonie7_Opus92_Mvt4.mid'
pm = pretty_midi.PrettyMIDI(file_name)