苗北辰,郭為安,汪鐳
(1. 同濟大學 電子與信息工程學院,上海 201804; 2. 同濟大學 中德學院,上海 201804)
音樂生成是使用算法將音樂創作過程的部分或全部自動化的研究。使用數學的方式研究音樂的生成雖然在一千年前就已出現,但受限于其他相關學科的發展,一直沒有較大的進步。而近年來,隨著深度學習的不斷發展,音樂生成問題重新回到研究者們的視野中,與之相關的多種算法模型也都被應用于音樂生成問題的研究。特別是Char RNN模型的提出,以序列預測的方式訓練生成網絡的研究變得火熱。Eck等[1]首次將LSTM引入音樂生成領域,基于前序音符生成后序音符的思想,搭建了藍調旋律的生成系統。Sturm等[2]使用音樂的ABC格式文本作為訓練數據,率先將Char RNN模型引入音樂生成領域,對音符文本進行one hot編碼,使用當前音符的編碼向量,預測下一個音符的概率分布,然后采樣生成下一個字符,最終生成質量較好的音樂旋律。區別于ABC格式的旋律文本數據,Choi等[3]通過將旋律與和弦一起編碼成文本數據,然后使用Char RNN模型生成了擁有和弦的多聲部音樂。王程等[4]通過將音樂的音頻數據編碼成與文本類似的one hot向量,然后使用Char RNN進行音樂的生成。Lackner[5]則通過將音樂中的和弦和旋律分離的形式,使用和弦去預測旋律對Char RNN進行訓練,通過輸入人工創作的和弦來生成相應的旋律[5]。Chu等[6]提出了分層RNN結構的音樂生成系統,在系統底層生成音符,在更高層生成和弦及鼓節奏,通過將更多樂理知識引入神經網絡的訓練中,生成了結構良好的音樂作品。Makris等[7]提出了使用RNN生成節奏序列,用于生成變節奏的音樂作品。Oord等[8]提出的WaveNet用于生成原始的音頻格式音樂,該網絡使用音頻壓縮后的數據進行訓練,表述為16位的整數值序列,與前人不同的是,他們使用卷積神經網絡來搭建系統。Mogren[9]使用兩個RNN作為生成對抗網絡的生成器和判別器,音樂數據模型則采用了類似MIDI數據Event事件的編碼方式。
綜上所述,可以看出目前音樂生成的研究成果主要集中在旋律的生成研究上,考慮旋律與和弦搭配的多聲部音樂生成的研究并不是很多,本文將從多聲部音樂數據的建模方式以及生成模型的訓練策略兩個方向進行研究,嘗試搭建多聲部音樂的生成系統。
音樂數據是一種結構非常復雜的時序數據。要使用算法的方式進行音樂數據的生成,首先要理解音樂數據的結構特征和音樂信息的表達方式。本文基于現代音樂常用的表達方式,即采用MIDI格式和Piano Roll格式分析多聲部音樂的特點,建立音樂數據模型。
MIDI(音樂數字接口)是一種描述計算機數字接口與各種樂器連接協議的技術標準。與ABC等文本格式相比,MIDI所攜帶的信息量更大,現代音樂基本都是用MIDI制作合成。它的基本思想是將不同音高和音長組合的音符信息表示成一個個的事件(Event),同時還攜帶音符的音量和起始時間等信息,量化了音樂的基本特征,并將音樂演奏中的每種樂器表示為一個通道(channel),記錄每種樂器的音符彈奏的方式。MIDI的事件信息有很多類型,由于本文主要聚焦于音樂本身的表達,所以此處只介紹與音樂生成系統相關的基本事件。MIDI的基本音符事件有2種:Note on事件和Note off事件。Note on事件表示一個具有某種音高、音長的音符在某個通道開始被特定樂器彈奏,如
Piano Roll表示方法是受自動鋼琴的啟發,它的實質是一個連續的紙卷,通過在上面進行穿孔來記錄信息。每個穿孔代表一個音符控制信息,用于觸發給定的音符。穿孔的長度對應音符的持續時間,穿孔的定位與其間隔相對應,每一列的穿孔表示鋼琴中的每一個琴鍵。
本文所研究的是多聲部音樂的生成問題,因此多聲部音樂數據的表示方式至關重要。根據上文對MIDI格式和Piano Roll格式的介紹,可以較為容易地設計一種多聲部音樂的表達方式,即使用0和1組成的矩陣表示多聲部音樂中每個音符的狀態信息,其中行表示鋼琴中的88個鍵,也是鋼琴所能表示的音高范圍,列則表示時間序列。1表示琴鍵被按下,0表示琴鍵被彈起。但這種方式有1個缺陷,即在出現一連串的1時,無法分辨出是被多次彈奏還是一個持續較長的音。所以可以結合MIDI格式的Note on和Note off事件思想,將原有的鋼琴鍵維度88擴展成176。使用前88維的1表示琴鍵被按下,也就是Note on事件,使用后88維的1表示琴鍵被彈起,也就是Note off事件,如圖1所示。

