通過深度學(xué)習(xí)創(chuàng)建一個自動的音樂生成模型
學(xué)習(xí)如何開發(fā)一個自動生成音樂的端到端模型
理解WaveNet架構(gòu)并使用Keras從零開始實(shí)現(xiàn)它
在建立自動音樂生成模型的同時,比較了WaveNet和Long-Short-Term Memory的性能
介紹
“如果我不是物理學(xué)家,我可能會成為音樂家。我經(jīng)常在音樂中思考。我活在音樂的白日夢里。我從音樂的角度來看待我的生活!薄柌亍垡蛩固
我可能不是愛因斯坦先生那樣的物理學(xué)家,但我完全同意他對音樂的看法!我不記得有哪一天我沒有打開音樂播放器。我上下班都伴隨著音樂的旋律,老實(shí)說,它幫助我專注于工作。
我一直夢想著作曲,但卻不懂樂器。直到我遇到了深度學(xué)習(xí),這一切都成了過去。使用某些技術(shù)和框架,我能夠在不了解任何樂理的情況下創(chuàng)作自己的原創(chuàng)音樂樂譜!
這是我最喜歡的專業(yè)項(xiàng)目之一。我結(jié)合了兩個愛好——音樂和深度學(xué)習(xí)——創(chuàng)建了一個自動的音樂生成模型。夢想成真了!
我很高興與你分享我的方法,包括使你也能夠生成原創(chuàng)音樂的全部代碼!首先,我們將快速理解自動音樂生成的概念,然后再深入了解用于執(zhí)行此操作的不同方法。最后,我們將啟用Python并設(shè)計(jì)我們自己的自動音樂生成模型。
目錄
1. 什么是音樂自動生成?
2. 音樂的組成要素是什么?
3. 生成音樂的不同方法
使用WaveNet架構(gòu)
使用Long-Short-Term Memory(LSTM)
4. 實(shí)現(xiàn)——使用python進(jìn)行自動作曲
什么是音樂自動生成?
“音樂是一種藝術(shù),是一種通用的語言!
我把音樂定義為不同頻率的音調(diào)的集合。因此,自動音樂生成是一個用最少的人為干預(yù)來創(chuàng)作一首短曲的過程。
產(chǎn)生音樂最簡單的形式是什么?
這一切都是從隨機(jī)選擇聲音并將它們組合成一段音樂開始的。1787年,莫扎特為這些隨機(jī)聲音的選擇提出了骰子游戲。他手動合成了近272個音調(diào)!然后,他根據(jù)兩個骰子點(diǎn)數(shù)之和選擇一個音調(diào)。
另一個有趣的想法是利用音樂語法來生成音樂。
“音樂語法是指對音樂聲音的合理安排和組合以及對音樂作品的正確表現(xiàn)所必需的知識”
-《音樂語法基礎(chǔ)》
在20世紀(jì)50年代早期,Iannis Xenakis使用統(tǒng)計(jì)學(xué)和概率的概念來創(chuàng)作音樂——通常被稱為隨機(jī)音樂(Stochastic Music)。他將音樂定義為偶然出現(xiàn)的一系列元素(或聲音)。因此,他用隨機(jī)理論來表述它。他對元素的隨機(jī)選擇完全依賴于數(shù)學(xué)概念。
最近,深度學(xué)習(xí)架構(gòu)已經(jīng)成為自動音樂生成的最新技術(shù)。在本文中,我將討論使用WaveNet和LSTM(Long-Short-Term Memory)架構(gòu)來實(shí)現(xiàn)自動作曲的兩種不同方法。
注意:本文需要對一些深度學(xué)習(xí)概念有基本的理解。我建議閱讀以下文章:
從頭開始學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)(CNNs)的全面教程
https://www.analyticsvidhya.com/blog/2018/12/guide-convolutional-neural-network-cnn/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
深度學(xué)習(xí)要領(lǐng):長短期記憶(LSTM)入門
https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
學(xué)習(xí)序列建模的必讀教程
https://www.analyticsvidhya.com/blog/2019/01/sequence-models-deeplearning/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
音樂的組成要素是什么?
音樂本質(zhì)上是由音符和和弦組成的。讓我從鋼琴的角度來解釋這些術(shù)語:
音符:單鍵發(fā)出的聲音稱為音符
和弦:由兩個或更多的鍵同時發(fā)出的聲音稱為和弦。一般來說,大多數(shù)和弦包含至少3個鍵音
八度:重復(fù)的模式稱為八度。每個八度包含7個白鍵和5個黑鍵
自動生成音樂的不同方法
我將詳細(xì)討論兩個基于深度學(xué)習(xí)的自動生成音樂的架構(gòu)——WaveNet和LSTM。但是,為什么只有深度學(xué)習(xí)架構(gòu)?
深度學(xué)習(xí)是一個受神經(jīng)結(jié)構(gòu)啟發(fā)的機(jī)器學(xué)習(xí)領(lǐng)域。這些網(wǎng)絡(luò)自動從數(shù)據(jù)集中提取特征,并能夠?qū)W習(xí)任何非線性函數(shù)。這就是為什么神經(jīng)網(wǎng)絡(luò)被稱為泛函逼近器(感覺泛函在數(shù)學(xué)上的定義不適合這里,網(wǎng)上也有人翻譯為 萬能函數(shù)擬逼近器,因?yàn)樽钤缬幸黄P(guān)于 Universal Approximation Theorem的論文)。
因此,深度學(xué)習(xí)模型是自然語言處理(NLP)、計(jì)算機(jī)視覺、語音合成等各個領(lǐng)域的最新技術(shù)。讓我們來看看如何構(gòu)建這些作曲模型。
方法一:使用WaveNet
“WaveNet是谷歌DeepMind開發(fā)的一種基于深度學(xué)習(xí)的原始音頻生成模型!
WaveNet的主要目的是從原始的數(shù)據(jù)分布中生成新的樣本。因此,它被稱為生成模型。
“WaveNet就像是NLP中的一種語言模型!
在語言模型中,給定一個單詞序列,該模型試圖預(yù)測下一個單詞。與語言模型類似,在WaveNet中,給定一系列樣本,它試圖預(yù)測下一個樣本。
方法二:使用Long-Short-Term Memory(LSTM)模型
Long-Short-Term Memory (LSTM)是遞歸神經(jīng)網(wǎng)絡(luò)(RNNs)的一種變體,能夠捕獲輸入序列中的長期依賴關(guān)系。LSTM在序列到序列(Seq2Seq)建模任務(wù)中有廣泛的應(yīng)用,如語音識別、文本摘要、視頻分類等。
讓我們詳細(xì)討論如何使用這兩種方法訓(xùn)練我們的模型。
WaveNet:訓(xùn)練階段
“這是一個多對一的問題,其中輸入是一系列振幅值,輸出是后續(xù)值!
讓我們看看如何準(zhǔn)備輸入和輸出序列。
WaveNet的輸入:
WaveNet將原始音頻波的小塊作為輸入。原始音頻波是指波在時間序列域中的表示。
在時間序列域中,音頻波以不同時間間隔音符的振幅值的形式表示:
WaveNet的輸出:
給定振幅值的序列,WaveNet試圖預(yù)測連續(xù)的振幅值。
讓我們通過一個示例來理解?紤]一個5秒的音頻波,采樣率為16,000(即每秒16,000個樣本)。現(xiàn)在,我們有8萬個樣本在5秒內(nèi)以不同的時間間隔記錄下來。讓我們把音頻分成相同大小的塊,比如1024(這是一個超參數(shù))。
下圖展示了模型的輸入和輸出序列:
前3個塊的輸入和輸出
對于其余的塊,我們可以遵循類似的過程。
從上面我們可以推斷出,每個塊的輸出只依賴于過去的信息(即以前的時間步長),而不依賴于未來的時間步長。因此,該任務(wù)稱為自回歸任務(wù),該模型稱為自回歸模型。
推理階段
在推理階段,我們將嘗試生成新的樣本。讓我們看看怎么做:
1. 選擇一個隨機(jī)的樣本值數(shù)組作為建模的起點(diǎn)
2. 現(xiàn)在,模型輸出所有樣本的概率分布
3. 選擇概率最大的值并將其追加到先前的樣本值數(shù)組中
4. 刪除第一個元素并作為下一個迭代的輸入傳入模型
5. 重復(fù)步驟2和4,進(jìn)行一定次數(shù)的迭代
理解WaveNet架構(gòu)
WaveNet的基本結(jié)構(gòu)是因果擴(kuò)散的一維卷積層。首先讓我們了解相關(guān)概念的重要性。
為什么使用卷積,什么是卷積?
“使用卷積的一個主要原因是從輸入中提取特征!
例如,在圖像處理的情況下,用過濾器對圖像進(jìn)行卷積可以得到一個特征圖。
卷積是一種結(jié)合了兩個函數(shù)的數(shù)學(xué)運(yùn)算。在圖像處理的情況下,卷積是圖像的某些部分與核(kernel)的線性組合。
你可以瀏覽下面的文章閱讀更多關(guān)于卷積的知識:
卷積神經(jīng)網(wǎng)絡(luò)(CNNs)結(jié)構(gòu)的解密
https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/?utm_source=blog&utm_medium=how-to-perform-automatic-music-generation
什么是一維卷積?
一維卷積的目標(biāo)類似于長短期記憶模型。它用于解決類似于LSTM的任務(wù)。在一維卷積中,核或者叫過濾器只沿著一個方向運(yùn)動:
卷積的輸出取決于核的大小、輸入形狀、填充類型和步長,F(xiàn)在,我將帶領(lǐng)你們了解不同類型的填充來理解使用擴(kuò)張的1D因果卷積層的重要性。
當(dāng)我們將填充設(shè)置為valid時,輸入和輸出序列的長度會發(fā)生變化。輸出長度小于輸入長度:
當(dāng)我們將填充設(shè)置為same時,在輸入序列的兩側(cè)填充零以使輸入和輸出的長度相等:
一維卷積的優(yōu)點(diǎn):
捕獲輸入序列中出現(xiàn)的序列信息
與GRU或LSTM相比,訓(xùn)練的速度要快得多,因?yàn)樗鼈儧]有循環(huán)性的連接
一維卷積的缺點(diǎn):
當(dāng)填充設(shè)置為same時,在時間步長t處的輸出也與之前的t-1和未來的時間步長t+1進(jìn)行卷積。因此,它違反了自回歸原則
當(dāng)填充被設(shè)置為valid時,輸入和輸出序列的長度會發(fā)生變化,這是計(jì)算殘差連接所需要的(后面會講到)
這為因果卷積掃清了道路。
注意: 我在這里提到的利弊是針對于此問題的。
什么是一維因果卷積?
它被定義為這樣一種卷積,即t時刻的輸出僅與t時刻以及前一層更早的元素進(jìn)行卷積。
簡單地說,正常卷積和因果卷積的區(qū)別僅僅在于填充。在因果卷積中,僅在輸入序列的左邊加0,以保持自回歸的原則:
因果一維卷積的優(yōu)點(diǎn):
因果卷積沒有考慮未來的時間步長,而這是建立生成模型的一個標(biāo)準(zhǔn)
因果一維卷積的缺點(diǎn):
因果卷積不能回溯到序列中過去發(fā)生的時間步長。因此,因果卷積的接受域非常低。網(wǎng)絡(luò)的接受域是指影響輸出的輸入數(shù)量:
如你所見,輸出只受5個輸入的影響。因此,網(wǎng)絡(luò)的接受域?yàn)?,非常低。網(wǎng)絡(luò)的接受域也可以通過增加大尺寸的核來增加,但是要記住,這樣一來計(jì)算復(fù)雜度也會增加。
這將為我們引出擴(kuò)張一維因果卷積的絕佳概念。
什么是擴(kuò)張一維因果卷積?
“在核的值之間有孔或空缺的因果一維卷積層稱為擴(kuò)張的一維卷積!
所增加的空缺數(shù)由擴(kuò)張率決定。它定義了網(wǎng)絡(luò)的接受域。大小為k、擴(kuò)張率為d的核在核k的每個值之間都有d-1個孔。
如你所見,將一個3 * 3的核與一個7 * 7的輸入,以擴(kuò)張率為2進(jìn)行卷積,最終接受域?yàn)? * 5。
擴(kuò)張一維因果卷積的優(yōu)點(diǎn):
擴(kuò)張的一維卷積網(wǎng)絡(luò)通過指數(shù)增加每一隱藏層的擴(kuò)張率來增加接受域:
如你所見,輸出受所有輸入的影響。因此,網(wǎng)絡(luò)的接受域?yàn)?6。
WaveNet的殘差塊:
為了加速模型的收斂,添加了殘差連接和跳躍連接的構(gòu)件:
WaveNet的工作流程:
輸入進(jìn)入一個因果一維卷積
輸出然后進(jìn)入到2個不同的擴(kuò)張一維卷積層并使用sigmoid和tanh激活
兩個不同激活值逐元素相乘導(dǎo)致跳躍連接
而跳躍連接和因果一維輸出的逐元素相加會導(dǎo)致殘差
Long Short Term Memory (LSTM)方法
另一種自動生成音樂的方法是基于長短期記憶(LSTM)模型。輸入和輸出序列的準(zhǔn)備類似于WaveNet。在每一個時間步長,一個振幅值被輸入到長短期記憶單元-然后它計(jì)算隱藏的向量,并把它傳遞到下一個時間步。
基于當(dāng)前的輸入a(t)和先前的隱藏向量h(t-1)來計(jì)算當(dāng)前時間的隱藏向量h(t)。序列信息在任何循環(huán)(一般recursive會翻譯為遞歸)神經(jīng)網(wǎng)絡(luò)中都是這樣捕獲的:
LSTM的優(yōu)點(diǎn):
捕獲輸入序列中出現(xiàn)的順序信息
LSTM的缺點(diǎn):
由于它是按順序處理輸入信息的,所以它在訓(xùn)練上會花費(fèi)大量的時間
實(shí)現(xiàn)-使用Python進(jìn)行自動音樂生成
等待結(jié)束了!讓我們開發(fā)一個用于自動生成音樂的端到端模型。啟動你的Jupyter
notebook或Colab(或任何你喜歡的IDE)。
下載數(shù)據(jù)集:
我從眾多資源中下載并組合了多個數(shù)字鋼琴(譯者注:Digital piano與電鋼琴Electric Piano的區(qū)別在于音源的產(chǎn)生方式)的古典音樂文件。你可以從這里下載最終的數(shù)據(jù)集。
(https://drive.google.com/file/d/1qnQVK17DNVkU19MgVA4Vg88zRDvwCRXw/view)
導(dǎo)入庫:
Music 21是MIT開發(fā)的用于理解音樂數(shù)據(jù)的Python庫。MIDI是存儲音樂文件的一種標(biāo)準(zhǔn)格式。MIDI代表樂器數(shù)字接口。MIDI文件包含說明而不是實(shí)際的音頻。因此,它只占用很少的內(nèi)存。這就是為什么它在傳輸文件時通常是首選的。
中音在線:在線音樂學(xué)習(xí)門戶