苗北辰,郭為安,汪鐳
(1. 同濟(jì)大學(xué) 電子與信息工程學(xué)院,上海 201804; 2. 同濟(jì)大學(xué) 中德學(xué)院,上海 201804)
音樂生成是使用算法將音樂創(chuàng)作過程的部分或全部自動(dòng)化的研究。使用數(shù)學(xué)的方式研究音樂的生成雖然在一千年前就已出現(xiàn),但受限于其他相關(guān)學(xué)科的發(fā)展,一直沒有較大的進(jìn)步。而近年來,隨著深度學(xué)習(xí)的不斷發(fā)展,音樂生成問題重新回到研究者們的視野中,與之相關(guān)的多種算法模型也都被應(yīng)用于音樂生成問題的研究。特別是Char RNN模型的提出,以序列預(yù)測(cè)的方式訓(xùn)練生成網(wǎng)絡(luò)的研究變得火熱。Eck等[1]首次將LSTM引入音樂生成領(lǐng)域,基于前序音符生成后序音符的思想,搭建了藍(lán)調(diào)旋律的生成系統(tǒng)。Sturm等[2]使用音樂的ABC格式文本作為訓(xùn)練數(shù)據(jù),率先將Char RNN模型引入音樂生成領(lǐng)域,對(duì)音符文本進(jìn)行one hot編碼,使用當(dāng)前音符的編碼向量,預(yù)測(cè)下一個(gè)音符的概率分布,然后采樣生成下一個(gè)字符,最終生成質(zhì)量較好的音樂旋律。區(qū)別于ABC格式的旋律文本數(shù)據(jù),Choi等[3]通過將旋律與和弦一起編碼成文本數(shù)據(jù),然后使用Char RNN模型生成了擁有和弦的多聲部音樂。王程等[4]通過將音樂的音頻數(shù)據(jù)編碼成與文本類似的one hot向量,然后使用Char RNN進(jìn)行音樂的生成。Lackner[5]則通過將音樂中的和弦和旋律分離的形式,使用和弦去預(yù)測(cè)旋律對(duì)Char RNN進(jìn)行訓(xùn)練,通過輸入人工創(chuàng)作的和弦來生成相應(yīng)的旋律[5]。Chu等[6]提出了分層RNN結(jié)構(gòu)的音樂生成系統(tǒng),在系統(tǒng)底層生成音符,在更高層生成和弦及鼓節(jié)奏,通過將更多樂理知識(shí)引入神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中,生成了結(jié)構(gòu)良好的音樂作品。Makris等[7]提出了使用RNN生成節(jié)奏序列,用于生成變節(jié)奏的音樂作品。Oord等[8]提出的WaveNet用于生成原始的音頻格式音樂,該網(wǎng)絡(luò)使用音頻壓縮后的數(shù)據(jù)進(jìn)行訓(xùn)練,表述為16位的整數(shù)值序列,與前人不同的是,他們使用卷積神經(jīng)網(wǎng)絡(luò)來搭建系統(tǒng)。Mogren[9]使用兩個(gè)RNN作為生成對(duì)抗網(wǎng)絡(luò)的生成器和判別器,音樂數(shù)據(jù)模型則采用了類似MIDI數(shù)據(jù)Event事件的編碼方式。
綜上所述,可以看出目前音樂生成的研究成果主要集中在旋律的生成研究上,考慮旋律與和弦搭配的多聲部音樂生成的研究并不是很多,本文將從多聲部音樂數(shù)據(jù)的建模方式以及生成模型的訓(xùn)練策略兩個(gè)方向進(jìn)行研究,嘗試搭建多聲部音樂的生成系統(tǒng)。
音樂數(shù)據(jù)是一種結(jié)構(gòu)非常復(fù)雜的時(shí)序數(shù)據(jù)。要使用算法的方式進(jìn)行音樂數(shù)據(jù)的生成,首先要理解音樂數(shù)據(jù)的結(jié)構(gòu)特征和音樂信息的表達(dá)方式。本文基于現(xiàn)代音樂常用的表達(dá)方式,即采用MIDI格式和Piano Roll格式分析多聲部音樂的特點(diǎn),建立音樂數(shù)據(jù)模型。
MIDI(音樂數(shù)字接口)是一種描述計(jì)算機(jī)數(shù)字接口與各種樂器連接協(xié)議的技術(shù)標(biāo)準(zhǔn)。與ABC等文本格式相比,MIDI所攜帶的信息量更大,現(xiàn)代音樂基本都是用MIDI制作合成。它的基本思想是將不同音高和音長(zhǎng)組合的音符信息表示成一個(gè)個(gè)的事件(Event),同時(shí)還攜帶音符的音量和起始時(shí)間等信息,量化了音樂的基本特征,并將音樂演奏中的每種樂器表示為一個(gè)通道(channel),記錄每種樂器的音符彈奏的方式。MIDI的事件信息有很多類型,由于本文主要聚焦于音樂本身的表達(dá),所以此處只介紹與音樂生成系統(tǒng)相關(guān)的基本事件。MIDI的基本音符事件有2種:Note on事件和Note off事件。Note on事件表示一個(gè)具有某種音高、音長(zhǎng)的音符在某個(gè)通道開始被特定樂器彈奏,如
Piano Roll表示方法是受自動(dòng)鋼琴的啟發(fā),它的實(shí)質(zhì)是一個(gè)連續(xù)的紙卷,通過在上面進(jìn)行穿孔來記錄信息。每個(gè)穿孔代表一個(gè)音符控制信息,用于觸發(fā)給定的音符。穿孔的長(zhǎng)度對(duì)應(yīng)音符的持續(xù)時(shí)間,穿孔的定位與其間隔相對(duì)應(yīng),每一列的穿孔表示鋼琴中的每一個(gè)琴鍵。
本文所研究的是多聲部音樂的生成問題,因此多聲部音樂數(shù)據(jù)的表示方式至關(guān)重要。根據(jù)上文對(duì)MIDI格式和Piano Roll格式的介紹,可以較為容易地設(shè)計(jì)一種多聲部音樂的表達(dá)方式,即使用0和1組成的矩陣表示多聲部音樂中每個(gè)音符的狀態(tài)信息,其中行表示鋼琴中的88個(gè)鍵,也是鋼琴所能表示的音高范圍,列則表示時(shí)間序列。1表示琴鍵被按下,0表示琴鍵被彈起。但這種方式有1個(gè)缺陷,即在出現(xiàn)一連串的1時(shí),無法分辨出是被多次彈奏還是一個(gè)持續(xù)較長(zhǎng)的音。所以可以結(jié)合MIDI格式的Note on和Note off事件思想,將原有的鋼琴鍵維度88擴(kuò)展成176。使用前88維的1表示琴鍵被按下,也就是Note on事件,使用后88維的1表示琴鍵被彈起,也就是Note off事件,如圖1所示。
圖 1 MIDI與Piano Roll相互轉(zhuǎn)化Fig. 1 Translation between MIDI and Piano Roll
這種方式不僅可以有效區(qū)分長(zhǎng)音和多次彈奏,且方便MIDI音樂數(shù)據(jù)與Piano Roll矩陣的相互轉(zhuǎn)化。但通過實(shí)踐發(fā)現(xiàn)這種多聲部音樂的建模方式雖然可以用同一時(shí)刻鋼琴鍵狀態(tài)向量表示旋律與和弦的彈奏狀態(tài),但無法表征旋律與和弦在時(shí)間維度上的匹配信息,即各音符之間是獨(dú)立表達(dá)的。
根據(jù)前文的研究分析,本文認(rèn)為使用原始Piano Roll格式進(jìn)行多聲部音樂數(shù)據(jù)的表達(dá)方式,并不能表現(xiàn)旋律與和弦更高維度的組合特征?;诖耍疚奶岢鍪褂脤?duì)同一時(shí)間步音符狀態(tài)壓縮的方式,提取各音符狀態(tài)之間的關(guān)系作為音樂的隱式特征,并以此作為多聲部音樂的數(shù)據(jù)模型。
自編碼器(autoencoder)是一種具有一層隱藏層的神經(jīng)網(wǎng)絡(luò),其特殊的結(jié)構(gòu)在于:網(wǎng)絡(luò)的輸入層與輸出層的神經(jīng)元節(jié)點(diǎn)數(shù)目相同,且隱藏層的節(jié)點(diǎn)數(shù)要小于輸入與輸出層。在訓(xùn)練自編碼器時(shí),可以使用傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)訓(xùn)練方式。唯一不同的是,訓(xùn)練自編碼器的輸入數(shù)據(jù)就是要輸出的目標(biāo)數(shù)據(jù)。因此自編碼器學(xué)習(xí)的是一種數(shù)據(jù)的表示功能。因?yàn)殡[藏層的節(jié)點(diǎn)要比輸入層的節(jié)點(diǎn)少,所以編碼器部分必須對(duì)信息進(jìn)行有損壓縮,而解碼器部分則需要根據(jù)壓縮后的特征信息盡可能地重構(gòu)原始的信息。這就迫使自編碼器去發(fā)現(xiàn)數(shù)據(jù)中重要的區(qū)分點(diǎn),所以自編碼器通常用于提取數(shù)據(jù)中更高維度的特征。
隨著深度學(xué)習(xí)的出現(xiàn),棧式自編碼器(stacked autoencoder)得到了更廣泛的應(yīng)用。棧式自編碼器是由多個(gè)自編碼器嵌套組成,且隱藏層的神經(jīng)元數(shù)目依次遞減。在這種結(jié)構(gòu)中,編碼器會(huì)不斷地壓縮數(shù)據(jù)以提取出更高級(jí)別的特征。因此這種類似深度神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),是現(xiàn)在常用的特征提取手段之一。
通過對(duì)現(xiàn)有特征提取方法的比較,本文決定采用棧式自編碼器對(duì)多聲部音樂的Piano Roll格式數(shù)據(jù)進(jìn)行隱式特征提取。
本文使用從freemidi.org采集的50首MIDI格式的音樂數(shù)據(jù)進(jìn)行棧式自編碼器訓(xùn)練。通過1.2節(jié)介紹的Piano Roll格式與MIDI數(shù)據(jù)的轉(zhuǎn)化關(guān)系,提取50首音樂的Piano Roll矩陣。在實(shí)驗(yàn)中發(fā)現(xiàn),由于提取的音樂數(shù)據(jù)風(fēng)格相似,音樂的音高都在24~102。通俗地講,鋼琴的88個(gè)鍵中只被用到了中間的78個(gè)鍵。為了降低計(jì)算復(fù)雜度,本文將原有的176維的Piano Roll矩陣減少到156維,根據(jù)此格式的音樂數(shù)據(jù)搭建棧式自編碼器 ,如圖2所示。
圖 2 自編碼器結(jié)構(gòu)Fig. 2 Structure of the autoencoder
棧式自編碼器的輸入層和輸出層的神經(jīng)元節(jié)點(diǎn)均為Piano Roll的鋼琴鍵維度156。而對(duì)于隱藏層,則需先設(shè)計(jì)一個(gè)比輸入輸出層節(jié)點(diǎn)數(shù)目小的節(jié)點(diǎn)數(shù),通過后續(xù)訓(xùn)練實(shí)踐,逐一調(diào)整。
根據(jù)前文分析,本文所要搭建的棧式自編碼器是對(duì)Piano Roll矩陣的每個(gè)156維的0、1向量進(jìn)行特征提取。經(jīng)過解碼器后,應(yīng)生成與輸入向量相同的輸出結(jié)果。所以本文采用訓(xùn)練網(wǎng)絡(luò)的代價(jià)函數(shù)為均方差代價(jià)函數(shù),即
式中:a 為網(wǎng)絡(luò)的輸出結(jié)果;y為目標(biāo)值,即輸入向量;m為每一次訓(xùn)練的樣本數(shù)目。本文使用Tensorflow搭建此模型,根據(jù)模型Tensorflow自動(dòng)生成的計(jì)算 圖如圖3所示。
圖 3 棧式自編碼器計(jì)算圖Fig. 3 Computational graph of the stacked autoencoder
使用freemidi.org的50首MIDI音樂提取的Piano Roll矩陣對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,通過調(diào)整網(wǎng)絡(luò)超參數(shù)得到訓(xùn)練結(jié)果如圖4所示,其中橫坐標(biāo)為訓(xùn)練數(shù)據(jù)分批后的迭代次數(shù),縱坐標(biāo)為根據(jù)式(1)計(jì)算的損失值。
圖 4 訓(xùn)練結(jié)果Fig. 4 Training results
為測(cè)試該自編碼器在訓(xùn)練數(shù)據(jù)集以外的音樂數(shù)據(jù)中的特征提取效果,使用另外4首相同風(fēng)格的MIDI音樂對(duì)網(wǎng)絡(luò)進(jìn)行測(cè)試。將音樂的音符狀態(tài)數(shù)據(jù)進(jìn)行編解碼,比較網(wǎng)絡(luò)的輸出值與真實(shí)值,準(zhǔn)確度如表1所示。
表 1 棧式自編碼器的泛化結(jié)果Table 1 Generalization results of the stacked autoencoder %
從表1可以看出,本小節(jié)訓(xùn)練的棧式自編碼器在這一風(fēng)格的音樂數(shù)據(jù)中,編碼后解碼的準(zhǔn)確率較高,可以理解為編碼器提取到了較好的隱式音樂特征。通過使用棧式自編碼器的編碼器部分,對(duì)音樂數(shù)據(jù)的Piano Roll矩陣進(jìn)行隱式特征提取,即得到了本文所要使用的多聲部音樂數(shù)據(jù)模型。
經(jīng)網(wǎng)
R絡(luò)N的N基是礎(chǔ)全上連,接將神隱經(jīng)藏網(wǎng)層絡(luò)的的節(jié)擴(kuò)點(diǎn)展進(jìn),行在連全接連[1接0],神即每一個(gè)隱藏層節(jié)點(diǎn)的輸入不再只是前一層節(jié)點(diǎn)的輸出,同時(shí)還包括本節(jié)點(diǎn)在上個(gè)時(shí)刻的隱藏狀態(tài)h。RNN因其特殊的結(jié)構(gòu),在進(jìn)行后向傳播訓(xùn)練時(shí)與全連接神經(jīng)網(wǎng)絡(luò)有所不同。在訓(xùn)練RNN的過程中,通常采用一種特殊的學(xué)習(xí)方法,即BPTT(back propagation through time)算法。RNN的輸入和輸出可以被理解成一個(gè)序列。因此,在進(jìn)行后向傳播訓(xùn)練的時(shí)候可以將節(jié)點(diǎn)按時(shí)間序列進(jìn)行展開,得到一個(gè)類似全連接神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),在展開的結(jié)構(gòu)上使用截?cái)嗟男蛄羞M(jìn)行后向傳播訓(xùn)練。在經(jīng)典RNN的基礎(chǔ)上,Hochreiter等[11]提出了長(zhǎng)短期記憶循環(huán)神經(jīng)網(wǎng)絡(luò) (LSTM),在眾多序列問題中得到了廣泛的應(yīng)用。除了隱藏狀態(tài) h值以外,LSTM在節(jié)點(diǎn)的內(nèi)部還儲(chǔ)存細(xì)胞狀態(tài)(cell state)C值,用來表示信息的長(zhǎng)期依賴和更新,并且添加了3個(gè)門結(jié)構(gòu)來控制節(jié)點(diǎn)狀態(tài)的更新大小。具體計(jì)算公式如下:
3個(gè)門的結(jié)果都由輸入 xt與前一時(shí)刻的隱藏狀態(tài) ht-1得 到。第1個(gè)門是忘記門f,決定在當(dāng)前時(shí)刻要從過去的 C值丟棄多少信息。第2個(gè)門是輸入門i ,決定在當(dāng)前時(shí)刻將多少信息存入 C 值。要加入的新信息用符號(hào) C?t表示。根據(jù)忘記門和輸入門的控制系數(shù),以及要加入細(xì)胞的新信息,更新當(dāng)前的細(xì)胞狀態(tài)得到 Ct。第3個(gè)門是輸出門o,根據(jù)當(dāng)前時(shí)刻的細(xì)胞狀態(tài) Ct和輸出門控信息 ot更新當(dāng)前的隱藏狀態(tài)ht。式(2)~(7)為L(zhǎng)STM的完整前向傳播過程,其中Wf、Wi、Wo、Wc都是需要進(jìn)行訓(xùn)練的權(quán)值參數(shù)。
本文采用與Char RNN模型類似的訓(xùn)練方式對(duì)音樂生成系統(tǒng)進(jìn)行訓(xùn)練。其主要訓(xùn)練思想可以概括為
式中:x 為輸入序列;a為預(yù)測(cè)的序列,但時(shí)間維度向后推一個(gè)時(shí)間步;f為生成模型的計(jì)算過程。通過將目標(biāo)序列,也就是推后一個(gè)時(shí)間步的輸入序列,與輸出序列 a進(jìn)行按時(shí)間位比較得出差值,作為生成網(wǎng)絡(luò)的訓(xùn)練優(yōu)化目標(biāo)。
基于上文對(duì)音樂生成網(wǎng)絡(luò)訓(xùn)練思路的分析,得 到訓(xùn)練數(shù)據(jù)結(jié)構(gòu)如圖5所示。
圖 5 訓(xùn)練數(shù)據(jù)集結(jié)構(gòu)Fig. 5 Structure of training data
根據(jù)BPTT的后向傳播方式,每次都輸入固定時(shí)間步的數(shù)據(jù)對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,訓(xùn)練目標(biāo)即向后推一個(gè)時(shí)間步的輸入數(shù)據(jù)。
本文使用從freemidi.org采集的50首經(jīng)典風(fēng)格的MIDI音樂作為原始訓(xùn)練數(shù)據(jù)。按照第1章的建模方式,將MIDI數(shù)據(jù)轉(zhuǎn)化成Piano Roll矩陣,然后使用棧式自編碼器的編碼器部分,將Piano Roll矩陣的音符狀態(tài)數(shù)據(jù)轉(zhuǎn)化成隱式特征數(shù)據(jù)。最后將數(shù)據(jù)使用圖5的格式建立數(shù)據(jù)集,完成生成系統(tǒng)的訓(xùn)練數(shù)據(jù)預(yù)處理工作。
根據(jù)式(9)和對(duì)音樂隱式特征數(shù)據(jù)的結(jié)構(gòu)分析,音樂生成網(wǎng)絡(luò)的訓(xùn)練可以被認(rèn)為是一個(gè)高維度時(shí)序特征的回歸預(yù)測(cè)問題。因此采用回歸問題常用的均方差代價(jià)函數(shù)為
式中: m 是每次訓(xùn)練時(shí)所用的樣本數(shù);a為輸出的隱式音樂特征序列;y是目標(biāo)隱式音樂特征序列。訓(xùn)練思想是減小根據(jù)前一時(shí)刻的音符狀態(tài)生成的當(dāng)前時(shí)刻的音符狀態(tài)與真實(shí)的音符狀態(tài)間的差異。根據(jù)代價(jià)函數(shù),Tensorflow根據(jù)模型自動(dòng)生成的計(jì)算圖如圖6所示。
圖 6 隱式特征的LSTM生成網(wǎng)絡(luò)Fig. 6 Hidden feature-based LSTM generation network
通過調(diào)節(jié)網(wǎng)絡(luò)中的超參數(shù),得到訓(xùn)練損失值結(jié)果如圖7所示,其中橫坐標(biāo)為訓(xùn)練數(shù)據(jù)分批后的迭代次數(shù);縱坐標(biāo)為根據(jù)式(9)計(jì)算的損失值。
圖 7 訓(xùn)練結(jié)果Fig. 7 Training results
由圖7可以看出,生成網(wǎng)絡(luò)的損失值也有較好的收斂。
完整音樂生成過程如圖8所示。根據(jù)訓(xùn)練好的棧式自編碼器的編碼器部分,可以得到Piano Roll數(shù)據(jù)的隱式音樂特征矩陣。然后傳入LSTM音樂特征生成網(wǎng)絡(luò)生成下一個(gè)時(shí)間步的音樂特征,將新的特征序列和LSTM輸出狀態(tài)作為輸入進(jìn)行下一次的迭代生成,最后再通過解碼器部分,得到最終的音符狀態(tài)向量Piano Roll,完成整個(gè)音樂生成系統(tǒng)的生成過程。生成完成后,將Piano Roll矩陣轉(zhuǎn)化成MIDI音樂。
圖 8 完整音樂生成過程Fig. 8 Process of music composition
為了更好地說明加入隱式特征后的音樂生成效果,本文使用同樣的音樂數(shù)據(jù),在不轉(zhuǎn)換成隱式特征的情況下,直接使用Piano Roll矩陣訓(xùn)練RNN,得到用于對(duì)比的音樂生成模型。評(píng)估模型則選擇使用人工選取的被標(biāo)注為好與不好的音樂數(shù)據(jù)訓(xùn)練出的二分類模型作為評(píng)價(jià)。評(píng)價(jià)方法為:生成同樣的隨機(jī)種子,分別使用基于Piano Roll的多聲部音樂生成模型與基于音樂隱式特征的多聲部音樂生成模型進(jìn)行音樂片段的生成。得到生成樣本各200首,最后使用訓(xùn)練好的音樂評(píng)價(jià)模型對(duì)音樂樣本進(jìn)行評(píng)價(jià)。將標(biāo)簽為好的樣本數(shù)的占比作為音樂生成系統(tǒng)的評(píng)價(jià)標(biāo)準(zhǔn)。最終得到的評(píng)價(jià)結(jié)果如表2所示。
表 2 評(píng)估結(jié)果Table 2 Evaluation results
本文基于隱式特征,通過訓(xùn)練一個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò),搭建針對(duì)相同風(fēng)格音樂的特征提取和音樂創(chuàng)作模型。在一定程度上解決了傳統(tǒng)作曲算法,難以提取音樂中旋律與和弦之間的隱式特征生成的聲部音樂的問題。仿真結(jié)果表明,通過對(duì)音樂的Piano Roll數(shù)據(jù)進(jìn)行壓縮編碼,得到各時(shí)間步音符狀態(tài)的隱式特征,然后以序列預(yù)測(cè)的方式進(jìn)行多聲部音樂的生成,在解決旋律與和弦的搭配問題上有較好的效果。下一步工作將著重于使用深度學(xué)習(xí)算法,基于大數(shù)據(jù)建立音樂特征深度提取模型,從而使得系統(tǒng)可以更好地提取并學(xué)習(xí)音樂樣本特征,提升系統(tǒng)的創(chuàng)作能力。