圖 1 MIDI與Piano Roll相互轉化Fig. 1 Translation between MIDI and Piano Roll
這種方式不僅可以有效區分長音和多次彈奏,且方便MIDI音樂數據與Piano Roll矩陣的相互轉化。但通過實踐發現這種多聲部音樂的建模方式雖然可以用同一時刻鋼琴鍵狀態向量表示旋律與和弦的彈奏狀態,但無法表征旋律與和弦在時間維度上的匹配信息,即各音符之間是獨立表達的。
根據前文的研究分析,本文認為使用原始Piano Roll格式進行多聲部音樂數據的表達方式,并不能表現旋律與和弦更高維度的組合特征?;诖耍疚奶岢鍪褂脤ν粫r間步音符狀態壓縮的方式,提取各音符狀態之間的關系作為音樂的隱式特征,并以此作為多聲部音樂的數據模型。
自編碼器(autoencoder)是一種具有一層隱藏層的神經網絡,其特殊的結構在于:網絡的輸入層與輸出層的神經元節點數目相同,且隱藏層的節點數要小于輸入與輸出層。在訓練自編碼器時,可以使用傳統的神經網絡訓練方式。唯一不同的是,訓練自編碼器的輸入數據就是要輸出的目標數據。因此自編碼器學習的是一種數據的表示功能。因為隱藏層的節點要比輸入層的節點少,所以編碼器部分必須對信息進行有損壓縮,而解碼器部分則需要根據壓縮后的特征信息盡可能地重構原始的信息。這就迫使自編碼器去發現數據中重要的區分點,所以自編碼器通常用于提取數據中更高維度的特征。
隨著深度學習的出現,棧式自編碼器(stacked autoencoder)得到了更廣泛的應用。棧式自編碼器是由多個自編碼器嵌套組成,且隱藏層的神經元數目依次遞減。在這種結構中,編碼器會不斷地壓縮數據以提取出更高級別的特征。因此這種類似深度神經網絡的結構,是現在常用的特征提取手段之一。
通過對現有特征提取方法的比較,本文決定采用棧式自編碼器對多聲部音樂的Piano Roll格式數據進行隱式特征提取。
本文使用從freemidi.org采集的50首MIDI格式的音樂數據進行棧式自編碼器訓練。通過1.2節介紹的Piano Roll格式與MIDI數據的轉化關系,提取50首音樂的Piano Roll矩陣。在實驗中發現,由于提取的音樂數據風格相似,音樂的音高都在24~102。通俗地講,鋼琴的88個鍵中只被用到了中間的78個鍵。為了降低計算復雜度,本文將原有的176維的Piano Roll矩陣減少到156維,根據此格式的音樂數據搭建棧式自編碼器 ,如圖2所示。

圖 2 自編碼器結構Fig. 2 Structure of the autoencoder
棧式自編碼器的輸入層和輸出層的神經元節點均為Piano Roll的鋼琴鍵維度156。而對于隱藏層,則需先設計一個比輸入輸出層節點數目小的節點數,通過后續訓練實踐,逐一調整。
根據前文分析,本文所要搭建的棧式自編碼器是對Piano Roll矩陣的每個156維的0、1向量進行特征提取。經過解碼器后,應生成與輸入向量相同的輸出結果。所以本文采用訓練網絡的代價函數為均方差代價函數,即

式中:a 為網絡的輸出結果;y為目標值,即輸入向量;m為每一次訓練的樣本數目。本文使用Tensorflow搭建此模型,根據模型Tensorflow自動生成的計算 圖如圖3所示。

圖 3 棧式自編碼器計算圖Fig. 3 Computational graph of the stacked autoencoder
使用freemidi.org的50首MIDI音樂提取的Piano Roll矩陣對網絡進行訓練,通過調整網絡超參數得到訓練結果如圖4所示,其中橫坐標為訓練數據分批后的迭代次數,縱坐標為根據式(1)計算的損失值。

圖 4 訓練結果Fig. 4 Training results
為測試該自編碼器在訓練數據集以外的音樂數據中的特征提取效果,使用另外4首相同風格的MIDI音樂對網絡進行測試。將音樂的音符狀態數據進行編解碼,比較網絡的輸出值與真實值,準確度如表1所示。

表 1 棧式自編碼器的泛化結果Table 1 Generalization results of the stacked autoencoder %
從表1可以看出,本小節訓練的棧式自編碼器在這一風格的音樂數據中,編碼后解碼的準確率較高,可以理解為編碼器提取到了較好的隱式音樂特征。通過使用棧式自編碼器的編碼器部分,對音樂數據的Piano Roll矩陣進行隱式特征提取,即得到了本文所要使用的多聲部音樂數據模型。
經網
R絡N的N基是礎全上連,接將神隱經藏網層絡的的節擴點展進,行在連全接連[1接0],神即每一個隱藏層節點的輸入不再只是前一層節點的輸出,同時還包括本節點在上個時刻的隱藏狀態h。RNN因其特殊的結構,在進行后向傳播訓練時與全連接神經網絡有所不同。在訓練RNN的過程中,通常采用一種特殊的學習方法,即BPTT(back propagation through time)算法。RNN的輸入和輸出可以被理解成一個序列。因此,在進行后向傳播訓練的時候可以將節點按時間序列進行展開,得到一個類似全連接神經網絡的結構,在展開的結構上使用截斷的序列進行后向傳播訓練。在經典RNN的基礎上,Hochreiter等[11]提出了長短期記憶循環神經網絡 (LSTM),在眾多序列問題中得到了廣泛的應用。除了隱藏狀態 h值以外,LSTM在節點的內部還儲存細胞狀態(cell state)C值,用來表示信息的長期依賴和更新,并且添加了3個門結構來控制節點狀態的更新大小。具體計算公式如下:

3個門的結果都由輸入 xt與前一時刻的隱藏狀態 ht-1得 到。第1個門是忘記門f,決定在當前時刻要從過去的 C值丟棄多少信息。第2個門是輸入門i ,決定在當前時刻將多少信息存入 C 值。要加入的新信息用符號 C?t表示。根據忘記門和輸入門的控制系數,以及要加入細胞的新信息,更新當前的細胞狀態得到 Ct。第3個門是輸出門o,根據當前時刻的細胞狀態 Ct和輸出門控信息 ot更新當前的隱藏狀態ht。式(2)~(7)為LSTM的完整前向傳播過程,其中Wf、Wi、Wo、Wc都是需要進行訓練的權值參數。
本文采用與Char RNN模型類似的訓練方式對音樂生成系統進行訓練。其主要訓練思想可以概括為

式中:x 為輸入序列;a為預測的序列,但時間維度向后推一個時間步;f為生成模型的計算過程。通過將目標序列,也就是推后一個時間步的輸入序列,與輸出序列 a進行按時間位比較得出差值,作為生成網絡的訓練優化目標。
基于上文對音樂生成網絡訓練思路的分析,得 到訓練數據結構如圖5所示。

圖 5 訓練數據集結構Fig. 5 Structure of training data
根據BPTT的后向傳播方式,每次都輸入固定時間步的數據對網絡進行訓練,訓練目標即向后推一個時間步的輸入數據。
本文使用從freemidi.org采集的50首經典風格的MIDI音樂作為原始訓練數據。按照第1章的建模方式,將MIDI數據轉化成Piano Roll矩陣,然后使用棧式自編碼器的編碼器部分,將Piano Roll矩陣的音符狀態數據轉化成隱式特征數據。最后將數據使用圖5的格式建立數據集,完成生成系統的訓練數據預處理工作。
根據式(9)和對音樂隱式特征數據的結構分析,音樂生成網絡的訓練可以被認為是一個高維度時序特征的回歸預測問題。因此采用回歸問題常用的均方差代價函數為

式中: m 是每次訓練時所用的樣本數;a為輸出的隱式音樂特征序列;y是目標隱式音樂特征序列。訓練思想是減小根據前一時刻的音符狀態生成的當前時刻的音符狀態與真實的音符狀態間的差異。根據代價函數,Tensorflow根據模型自動生成的計算圖如圖6所示。

圖 6 隱式特征的LSTM生成網絡Fig. 6 Hidden feature-based LSTM generation network
通過調節網絡中的超參數,得到訓練損失值結果如圖7所示,其中橫坐標為訓練數據分批后的迭代次數;縱坐標為根據式(9)計算的損失值。

圖 7 訓練結果Fig. 7 Training results
由圖7可以看出,生成網絡的損失值也有較好的收斂。
完整音樂生成過程如圖8所示。根據訓練好的棧式自編碼器的編碼器部分,可以得到Piano Roll數據的隱式音樂特征矩陣。然后傳入LSTM音樂特征生成網絡生成下一個時間步的音樂特征,將新的特征序列和LSTM輸出狀態作為輸入進行下一次的迭代生成,最后再通過解碼器部分,得到最終的音符狀態向量Piano Roll,完成整個音樂生成系統的生成過程。生成完成后,將Piano Roll矩陣轉化成MIDI音樂。

圖 8 完整音樂生成過程Fig. 8 Process of music composition
為了更好地說明加入隱式特征后的音樂生成效果,本文使用同樣的音樂數據,在不轉換成隱式特征的情況下,直接使用Piano Roll矩陣訓練RNN,得到用于對比的音樂生成模型。評估模型則選擇使用人工選取的被標注為好與不好的音樂數據訓練出的二分類模型作為評價。評價方法為:生成同樣的隨機種子,分別使用基于Piano Roll的多聲部音樂生成模型與基于音樂隱式特征的多聲部音樂生成模型進行音樂片段的生成。得到生成樣本各200首,最后使用訓練好的音樂評價模型對音樂樣本進行評價。將標簽為好的樣本數的占比作為音樂生成系統的評價標準。最終得到的評價結果如表2所示。

表 2 評估結果Table 2 Evaluation results
本文基于隱式特征,通過訓練一個循環神經網絡,搭建針對相同風格音樂的特征提取和音樂創作模型。在一定程度上解決了傳統作曲算法,難以提取音樂中旋律與和弦之間的隱式特征生成的聲部音樂的問題。仿真結果表明,通過對音樂的Piano Roll數據進行壓縮編碼,得到各時間步音符狀態的隱式特征,然后以序列預測的方式進行多聲部音樂的生成,在解決旋律與和弦的搭配問題上有較好的效果。下一步工作將著重于使用深度學習算法,基于大數據建立音樂特征深度提取模型,從而使得系統可以更好地提取并學習音樂樣本特征,提升系統的創作能力。